File size: 11,647 Bytes
48097ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
# -*- coding: utf-8 -*-
"""์‹œ์ฆŒ ๋“ฑ๋ก๋ถ€. ์‹œ์ฆŒ๋งˆ๋‹ค ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์€ ์ „๋ถ€ ์—ฌ๊ธฐ ์žˆ๊ณ  ๋‹ค๋ฅธ ๊ณณ์—๋Š” ์—†๋‹ค.



ODC์™€ ๊ฐ™์€ ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค. ์‹œ์ฆŒ๋ณ„ ๊ทœ์น™์€ ๊ณต์œ ํ•˜์ง€ ์•Š๊ณ  ์‹œ์ฆŒ๋งˆ๋‹ค ๋˜ํ’€์ดํ•ด ์ ๋Š”๋‹ค.

์‹œ์ฆŒ 2์—๋Š” ์‹œ์ฆŒ 1์—์„œ ๋ฐœ๊ฒฌํ•œ ๊ฒฐํ•จ์˜ ๊ต์ •์ด ๋“ค์–ด๊ฐ€๋Š”๋ฐ, ๊ทธ ๊ต์ •์ด ์‹œ์ฆŒ 1์—

๋‹ฟ์•„์„œ๋Š” ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‹œ์ฆŒ 1 ์ฐธ๊ฐ€์ž๋Š” ์ด๋ฏธ ๊ณต๊ฐœ๋œ ๊ทœ์น™ ์•„๋ž˜ ์ฑ„์ ๋๋‹ค.



์‹œ์ฆŒ 1๊ณผ 2๋Š” ๊ฒน์ณ ๋Œ์•„๊ฐ„๋‹ค. ๊ทธ๋ž˜์„œ '์ง€๊ธˆ ์‹œ์ฆŒ'์€ ์ƒ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋ผ ์กฐํšŒ๋‹ค.



์ •๊ทœํ™” ๊ณ„์ˆ˜(์šด์˜ ํ•œ๊ณ„์„ )์˜ ๊ทผ๊ฑฐ ์ˆ˜์น˜๋Š” calibrate.py๊ฐ€ ์‚ฐ์ถœํ•ด luck_ceiling.json์—

๋„ฃ๋Š”๋‹ค. ๊ฐœ๋ง‰ ์ „ ๋ฐ์ดํ„ฐ๋กœ๋งŒ ๊ณ„์‚ฐํ•˜๊ณ  ์‹œ์ฆŒ ์ค‘์—๋Š” ์žฌ๊ณ„์‚ฐํ•˜์ง€ ์•Š๋Š”๋‹ค.

"""

SEASONS = {
    1: {
        "name": "์‹œ์ฆŒ 1 ยท ๋„ค ๊ฐœ์˜ ์‹œ์žฅ",
        "opens": "2026-08-24",
        "closes": "2026-12-24",
        # ์„ฑ๊ฒฉ์ด ๊ฐˆ๋ฆฌ๋Š” ๋„ค ์‹œ์žฅ. ์„œ๋กœ ๊ฑฐ์˜ ๋ฌด์ƒ๊ด€์ด๋ผ(-0.04 ~ 0.19) ์ฐธ๊ฐ€์ž๊ฐ€ ํฉ์–ด์ง„๋‹ค.
        # ๋„์ง€์ฝ”์ธ์€ ๋น„ํŠธ์ฝ”์ธ๊ณผ ์ƒ๊ด€ 0.763, ๋ฐ˜๋„์ฒดETF๋Š” ์—”๋น„๋””์•„์™€ 0.797์ด๋ผ ๋บ๋‹ค.
        # ๋‘ ์ข…๋ชฉ์ด ์‚ฌ์‹ค์ƒ ํ•˜๋‚˜๊ฐ€ ๋˜๋ฉด 4์ข…๋ชฉ์ด 3์ข…๋ชฉ์ด ๋œ๋‹ค.
        #
        #   AI๊ฐ€ ๋งŒ๋“  ๊ฒƒ    ์—”๋น„๋””์•„  โ†•  ์ธ๊ฐ„์ด ์˜ค๋ž˜ ๋ฏฟ์€ ๊ฒƒ   ๊ธˆ
        #   AI๊ฐ€ ํ”๋“  ๊ฒƒ    ๋น„ํŠธ์ฝ”์ธ  โ†•  ์„ธ์ƒ์„ ๊ตด๋ ค์˜จ ๊ฒƒ     ์œ ๊ฐ€
        #
        # ๐Ÿ”ด ์—”๋น„๋””์•„ ์‹ค์ ์ด ๊ฐœ๋ง‰ ์ดํ‹€ ๋’ค(8/26)๋‹ค. ์‹ค์ ์ผ ๋ณ€๋™์€ ํ‰์ƒ์ผ์˜ 2.7๋ฐฐ์ด๊ณ 
        #    87%๊ฐ€ ์‹œ๊ฐ€ ๊ฐญ์ด๋ผ ์žฅ์ค‘ ๋Œ€์‘์ด ์•ˆ ๋œ๋‹ค. ๋ชจ๋‘์—๊ฒŒ ๊ฐ™์€ ์กฐ๊ฑด์ด์ง€๋งŒ
        #    ์ดˆ๋ฐ˜ ์ˆœ์œ„์— ์šด์ด ํฌ๊ฒŒ ์„ž์ธ๋‹ค๋Š” ์ ์€ ์ฐธ๊ฐ€ ์•ˆ๋‚ด์— ๋ช…์‹œํ•œ๋‹ค.
        "assets": {
            "NVDA": {"label": "์—”๋น„๋””์•„", "cat": "stock", "vol": 0.514,
                     "why": "AI ๊ทธ ์ž์ฒด. ์ด ์‹œ์žฅ์„ ์˜ˆ์ธกํ•˜๋Š” ๊ฒƒ์ด ์ด ๋Œ€ํšŒ์˜ ์ƒ์ง•",
                     "src": "NVDA", "hours": "rth",
                     "anchor": {1: 0.781, 5: 0.772, 21: 0.780}},
            "BTC": {"label": "๋น„ํŠธ์ฝ”์ธ", "cat": "coin", "vol": 0.392,
                    "why": "AI๊ฐ€ ํ”๋“  ์ƒˆ ํ™”ํ. 24์‹œ๊ฐ„ ๊ฑฐ๋ž˜ยทํœด์žฅ ์—†์Œ",
                    "src": "BTC-USD", "hours": "24h",
                    "anchor": {1: 0.807, 7: 0.801, 30: 0.757}},
            "GOLD": {"label": "๊ธˆ", "cat": "commodity", "vol": 0.212,
                     "why": "์ธ๋ฅ˜๊ฐ€ 5,000๋…„ ๋ฏฟ์–ด์˜จ ๊ฐ€์น˜. ๋ฐฉํ–ฅ์ด ์—†์–ด ์šด์œผ๋กœ ๋ฒŒ๊ธฐ ๊ฐ€์žฅ ์–ด๋ ต๋‹ค",
                     # ๐Ÿ”ด ์„ ๋ฌผ(GC=F)์ด ์•„๋‹ˆ๋ผ ETF๋ฅผ ์“ด๋‹ค. GC=F๋Š” ์›”๋ง ์ด์ƒ์ ํ”„๊ฐ€
                     #    ์ •์ƒ์˜ 2.4๋ฐฐ๋กœ, ๋กค ์‹œ์  ๊ฐ€๊ฒฉ์ฐจ๊ฐ€ ์ˆ˜์ต๋ฅ ์— ์„ž์—ฌ ๋“ ๋‹ค.
                     "src": "GLD", "hours": "rth",
                     "anchor": {1: 0.748, 5: 0.762, 21: 0.744}},
            "OIL": {"label": "์œ ๊ฐ€", "cat": "commodity", "vol": 0.369,
                    "why": "์„ธ์ƒ์„ ๊ตด๋ ค์˜จ ์‚ฐ์—…์˜ ์‹ฌ์žฅ. AI๋Š” ์˜› ์‹œ์žฅ๋„ ์˜ˆ์ธกํ•˜๋Š”๊ฐ€",
                    # ๐Ÿ”ด CL=F๋Š” 3๋…„ ์ˆ˜์ต์ด +10%์ธ๋ฐ USO๋Š” +89%๋‹ค. 79%p ๊ดด๋ฆฌ๋Š”
                    #    ๊ทผ์›”๋ฌผ์„ ์ด์–ด๋ถ™์ผ ๋•Œ ์ƒ๊ธฐ๋Š” ๋กค ์™œ๊ณก์ด๋‹ค. ์ฐธ๊ฐ€์ž๊ฐ€ ์‹ค์ œ๋กœ
                    #    ๋‚ผ ์ˆ˜ ์—†๋Š” ์†์ต์ด๋ผ ETF๋ฅผ ์“ด๋‹ค.
                    "src": "USO", "hours": "rth",
                    "anchor": {1: 0.782, 5: 0.780, 21: 0.804}},
        },
        "prize_usd_per_asset": 500,
        "prize_total_usd": 2000,
        "prize_rule": "์ข…๋ชฉ๋ณ„ ์ตœ์ข… ์ˆ˜์ต๋ฅ  1์œ„์—๊ฒŒ ๊ฐ 500๋‹ฌ๋Ÿฌ. ์ด 2,000๋‹ฌ๋Ÿฌ",
        # ์ข…๋ชฉ ๊ฐ„ ์ˆ˜์ต๋ฅ ์„ ์ง์ ‘ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์€ ํ๊ธฐํ–ˆ๋‹ค. ๋„ค ๋ฒˆ ๊ณ ์ณ๋„ ํŽธ์ค‘์ด
        # ์žกํžˆ์ง€ ์•Š์•˜๋‹ค(4.7๋ฐฐ -> 99.6๋ฐฐ -> 3.7๋ฐฐ -> 6.0๋ฐฐ). ๋ถ„ํฌ ๋ชจ์–‘์ด ์ข…๋ชฉ๋งˆ๋‹ค
        # ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ฌ๋ผ, ์–ด๋А ํ•œ ํ†ต๊ณ„๋Ÿ‰์„ ๋งž์ถ”๋ฉด ๋‹ค๋ฅธ ์ง€์ ์ด ์–ด๊ธ‹๋‚œ๋‹ค.
        # ์ข…๋ชฉ๋ณ„ ์‹œ์ƒ์€ ๊ทธ ๋น„๊ต ์ž์ฒด๋ฅผ ์—†์•ค๋‹ค. ํ†ตํ•ฉ ์ˆœ์œ„๋Š” ์ฐธ๊ณ  ํ‘œ์‹œ๋กœ๋งŒ ๋‘”๋‹ค.
        "leverage": 1.0,
        "min_participation": 0.70,
        "update": "hourly",
        "ledger": "s1/",
    },
    2: {
        # ์˜ˆ๊ณ ๋งŒ ํ•œ๋‹ค. ์ข…๋ชฉ์€ ์‹œ์ฆŒ 1์ด ๋๋‚œ ๋’ค ํ™•์ •ํ•œ๋‹ค.
        # ์‹œ์ฆŒ 1์—์„œ ์–ด๋–ค ์„ฑ๊ฒฉ์˜ ์‹œ์žฅ์— ์ฐธ๊ฐ€์ž๊ฐ€ ๋ชจ์ด๋Š”์ง€ ๋ณด๊ณ  ์ •ํ•˜๋Š” ํŽธ์ด ๋‚ซ๋‹ค.
        "name": "์‹œ์ฆŒ 2 ยท ์˜ˆ๊ณ ",
        "opens": None,
        "closes": None,
        "assets": {},
        "status": "announced",
        "teaser": "์„ ๋ฌผ๊ณผ ์›์ž์žฌ, ๊ทธ๋ฆฌ๊ณ  ์™ธํ™˜",
        # ์‹ค์ธกํ•ด๋‘” ํ›„๋ณด๋“ค. ํ™•์ • ์•„๋‹˜.
        "candidates": {
            "COPPER": {"label": "๊ตฌ๋ฆฌ", "vol": 0.291,
                       "note": "AI ๋ฐ์ดํ„ฐ์„ผํ„ฐ ์„œ์‚ฌ๋Š” ์žˆ์œผ๋‚˜ ๋ฐ์ดํ„ฐ๋กœ๋Š” ์•ฝํ•˜๋‹ค. "
                               "๋ฐ˜๋„์ฒด ์ƒ๊ด€ 0.28~0.36 < ๊ธˆ ์ƒ๊ด€ 0.40. "
                               "์„œ์‚ฌ๋กœ ๋‚ด์„ธ์šฐ๋ฉด ์ฐธ๊ฐ€์ž๊ฐ€ ์ƒ๊ด€ํ‘œ๋กœ ๋ฐ˜๋ฐ•ํ•  ์ˆ˜ ์žˆ๋‹ค"},
            "OIL": {"label": "์œ ๊ฐ€", "vol": 0.405, "note": "๋กค์˜ค๋ฒ„ ์ฒ˜๋ฆฌ ํ•„์š”"},
            "USDKRW": {"label": "๋‹ฌ๋Ÿฌ/์›", "vol": 0.097, "note": "์ €๋ณ€๋™"},
            "USDJPY": {"label": "๋‹ฌ๋Ÿฌ/์—”", "vol": 0.093, "note": "์ €๋ณ€๋™"},
            "DXY": {"label": "๋‹ฌ๋Ÿฌ์ง€์ˆ˜", "vol": 0.064,
                    "note": "๋ณ€๋™์„ฑ์ด ๊ธˆ์˜ 1/3. ์ˆœ์œ„๊ฐ€ ์†Œ์ˆ˜์ ์—์„œ ๊ฐˆ๋ฆด ์œ„ํ—˜"},
        },
        "prize_usd_per_asset": 500,
        "leverage": 1.0,
        "min_participation": 0.70,
        "update": "hourly",
        "ledger": "s2/",
        # ๐Ÿ”ด ์„ ๋ฌผยท์™ธํ™˜์€ ๋กค์˜ค๋ฒ„๊ฐ€ ์žˆ๋‹ค. ๊ทผ์›”๋ฌผ ๋งŒ๊ธฐ ์‹œ ์ฐจ์›”๋ฌผ๋กœ ๊ฐˆ์•„ํƒ€๋ฉฐ ๊ฐ€๊ฒฉ์ด
        #    ์ ํ”„ํ•˜๋Š”๋ฐ, ์ด๊ฑธ ์ˆ˜์ต๋ฅ ์— ๊ทธ๋Œ€๋กœ ๋„ฃ์œผ๋ฉด ์—†๋Š” ์†์ต์ด ์ƒ๊ธด๋‹ค.
        #    ์—ฐ๊ฒฐ์„ ๋ฌผ ๊ตฌ์„ฑ ๋ฐฉ์‹์„ ํ™•์ •ํ•˜๊ธฐ ์ „์—๋Š” ์‹œ์ฆŒ 2๋ฅผ ์—ด์ง€ ์•Š๋Š”๋‹ค.
        "rollover": None,
    },
}

# ์ฐธ๊ณ ์šฉ โ€” ํ™”๋ฉด์— '์šด์˜ ํ•œ๊ณ„์„ '์„ ๊ทธ์„ ๋•Œ ์“ด๋‹ค. ์ˆœ์œ„ ๊ณ„์‚ฐ์—๋Š” ์“ฐ์ง€ ์•Š๋Š”๋‹ค.
LUCK_CEILING = {
    "SOL": 0.8870, "ETH": 0.6227, "BTC": 0.5821, "TSLA": 0.5264,
    "NVDA": 0.4399, "OIL": 0.3546, "AAPL": 0.2271, "GOLD": 0.1497,
}

# ๋ฆฌ๋”๋ณด๋“œ์— ์ฐธ๊ฐ€์ž์™€ ํ•จ๊ป˜ ๋†“๋Š” ๊ธฐ์ค€์„ . ODC๊ฐ€ ์Šน์ธ์•ฝ์„ ๊ฐ™์€ ํ‘œ์— ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.
# ์ฒ™๋„๊ฐ€ ์—†๋Š” ๋ฆฌ๋”๋ณด๋“œ๋Š” ์ˆœ์œ„๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๋‹ค.
#
# ๐Ÿ”ด ์ฃผ์ตœ์ธก ๋ชจ๋ธ์€ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. ์…‹ ๋‹ค ๊ณต๊ฐœ๋œ ๊ต๊ณผ์„œ ๊ธฐ๋ฒ•์ด๋‹ค.
#    ์ฃผ์ตœ์ž๊ฐ€ ์ž๊ธฐ ๋ชจ๋ธ์„ ์ฐธ๊ฐ€์ž ํ‘œ์— ์˜ฌ๋ฆฌ๋ฉด "๋ˆ„๊ฐ€ ๋” ๋‚˜์€ ๋ชจ๋ธ์„ ๋งŒ๋“œ๋Š”๊ฐ€"๋ผ๋Š”
#    ๋ช…๋ถ„์ด ํ๋ ค์ง„๋‹ค. ๊ธฐ์ค€์„ ์€ ์ฒ™๋„์ด์ง€ ๊ฒฝ์Ÿ์ž๊ฐ€ ์•„๋‹ˆ๋‹ค.
ANCHORS = {
    "BUYHOLD": "๋‹จ์ˆœ ๋ณด์œ  โ€” ํฌ์ง€์…˜ ํ•ญ์ƒ +1. ์ด๊ฑธ ๋ชป ์ด๊ธฐ๋ฉด ์˜๋ฏธ๊ฐ€ ์—†๋‹ค",
    "VOLTARGET": "๋ณ€๋™์„ฑ ํƒ€๊ฒŸํŒ… โ€” ์ง€์ˆ˜๊ฐ€์ค‘ ๋ณ€๋™์„ฑ์œผ๋กœ ํฌ๊ธฐ๋งŒ ์กฐ์ ˆ. ๋ฐฉํ–ฅ์€ ๋กฑ ๊ณ ์ •",
    "RANDOM": "๋ฌด์ž‘์œ„ โ€” ๋งค์ผ -1/0/+1 ์ž„์˜ ์„ ํƒ. ๋ฐ”๋‹ฅ",
}


def season_of(asset):
    for sid, s in SEASONS.items():
        if asset in s.get("assets", {}):
            return sid
    return None


# ๋ฐฑ๋ถ„์œ„ ์ฑ„์  ๊ธฐ์ค€ํ‘œ โ€” calibrate.py ์‚ฐ์ถœ. ์ข…๋ชฉ๋ณ„ '์‹ค๋ ฅ0 ์ฐธ๊ฐ€์ž' ์ˆ˜์ต๋ฅ  ๋ถ„ํฌ.
_REF = None


def _ref():
    global _REF
    if _REF is None:
        import json, os
        _REF = json.load(open(os.path.join(os.path.dirname(os.path.abspath(__file__)),
                                           "reference_dist.json"), encoding="utf-8"))
    return _REF


def percentile(ret, asset):
    """๊ทธ ์ข…๋ชฉ์˜ ์‹ค๋ ฅ0 ๋ถ„ํฌ์—์„œ ๋‚ด ์ˆ˜์ต๋ฅ ์ด ์–ด๋А ๋ฐฑ๋ถ„์œ„์ธ๊ฐ€."""
    import bisect
    R = _ref()
    tbl = R["ref"].get(asset)
    if not tbl:
        return None
    return bisect.bisect_left(tbl, ret) / len(tbl)


def score(ret, asset):
    """์ˆœ์œ„ ์ ์ˆ˜ = -log10(1 - ๋ฐฑ๋ถ„์œ„)  = '์šด์œผ๋กœ ์ด ์„ฑ์ ์ด ๋‚˜์˜ฌ ํ™•๋ฅ '์˜ ์—ญ์ˆ˜ ์ง€์ˆ˜.



    2.0 ์ด๋ฉด ์šด์œผ๋กœ ์ด๋Ÿด ํ™•๋ฅ  1/100, 3.0 ์ด๋ฉด 1/1,000.



    ๐Ÿ”ด ์ˆ˜์ต๋ฅ ์„ ์ข…๋ชฉ๋ณ„ ๊ณ„์ˆ˜๋กœ ๋‚˜๋ˆ„๋Š” ๋ฐฉ์‹(= 95๋ถ„์œ„ ๋น„์œจ)์€ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

       ๊ทธ ์ง€์ ๋งŒ ๋งž๊ณ  ๊ผฌ๋ฆฌ๋Š” ์•ˆ ๋งž์•„, ์šฐ์Šน ํ™•๋ฅ ์ด SOL 22.3% vs GOLD 4.8%๋กœ

       4.7๋ฐฐ ํŽธ์ค‘๋๋‹ค. ์šฐ์Šน์ž๋Š” ์ตœ๋Œ“๊ฐ’์ด๊ณ  ์ตœ๋Œ“๊ฐ’์€ ๊ผฌ๋ฆฌ ๋ชจ์–‘์ด ์ •ํ•œ๋‹ค.

       ๋ถ„ํฌ ์ „์ฒด๋ฅผ ๋งž์ถ”๋Š” ๋ฐฑ๋ถ„์œ„๋กœ ๋ฐ”๊พธ๋‹ˆ ํŽธ์ค‘์ด 1.6๋ฐฐ(๋…ธ์ด์ฆˆ ์ˆ˜์ค€)๋กœ ๋‚ด๋ ค๊ฐ”๋‹ค.



    ํ™”๋ฉด์—๋Š” ์ˆ˜์ต๋ฅ ์„ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค€๋‹ค. ์ˆœ์œ„๋งŒ ์ด ์ ์ˆ˜๋กœ ๋งค๊ธด๋‹ค.

    """
    import math
    p = percentile(ret, asset)
    if p is None:
        return None
    return -math.log10(max(1.0 - min(p, 1 - 1e-6), 1e-6))

# โ”€โ”€ ์ฐธ๊ฐ€ ์œ ํ˜• โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€
# ์ž๊ธฐ ์‹ ๊ณ ๋‹ค. ๊ฒ€์ฆํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค. ๊ทธ๋ž˜์„œ ์ƒ๊ธˆ์€ ํ†ตํ•ฉ ์ˆœ์œ„์—๋งŒ ๊ฑธ๊ณ 
# ์œ ํ˜•๋ณ„ ์ˆœ์œ„๋Š” ๋ช…์˜ˆ๋กœ๋งŒ ๋‘”๋‹ค. ์†์ด๋Š” ์‚ฌ๋žŒ์ด ๋‚˜์™€๋„ ๋Œ€ํšŒ๊ฐ€ ๋ฌด๋„ˆ์ง€์ง€ ์•Š๊ฒŒ.
# ๋“ฑ๋ก์„ ๊นŒ๋‹ค๋กญ๊ฒŒ ๋งŒ๋“ค๋ฉด ์‚ฌ๋žŒ์ด ์•„์˜ˆ ์˜ค์ง€ ์•Š๋Š”๋ฐ, ๊ทธ๊ฒŒ ๋” ํฐ ์†์‹ค์ด๋‹ค.
TYPES = {
    "human": {"badge": "๐Ÿง‘", "label": "์‚ฌ๋žŒ", "desc": "์ง์ ‘ ํŒ๋‹จํ•ด ์ œ์ถœ"},
    "expert": {"badge": "๐Ÿ“Š", "label": "์ „๋ฌธ๊ฐ€ยท๊ธฐ๊ด€", "desc": "์ž์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜"},
    "agent": {"badge": "๐Ÿค–", "label": "AI ์—์ด์ „ํŠธ", "desc": "์ž๋™ ์ œ์ถœ"},
}

# ์œ ํ˜•๋ณ„ ์ฐธ์—ฌ ์š”๊ฑด. ์‚ฌ๋žŒ์€ ๋งค์‹œ๊ฐ„ ๊ฐฑ์‹ ํ•  ์ˆ˜ ์—†์œผ๋‹ˆ ์ ‘์† ๋นˆ๋„๋กœ ์™„ํ™”ํ•œ๋‹ค.
# ํฌ์ง€์…˜์„ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ๋„ ์ „๋žต์ด๋‹ค โ€” NVDA์—์„œ ๋‹จ์ˆœ๋ณด์œ ๊ฐ€ ๋ณ€๋™์„ฑ ํƒ€๊ฒŸํŒ…์„ ์ด๊ฒผ๋‹ค.
PARTICIPATION = {
    "human": {"valid_ratio": 0.70, "min_visits_per_week": 1},
    "expert": {"valid_ratio": 0.70, "min_visits_per_week": 0},
    "agent": {"valid_ratio": 0.70, "min_visits_per_week": 0},
}

# ์ƒ๊ธˆ์€ ํ†ตํ•ฉ 1๋ช…. ์œ ํ˜•๋ณ„ 1์œ„๋Š” ๋ช…์˜ˆ ๋ถ€๋ฌธ์ด๋‹ค.
PRIZE_SCOPE = "overall"
HONOR_SCOPES = ["human", "expert", "agent"]

MANIFESTO = {
    "title": "AI๋Š” ์‹œ์žฅ์„ ์ด๊ธธ ์ˆ˜ ์žˆ๋Š”๊ฐ€",
    "sub": "122์ผ๊ฐ„์˜ ๊ณต๊ฐœ ์‹คํ—˜",
    "cta_agent": "๋‹น์‹ ์˜ ์—์ด์ „ํŠธ๋ฅผ ๋ง ์œ„์— ์˜ฌ๋ฆฌ์‹ญ์‹œ์˜ค",
    "cta_human": "์ง์ ‘ ์ฐธ๊ฐ€ํ•˜๊ธฐ",
    "why": [
        ("์„ฑ๊ณต๋งŒ ๋ณด๋„๋ฉ๋‹ˆ๋‹ค",
         "์ˆ˜์ต ๋‚ธ ์‚ฌ๋žŒ๋งŒ ์ธํ„ฐ๋ทฐํ•ฉ๋‹ˆ๋‹ค. ์ง„ ์‚ฌ๋žŒ 999๋ช…์€ ๊ธฐ๋ก๋„ ๋‚จ์ง€ ์•Š์Šต๋‹ˆ๋‹ค."),
        ("๋ฐฑํ…Œ์ŠคํŠธ๋Š” ์กฐ์ž‘๋ฉ๋‹ˆ๋‹ค",
         "๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ๋กœ ์—ฐ 200%๋Š” ๋ˆ„๊ตฌ๋‚˜ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜๋กœ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค."),
        ("์šด๊ณผ ์‹ค๋ ฅ์ด ์•ˆ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค",
         "ํ•œ ๋‹ฌ์— 30% ๋‚ธ ์‚ฌ๋žŒ์ด ์‹ค๋ ฅ์ธ์ง€ ์šด์ธ์ง€ ํŒ๋ณ„ํ•  ๋ฐฉ๋ฒ•์ด ์—†์—ˆ์Šต๋‹ˆ๋‹ค."),
    ],
    "how": [
        ("์šด์˜ ํฌ๊ธฐ๋ฅผ ์ˆซ์ž๋กœ ์••๋‹ˆ๋‹ค",
         "์‹ค๋ ฅ 0์ธ ์ฐธ๊ฐ€์ž๊ฐ€ 122์ผ์— ์–ด๋””๊นŒ์ง€ ๊ฐ€๋Š”์ง€ 20,000ํšŒ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์œผ๋กœ ์Ÿ€์Šต๋‹ˆ๋‹ค. "
         "์ˆ˜์ˆ˜๋ฃŒ๊นŒ์ง€ ๋ฌผ๋ฆฐ ๊ฐ’์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ +86.6%, ๊ธˆ +9.2%. "
         "์ด ์„ ์„ ๋„˜์ง€ ๋ชปํ•œ ์ˆ˜์ต์€ ์‹ค๋ ฅ์˜ ์ฆ๊ฑฐ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค."),
        ("์กฐ์ž‘์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค",
         "์ •๋‹ต์ด ๋ฏธ๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์ถœํ•œ ๋’ค์— ์„ธ์ƒ์ด ์ •๋‹ต์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค."),
        ("๊ฐ™์€ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค",
         "๋ ˆ๋ฒ„๋ฆฌ์ง€ 1 ๊ณ ์ •, ๊ฐ™์€ ๋ฐ์ดํ„ฐ, ๊ฐ™์€ ์‹œ๊ฐ. ํฌ๊ฒŒ ๊ฑธ์–ด ์ด๊ธฐ๋Š” ๊ธธ์„ ๋ง‰์•˜์Šต๋‹ˆ๋‹ค."),
    ],
    # ์ฃผ์ตœ์ธก์€ ์ˆœ์œ„์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋‹ค. ๋Œ€์‹  ๊ธฐ์ค€์„  ์…‹์„ ๊ฐ™์€ ํ‘œ์— ์˜ฌ๋ ค
    # ์ฐธ๊ฐ€์ž๊ฐ€ ์ž๊ธฐ ์„ฑ์ ์„ ๋ฌด์—‡์— ๊ฒฌ์ค˜์•ผ ํ•˜๋Š”์ง€ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
    "our_stake": "์ฃผ์ตœ์ธก์€ ์ˆœ์œ„์— ์ฐธ๊ฐ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹จ์ˆœ ๋ณด์œ ยท๋ณ€๋™์„ฑ ํƒ€๊ฒŸํŒ…ยท๋ฌด์ž‘์œ„ "
                 "์„ธ ๊ธฐ์ค€์„ ์„ ๊ฐ™์€ ํ‘œ์— ์˜ฌ๋ ค, ์„ฑ์ ์„ ๋ฌด์—‡์— ๊ฒฌ์ค„์ง€ ๋ณด์ด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.",
}