kristada673 commited on
Commit
931d5fb
1 Parent(s): 6cb8351

Upload 8 files

Browse files
finnlp/utils/__pycache__/config.cpython-310.pyc ADDED
Binary file (1.65 kB). View file
 
finnlp/utils/__pycache__/config_tickers.cpython-310.pyc ADDED
Binary file (11.2 kB). View file
 
finnlp/utils/__pycache__/data_processor.cpython-310.pyc ADDED
Binary file (6.04 kB). View file
 
finnlp/utils/__pycache__/get_proxy.cpython-310.pyc ADDED
Binary file (3.74 kB). View file
 
finnlp/utils/config.py ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # dir
2
+ DATA_SAVE_DIR = "datasets"
3
+ TRAINED_MODEL_DIR = "trained_models"
4
+ TENSORBOARD_LOG_DIR = "tensorboard_log"
5
+ RESULTS_DIR = "results"
6
+
7
+ # date format: '%Y-%m-%d'
8
+ TRAIN_START_DATE = "2014-01-01"
9
+ TRAIN_END_DATE = "2020-07-31"
10
+
11
+ TEST_START_DATE = "2020-08-01"
12
+ TEST_END_DATE = "2021-10-01"
13
+
14
+ TRADE_START_DATE = "2021-11-01"
15
+ TRADE_END_DATE = "2021-12-01"
16
+
17
+ # stockstats technical indicator column names
18
+ # check https://pypi.org/project/stockstats/ for different names
19
+ INDICATORS = [
20
+ "macd",
21
+ "boll_ub",
22
+ "boll_lb",
23
+ "rsi_30",
24
+ "cci_30",
25
+ "dx_30",
26
+ "close_30_sma",
27
+ "close_60_sma",
28
+ ]
29
+
30
+
31
+ # Model Parameters
32
+ A2C_PARAMS = {"n_steps": 5, "ent_coef": 0.01, "learning_rate": 0.0007}
33
+ PPO_PARAMS = {
34
+ "n_steps": 2048,
35
+ "ent_coef": 0.01,
36
+ "learning_rate": 0.00025,
37
+ "batch_size": 64,
38
+ }
39
+ DDPG_PARAMS = {"batch_size": 128, "buffer_size": 50000, "learning_rate": 0.001}
40
+ TD3_PARAMS = {
41
+ "batch_size": 100,
42
+ "buffer_size": 1000000,
43
+ "learning_rate": 0.001,
44
+ }
45
+ SAC_PARAMS = {
46
+ "batch_size": 64,
47
+ "buffer_size": 100000,
48
+ "learning_rate": 0.0001,
49
+ "learning_starts": 100,
50
+ "ent_coef": "auto_0.1",
51
+ }
52
+ ERL_PARAMS = {
53
+ "learning_rate": 3e-5,
54
+ "batch_size": 2048,
55
+ "gamma": 0.985,
56
+ "seed": 312,
57
+ "net_dimension": 512,
58
+ "target_step": 5000,
59
+ "eval_gap": 30,
60
+ }
61
+ RLlib_PARAMS = {"lr": 5e-5, "train_batch_size": 500, "gamma": 0.99}
62
+
63
+
64
+ # Possible time zones
65
+ TIME_ZONE_SHANGHAI = "Asia/Shanghai" # Hang Seng HSI, SSE, CSI
66
+ TIME_ZONE_USEASTERN = "US/Eastern" # Dow, Nasdaq, SP
67
+ TIME_ZONE_PARIS = "Europe/Paris" # CAC,
68
+ TIME_ZONE_BERLIN = "Europe/Berlin" # DAX, TECDAX, MDAX, SDAX
69
+ TIME_ZONE_JAKARTA = "Asia/Jakarta" # LQ45
70
+ TIME_ZONE_SELFDEFINED = "xxx" # If neither of the above is your time zone, you should define it, and set USE_TIME_ZONE_SELFDEFINED 1.
71
+ USE_TIME_ZONE_SELFDEFINED = 0 # 0 (default) or 1 (use the self defined)
72
+
73
+ # parameters for data sources
74
+ ALPACA_API_KEY = "xxx" # your ALPACA_API_KEY
75
+ ALPACA_API_SECRET = "xxx" # your ALPACA_API_SECRET
76
+ ALPACA_API_BASE_URL = "https://paper-api.alpaca.markets" # alpaca url
77
+ BINANCE_BASE_URL = "https://data.binance.vision/" # binance url
finnlp/utils/config_tickers.py ADDED
@@ -0,0 +1,1429 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ SINGLE_TICKER = ["AAPL"]
2
+
3
+ # Dow 30 constituents on 2021/10
4
+ # check https://wrds-www.wharton.upenn.edu/ for U.S. index constituents (needs account)
5
+ DOW_30_TICKER = [
6
+ "AXP",
7
+ "AMGN",
8
+ "AAPL",
9
+ "BA",
10
+ "CAT",
11
+ "CSCO",
12
+ "CVX",
13
+ "GS",
14
+ "HD",
15
+ "HON",
16
+ "IBM",
17
+ "INTC",
18
+ "JNJ",
19
+ "KO",
20
+ "JPM",
21
+ "MCD",
22
+ "MMM",
23
+ "MRK",
24
+ "MSFT",
25
+ "NKE",
26
+ "PG",
27
+ "TRV",
28
+ "UNH",
29
+ "CRM",
30
+ "VZ",
31
+ "V",
32
+ "WBA",
33
+ "WMT",
34
+ "DIS",
35
+ "DOW",
36
+ ]
37
+
38
+ # Nasdaq 100 constituents on 2019/01
39
+ NAS_100_TICKER = [
40
+ "AMGN",
41
+ "AAPL",
42
+ "AMAT",
43
+ "INTC",
44
+ "PCAR",
45
+ "PAYX",
46
+ "MSFT",
47
+ "ADBE",
48
+ "CSCO",
49
+ "XLNX",
50
+ "QCOM",
51
+ "COST",
52
+ "SBUX",
53
+ "FISV",
54
+ "CTXS",
55
+ "INTU",
56
+ "AMZN",
57
+ "EBAY",
58
+ "BIIB",
59
+ "CHKP",
60
+ "GILD",
61
+ "NLOK",
62
+ "CMCSA",
63
+ "FAST",
64
+ "ADSK",
65
+ "CTSH",
66
+ "NVDA",
67
+ "GOOGL",
68
+ "ISRG",
69
+ "VRTX",
70
+ "HSIC",
71
+ "BIDU",
72
+ "ATVI",
73
+ "ADP",
74
+ "ROST",
75
+ "ORLY",
76
+ "CERN",
77
+ "BKNG",
78
+ "MYL",
79
+ "MU",
80
+ "DLTR",
81
+ "ALXN",
82
+ "SIRI",
83
+ "MNST",
84
+ "AVGO",
85
+ "TXN",
86
+ "MDLZ",
87
+ "FB",
88
+ "ADI",
89
+ "WDC",
90
+ "REGN",
91
+ "LBTYK",
92
+ "VRSK",
93
+ "NFLX",
94
+ "TSLA",
95
+ "CHTR",
96
+ "MAR",
97
+ "ILMN",
98
+ "LRCX",
99
+ "EA",
100
+ "AAL",
101
+ "WBA",
102
+ "KHC",
103
+ "BMRN",
104
+ "JD",
105
+ "SWKS",
106
+ "INCY",
107
+ "PYPL",
108
+ "CDW",
109
+ "FOXA",
110
+ "MXIM",
111
+ "TMUS",
112
+ "EXPE",
113
+ "TCOM",
114
+ "ULTA",
115
+ "CSX",
116
+ "NTES",
117
+ "MCHP",
118
+ "CTAS",
119
+ "KLAC",
120
+ "HAS",
121
+ "JBHT",
122
+ "IDXX",
123
+ "WYNN",
124
+ "MELI",
125
+ "ALGN",
126
+ "CDNS",
127
+ "WDAY",
128
+ "SNPS",
129
+ "ASML",
130
+ "TTWO",
131
+ "PEP",
132
+ "NXPI",
133
+ "XEL",
134
+ "AMD",
135
+ "NTAP",
136
+ "VRSN",
137
+ "LULU",
138
+ "WLTW",
139
+ "UAL",
140
+ ]
141
+
142
+ # SP 500 constituents at 2019
143
+ SP_500_TICKER = [
144
+ "A",
145
+ "AAL",
146
+ "AAP",
147
+ "AAPL",
148
+ "ABBV",
149
+ "ABC",
150
+ "ABMD",
151
+ "ABT",
152
+ "ACN",
153
+ "ADBE",
154
+ "ADI",
155
+ "ADM",
156
+ "ADP",
157
+ "ADS",
158
+ "ADSK",
159
+ "AEE",
160
+ "AEP",
161
+ "AES",
162
+ "AFL",
163
+ "AGN",
164
+ "AIG",
165
+ "AIV",
166
+ "AIZ",
167
+ "AJG",
168
+ "AKAM",
169
+ "ALB",
170
+ "ALGN",
171
+ "ALK",
172
+ "ALL",
173
+ "ALLE",
174
+ "ALXN",
175
+ "AMAT",
176
+ "AMCR",
177
+ "AMD",
178
+ "AME",
179
+ "AMG",
180
+ "AMGN",
181
+ "AMP",
182
+ "AMT",
183
+ "AMZN",
184
+ "ANET",
185
+ "ANSS",
186
+ "ANTM",
187
+ "AON",
188
+ "AOS",
189
+ "APA",
190
+ "APD",
191
+ "APH",
192
+ "APTV",
193
+ "ARE",
194
+ "ARNC",
195
+ "ATO",
196
+ "ATVI",
197
+ "AVB",
198
+ "AVGO",
199
+ "AVY",
200
+ "AWK",
201
+ "AXP",
202
+ "AZO",
203
+ "BA",
204
+ "BAC",
205
+ "BAX",
206
+ "BBT",
207
+ "BBY",
208
+ "BDX",
209
+ "BEN",
210
+ "BF.B",
211
+ "BHGE",
212
+ "BIIB",
213
+ "BK",
214
+ "BKNG",
215
+ "BLK",
216
+ "BLL",
217
+ "BMY",
218
+ "BR",
219
+ "BRK.B",
220
+ "BSX",
221
+ "BWA",
222
+ "BXP",
223
+ "C",
224
+ "CAG",
225
+ "CAH",
226
+ "CAT",
227
+ "CB",
228
+ "CBOE",
229
+ "CBRE",
230
+ "CBS",
231
+ "CCI",
232
+ "CCL",
233
+ "CDNS",
234
+ "CE",
235
+ "CELG",
236
+ "CERN",
237
+ "CF",
238
+ "CFG",
239
+ "CHD",
240
+ "CHRW",
241
+ "CHTR",
242
+ "CI",
243
+ "CINF",
244
+ "CL",
245
+ "CLX",
246
+ "CMA",
247
+ "CMCSA",
248
+ "CME",
249
+ "CMG",
250
+ "CMI",
251
+ "CMS",
252
+ "CNC",
253
+ "CNP",
254
+ "COF",
255
+ "COG",
256
+ "COO",
257
+ "COP",
258
+ "COST",
259
+ "COTY",
260
+ "CPB",
261
+ "CPRI",
262
+ "CPRT",
263
+ "CRM",
264
+ "CSCO",
265
+ "CSX",
266
+ "CTAS",
267
+ "CTL",
268
+ "CTSH",
269
+ "CTVA",
270
+ "CTXS",
271
+ "CVS",
272
+ "CVX",
273
+ "CXO",
274
+ "D",
275
+ "DAL",
276
+ "DD",
277
+ "DE",
278
+ "DFS",
279
+ "DG",
280
+ "DGX",
281
+ "DHI",
282
+ "DHR",
283
+ "DIS",
284
+ "DISCK",
285
+ "DISH",
286
+ "DLR",
287
+ "DLTR",
288
+ "DOV",
289
+ "DOW",
290
+ "DRE",
291
+ "DRI",
292
+ "DTE",
293
+ "DUK",
294
+ "DVA",
295
+ "DVN",
296
+ "DXC",
297
+ "EA",
298
+ "EBAY",
299
+ "ECL",
300
+ "ED",
301
+ "EFX",
302
+ "EIX",
303
+ "EL",
304
+ "EMN",
305
+ "EMR",
306
+ "EOG",
307
+ "EQIX",
308
+ "EQR",
309
+ "ES",
310
+ "ESS",
311
+ "ETFC",
312
+ "ETN",
313
+ "ETR",
314
+ "EVRG",
315
+ "EW",
316
+ "EXC",
317
+ "EXPD",
318
+ "EXPE",
319
+ "EXR",
320
+ "F",
321
+ "FANG",
322
+ "FAST",
323
+ "FB",
324
+ "FBHS",
325
+ "FCX",
326
+ "FDX",
327
+ "FE",
328
+ "FFIV",
329
+ "FIS",
330
+ "FISV",
331
+ "FITB",
332
+ "FLIR",
333
+ "FLS",
334
+ "FLT",
335
+ "FMC",
336
+ "FOXA",
337
+ "FRC",
338
+ "FRT",
339
+ "FTI",
340
+ "FTNT",
341
+ "FTV",
342
+ "GD",
343
+ "GE",
344
+ "GILD",
345
+ "GIS",
346
+ "GL",
347
+ "GLW",
348
+ "GM",
349
+ "GOOG",
350
+ "GPC",
351
+ "GPN",
352
+ "GPS",
353
+ "GRMN",
354
+ "GS",
355
+ "GWW",
356
+ "HAL",
357
+ "HAS",
358
+ "HBAN",
359
+ "HBI",
360
+ "HCA",
361
+ "HCP",
362
+ "HD",
363
+ "HES",
364
+ "HFC",
365
+ "HIG",
366
+ "HII",
367
+ "HLT",
368
+ "HOG",
369
+ "HOLX",
370
+ "HON",
371
+ "HP",
372
+ "HPE",
373
+ "HPQ",
374
+ "HRB",
375
+ "HRL",
376
+ "HSIC",
377
+ "HST",
378
+ "HSY",
379
+ "HUM",
380
+ "IBM",
381
+ "ICE",
382
+ "IDXX",
383
+ "IEX",
384
+ "IFF",
385
+ "ILMN",
386
+ "INCY",
387
+ "INFO",
388
+ "INTC",
389
+ "INTU",
390
+ "IP",
391
+ "IPG",
392
+ "IPGP",
393
+ "IQV",
394
+ "IR",
395
+ "IRM",
396
+ "ISRG",
397
+ "IT",
398
+ "ITW",
399
+ "IVZ",
400
+ "JBHT",
401
+ "JCI",
402
+ "JEC",
403
+ "JEF",
404
+ "JKHY",
405
+ "JNJ",
406
+ "JNPR",
407
+ "JPM",
408
+ "JWN",
409
+ "K",
410
+ "KEY",
411
+ "KEYS",
412
+ "KHC",
413
+ "KIM",
414
+ "KLAC",
415
+ "KMB",
416
+ "KMI",
417
+ "KMX",
418
+ "KO",
419
+ "KR",
420
+ "KSS",
421
+ "KSU",
422
+ "L",
423
+ "LB",
424
+ "LDOS",
425
+ "LEG",
426
+ "LEN",
427
+ "LH",
428
+ "LHX",
429
+ "LIN",
430
+ "LKQ",
431
+ "LLY",
432
+ "LMT",
433
+ "LNC",
434
+ "LNT",
435
+ "LOW",
436
+ "LRCX",
437
+ "LUV",
438
+ "LW",
439
+ "LYB",
440
+ "M",
441
+ "MA",
442
+ "MAA",
443
+ "MAC",
444
+ "MAR",
445
+ "MAS",
446
+ "MCD",
447
+ "MCHP",
448
+ "MCK",
449
+ "MCO",
450
+ "MDLZ",
451
+ "MDT",
452
+ "MET",
453
+ "MGM",
454
+ "MHK",
455
+ "MKC",
456
+ "MKTX",
457
+ "MLM",
458
+ "MMC",
459
+ "MMM",
460
+ "MNST",
461
+ "MO",
462
+ "MOS",
463
+ "MPC",
464
+ "MRK",
465
+ "MRO",
466
+ "MS",
467
+ "MSCI",
468
+ "MSFT",
469
+ "MSI",
470
+ "MTB",
471
+ "MTD",
472
+ "MU",
473
+ "MXIM",
474
+ "MYL",
475
+ "NBL",
476
+ "NCLH",
477
+ "NDAQ",
478
+ "NEE",
479
+ "NEM",
480
+ "NFLX",
481
+ "NI",
482
+ "NKE",
483
+ "NKTR",
484
+ "NLSN",
485
+ "NOC",
486
+ "NOV",
487
+ "NRG",
488
+ "NSC",
489
+ "NTAP",
490
+ "NTRS",
491
+ "NUE",
492
+ "NVDA",
493
+ "NWL",
494
+ "NWS",
495
+ "O",
496
+ "OI",
497
+ "OKE",
498
+ "OMC",
499
+ "ORCL",
500
+ "ORLY",
501
+ "OXY",
502
+ "PAYX",
503
+ "PBCT",
504
+ "PCAR",
505
+ "PEG",
506
+ "PEP",
507
+ "PFE",
508
+ "PFG",
509
+ "PG",
510
+ "PGR",
511
+ "PH",
512
+ "PHM",
513
+ "PKG",
514
+ "PKI",
515
+ "PLD",
516
+ "PM",
517
+ "PNC",
518
+ "PNR",
519
+ "PNW",
520
+ "PPG",
521
+ "PPL",
522
+ "PRGO",
523
+ "PRU",
524
+ "PSA",
525
+ "PSX",
526
+ "PVH",
527
+ "PWR",
528
+ "PXD",
529
+ "PYPL",
530
+ "QCOM",
531
+ "QRVO",
532
+ "RCL",
533
+ "RE",
534
+ "REG",
535
+ "REGN",
536
+ "RF",
537
+ "RHI",
538
+ "RJF",
539
+ "RL",
540
+ "RMD",
541
+ "ROK",
542
+ "ROL",
543
+ "ROP",
544
+ "ROST",
545
+ "RSG",
546
+ "RTN",
547
+ "SBAC",
548
+ "SBUX",
549
+ "SCHW",
550
+ "SEE",
551
+ "SHW",
552
+ "SIVB",
553
+ "SJM",
554
+ "SLB",
555
+ "SLG",
556
+ "SNA",
557
+ "SNPS",
558
+ "SO",
559
+ "SPG",
560
+ "SPGI",
561
+ "SRE",
562
+ "STI",
563
+ "STT",
564
+ "STX",
565
+ "STZ",
566
+ "SWK",
567
+ "SWKS",
568
+ "SYF",
569
+ "SYK",
570
+ "SYMC",
571
+ "SYY",
572
+ "T",
573
+ "TAP",
574
+ "TDG",
575
+ "TEL",
576
+ "TFX",
577
+ "TGT",
578
+ "TIF",
579
+ "TJX",
580
+ "TMO",
581
+ "TMUS",
582
+ "TPR",
583
+ "TRIP",
584
+ "TROW",
585
+ "TRV",
586
+ "TSCO",
587
+ "TSN",
588
+ "TSS",
589
+ "TTWO",
590
+ "TWTR",
591
+ "TXN",
592
+ "TXT",
593
+ "UA",
594
+ "UAL",
595
+ "UDR",
596
+ "UHS",
597
+ "ULTA",
598
+ "UNH",
599
+ "UNM",
600
+ "UNP",
601
+ "UPS",
602
+ "URI",
603
+ "USB",
604
+ "UTX",
605
+ "V",
606
+ "VAR",
607
+ "VFC",
608
+ "VIAB",
609
+ "VLO",
610
+ "VMC",
611
+ "VNO",
612
+ "VRSK",
613
+ "VRSN",
614
+ "VRTX",
615
+ "VTR",
616
+ "VZ",
617
+ "WAB",
618
+ "WAT",
619
+ "WBA",
620
+ "WCG",
621
+ "WDC",
622
+ "WEC",
623
+ "WELL",
624
+ "WFC",
625
+ "WHR",
626
+ "WLTW",
627
+ "WM",
628
+ "WMB",
629
+ "WMT",
630
+ "WRK",
631
+ "WU",
632
+ "WY",
633
+ "WYNN",
634
+ "XEC",
635
+ "XEL",
636
+ "XLNX",
637
+ "XOM",
638
+ "XRAY",
639
+ "XRX",
640
+ "XYL",
641
+ "YUM",
642
+ "ZBH",
643
+ "ZION",
644
+ "ZTS",
645
+ ]
646
+
647
+ # Hang Seng Index constituents at 2019/01
648
+ HSI_50_TICKER = [
649
+ "0011.HK",
650
+ "0005.HK",
651
+ "0012.HK",
652
+ "0006.HK",
653
+ "0003.HK",
654
+ "0016.HK",
655
+ "0019.HK",
656
+ "0002.HK",
657
+ "0001.HK",
658
+ "0267.HK",
659
+ "0101.HK",
660
+ "0941.HK",
661
+ "0762.HK",
662
+ "0066.HK",
663
+ "0883.HK",
664
+ "2388.HK",
665
+ "0017.HK",
666
+ "0083.HK",
667
+ "0939.HK",
668
+ "0388.HK",
669
+ "0386.HK",
670
+ "3988.HK",
671
+ "2628.HK",
672
+ "1398.HK",
673
+ "2318.HK",
674
+ "3328.HK",
675
+ "0688.HK",
676
+ "0857.HK",
677
+ "1088.HK",
678
+ "0700.HK",
679
+ "0836.HK",
680
+ "1109.HK",
681
+ "1044.HK",
682
+ "1299.HK",
683
+ "0151.HK",
684
+ "1928.HK",
685
+ "0027.HK",
686
+ "2319.HK",
687
+ "0823.HK",
688
+ "1113.HK",
689
+ "1038.HK",
690
+ "2018.HK",
691
+ "0175.HK",
692
+ "0288.HK",
693
+ "1997.HK",
694
+ "2007.HK",
695
+ "2382.HK",
696
+ "1093.HK",
697
+ "1177.HK",
698
+ "2313.HK",
699
+ ]
700
+
701
+ # SSE 50 Index constituents in 2019. www.csindex.com.cn, for SSE and CSI adjustments
702
+ SSE_50_TICKER = [
703
+ "600000.XSHG",
704
+ "600036.XSHG",
705
+ "600104.XSHG",
706
+ "600030.XSHG",
707
+ "601628.XSHG",
708
+ "601166.XSHG",
709
+ "601318.XSHG",
710
+ "601328.XSHG",
711
+ "601088.XSHG",
712
+ "601857.XSHG",
713
+ "601601.XSHG",
714
+ "601668.XSHG",
715
+ "601288.XSHG",
716
+ "601818.XSHG",
717
+ "601989.XSHG",
718
+ "601398.XSHG",
719
+ "600048.XSHG",
720
+ "600028.XSHG",
721
+ "600050.XSHG",
722
+ "600519.XSHG",
723
+ "600016.XSHG",
724
+ "600887.XSHG",
725
+ "601688.XSHG",
726
+ "601186.XSHG",
727
+ "601988.XSHG",
728
+ "601211.XSHG",
729
+ "601336.XSHG",
730
+ "600309.XSHG",
731
+ "603993.XSHG",
732
+ "600690.XSHG",
733
+ "600276.XSHG",
734
+ "600703.XSHG",
735
+ "600585.XSHG",
736
+ "603259.XSHG",
737
+ "601888.XSHG",
738
+ "601138.XSHG",
739
+ "600196.XSHG",
740
+ "601766.XSHG",
741
+ "600340.XSHG",
742
+ "601390.XSHG",
743
+ "601939.XSHG",
744
+ "601111.XSHG",
745
+ "600029.XSHG",
746
+ "600019.XSHG",
747
+ "601229.XSHG",
748
+ "601800.XSHG",
749
+ "600547.XSHG",
750
+ "601006.XSHG",
751
+ "601360.XSHG",
752
+ "600606.XSHG",
753
+ "601319.XSHG",
754
+ "600837.XSHG",
755
+ "600031.XSHG",
756
+ "601066.XSHG",
757
+ "600009.XSHG",
758
+ "601236.XSHG",
759
+ "601012.XSHG",
760
+ "600745.XSHG",
761
+ "600588.XSHG",
762
+ "601658.XSHG",
763
+ "601816.XSHG",
764
+ "603160.XSHG",
765
+ ]
766
+
767
+ # CSI 300 Index constituents at 2019
768
+ CSI_300_TICKER = [
769
+ "600000.XSHG",
770
+ "600004.XSHG",
771
+ "600009.XSHG",
772
+ "600010.XSHG",
773
+ "600011.XSHG",
774
+ "600015.XSHG",
775
+ "600016.XSHG",
776
+ "600018.XSHG",
777
+ "600019.XSHG",
778
+ "600025.XSHG",
779
+ "600027.XSHG",
780
+ "600028.XSHG",
781
+ "600029.XSHG",
782
+ "600030.XSHG",
783
+ "600031.XSHG",
784
+ "600036.XSHG",
785
+ "600038.XSHG",
786
+ "600048.XSHG",
787
+ "600050.XSHG",
788
+ "600061.XSHG",
789
+ "600066.XSHG",
790
+ "600068.XSHG",
791
+ "600085.XSHG",
792
+ "600089.XSHG",
793
+ "600104.XSHG",
794
+ "600109.XSHG",
795
+ "600111.XSHG",
796
+ "600115.XSHG",
797
+ "600118.XSHG",
798
+ "600170.XSHG",
799
+ "600176.XSHG",
800
+ "600177.XSHG",
801
+ "600183.XSHG",
802
+ "600188.XSHG",
803
+ "600196.XSHG",
804
+ "600208.XSHG",
805
+ "600219.XSHG",
806
+ "600221.XSHG",
807
+ "600233.XSHG",
808
+ "600271.XSHG",
809
+ "600276.XSHG",
810
+ "600297.XSHG",
811
+ "600299.XSHG",
812
+ "600309.XSHG",
813
+ "600332.XSHG",
814
+ "600340.XSHG",
815
+ "600346.XSHG",
816
+ "600352.XSHG",
817
+ "600362.XSHG",
818
+ "600369.XSHG",
819
+ "600372.XSHG",
820
+ "600383.XSHG",
821
+ "600390.XSHG",
822
+ "600398.XSHG",
823
+ "600406.XSHG",
824
+ "600436.XSHG",
825
+ "600438.XSHG",
826
+ "600482.XSHG",
827
+ "600487.XSHG",
828
+ "600489.XSHG",
829
+ "600498.XSHG",
830
+ "600516.XSHG",
831
+ "600519.XSHG",
832
+ "600522.XSHG",
833
+ "600547.XSHG",
834
+ "600570.XSHG",
835
+ "600583.XSHG",
836
+ "600585.XSHG",
837
+ "600588.XSHG",
838
+ "600606.XSHG",
839
+ "600637.XSHG",
840
+ "600655.XSHG",
841
+ "600660.XSHG",
842
+ "600674.XSHG",
843
+ "600690.XSHG",
844
+ "600703.XSHG",
845
+ "600705.XSHG",
846
+ "600741.XSHG",
847
+ "600745.XSHG",
848
+ "600760.XSHG",
849
+ "600795.XSHG",
850
+ "600809.XSHG",
851
+ "600837.XSHG",
852
+ "600848.XSHG",
853
+ "600867.XSHG",
854
+ "600886.XSHG",
855
+ "600887.XSHG",
856
+ "600893.XSHG",
857
+ "600900.XSHG",
858
+ "600919.XSHG",
859
+ "600926.XSHG",
860
+ "600928.XSHG",
861
+ "600958.XSHG",
862
+ "600968.XSHG",
863
+ "600977.XSHG",
864
+ "600989.XSHG",
865
+ "600998.XSHG",
866
+ "600999.XSHG",
867
+ "601006.XSHG",
868
+ "601009.XSHG",
869
+ "601012.XSHG",
870
+ "601018.XSHG",
871
+ "601021.XSHG",
872
+ "601066.XSHG",
873
+ "601077.XSHG",
874
+ "601088.XSHG",
875
+ "601100.XSHG",
876
+ "601108.XSHG",
877
+ "601111.XSHG",
878
+ "601117.XSHG",
879
+ "601138.XSHG",
880
+ "601155.XSHG",
881
+ "601162.XSHG",
882
+ "601166.XSHG",
883
+ "601169.XSHG",
884
+ "601186.XSHG",
885
+ "601198.XSHG",
886
+ "601211.XSHG",
887
+ "601212.XSHG",
888
+ "601216.XSHG",
889
+ "601225.XSHG",
890
+ "601229.XSHG",
891
+ "601231.XSHG",
892
+ "601236.XSHG",
893
+ "601238.XSHG",
894
+ "601288.XSHG",
895
+ "601298.XSHG",
896
+ "601318.XSHG",
897
+ "601319.XSHG",
898
+ "601328.XSHG",
899
+ "601336.XSHG",
900
+ "601360.XSHG",
901
+ "601377.XSHG",
902
+ "601390.XSHG",
903
+ "601398.XSHG",
904
+ "601555.XSHG",
905
+ "601577.XSHG",
906
+ "601600.XSHG",
907
+ "601601.XSHG",
908
+ "601607.XSHG",
909
+ "601618.XSHG",
910
+ "601628.XSHG",
911
+ "601633.XSHG",
912
+ "601658.XSHG",
913
+ "601668.XSHG",
914
+ "601669.XSHG",
915
+ "601688.XSHG",
916
+ "601698.XSHG",
917
+ "601727.XSHG",
918
+ "601766.XSHG",
919
+ "601788.XSHG",
920
+ "601800.XSHG",
921
+ "601808.XSHG",
922
+ "601816.XSHG",
923
+ "601818.XSHG",
924
+ "601828.XSHG",
925
+ "601838.XSHG",
926
+ "601857.XSHG",
927
+ "601877.XSHG",
928
+ "601878.XSHG",
929
+ "601881.XSHG",
930
+ "601888.XSHG",
931
+ "601898.XSHG",
932
+ "601899.XSHG",
933
+ "601901.XSHG",
934
+ "601916.XSHG",
935
+ "601919.XSHG",
936
+ "601933.XSHG",
937
+ "601939.XSHG",
938
+ "601985.XSHG",
939
+ "601988.XSHG",
940
+ "601989.XSHG",
941
+ "601992.XSHG",
942
+ "601997.XSHG",
943
+ "601998.XSHG",
944
+ "603019.XSHG",
945
+ "603156.XSHG",
946
+ "603160.XSHG",
947
+ "603259.XSHG",
948
+ "603260.XSHG",
949
+ "603288.XSHG",
950
+ "603369.XSHG",
951
+ "603501.XSHG",
952
+ "603658.XSHG",
953
+ "603799.XSHG",
954
+ "603833.XSHG",
955
+ "603899.XSHG",
956
+ "603986.XSHG",
957
+ "603993.XSHG",
958
+ "000001.XSHE",
959
+ "000002.XSHE",
960
+ "000063.XSHE",
961
+ "000066.XSHE",
962
+ "000069.XSHE",
963
+ "000100.XSHE",
964
+ "000157.XSHE",
965
+ "000166.XSHE",
966
+ "000333.XSHE",
967
+ "000338.XSHE",
968
+ "000425.XSHE",
969
+ "000538.XSHE",
970
+ "000568.XSHE",
971
+ "000596.XSHE",
972
+ "000625.XSHE",
973
+ "000627.XSHE",
974
+ "000651.XSHE",
975
+ "000656.XSHE",
976
+ "000661.XSHE",
977
+ "000671.XSHE",
978
+ "000703.XSHE",
979
+ "000708.XSHE",
980
+ "000709.XSHE",
981
+ "000723.XSHE",
982
+ "000725.XSHE",
983
+ "000728.XSHE",
984
+ "000768.XSHE",
985
+ "000776.XSHE",
986
+ "000783.XSHE",
987
+ "000786.XSHE",
988
+ "000858.XSHE",
989
+ "000860.XSHE",
990
+ "000876.XSHE",
991
+ "000895.XSHE",
992
+ "000938.XSHE",
993
+ "000961.XSHE",
994
+ "000963.XSHE",
995
+ "000977.XSHE",
996
+ "001979.XSHE",
997
+ "002001.XSHE",
998
+ "002007.XSHE",
999
+ "002008.XSHE",
1000
+ "002024.XSHE",
1001
+ "002027.XSHE",
1002
+ "002032.XSHE",
1003
+ "002044.XSHE",
1004
+ "002050.XSHE",
1005
+ "002120.XSHE",
1006
+ "002129.XSHE",
1007
+ "002142.XSHE",
1008
+ "002146.XSHE",
1009
+ "002153.XSHE",
1010
+ "002157.XSHE",
1011
+ "002179.XSHE",
1012
+ "002202.XSHE",
1013
+ "002230.XSHE",
1014
+ "002236.XSHE",
1015
+ "002241.XSHE",
1016
+ "002252.XSHE",
1017
+ "002271.XSHE",
1018
+ "002304.XSHE",
1019
+ "002311.XSHE",
1020
+ "002352.XSHE",
1021
+ "002371.XSHE",
1022
+ "002410.XSHE",
1023
+ "002415.XSHE",
1024
+ "002422.XSHE",
1025
+ "002456.XSHE",
1026
+ "002460.XSHE",
1027
+ "002463.XSHE",
1028
+ "002466.XSHE",
1029
+ "002468.XSHE",
1030
+ "002475.XSHE",
1031
+ "002493.XSHE",
1032
+ "002508.XSHE",
1033
+ "002555.XSHE",
1034
+ "002558.XSHE",
1035
+ "002594.XSHE",
1036
+ "002601.XSHE",
1037
+ "002602.XSHE",
1038
+ "002607.XSHE",
1039
+ "002624.XSHE",
1040
+ "002673.XSHE",
1041
+ "002714.XSHE",
1042
+ "002736.XSHE",
1043
+ "002739.XSHE",
1044
+ "002773.XSHE",
1045
+ "002841.XSHE",
1046
+ "002916.XSHE",
1047
+ "002938.XSHE",
1048
+ "002939.XSHE",
1049
+ "002945.XSHE",
1050
+ "002958.XSHE",
1051
+ "003816.XSHE",
1052
+ "300003.XSHE",
1053
+ "300014.XSHE",
1054
+ "300015.XSHE",
1055
+ "300033.XSHE",
1056
+ "300059.XSHE",
1057
+ "300122.XSHE",
1058
+ "300124.XSHE",
1059
+ "300136.XSHE",
1060
+ "300142.XSHE",
1061
+ "300144.XSHE",
1062
+ "300347.XSHE",
1063
+ "300408.XSHE",
1064
+ "300413.XSHE",
1065
+ "300433.XSHE",
1066
+ "300498.XSHE",
1067
+ "300601.XSHE",
1068
+ "300628.XSHE",
1069
+ ]
1070
+
1071
+ # CAC 40 constituents at 2019/01
1072
+ # Check https://www.bnains.org/archives/histocac/compocac.php for CAC 40 constituents
1073
+ CAC_40_TICKER = [
1074
+ "AC.PA",
1075
+ "AI.PA",
1076
+ "AIR.PA",
1077
+ "MT.AS",
1078
+ "ATO.PA",
1079
+ "CS.PA",
1080
+ "BNP.PA",
1081
+ "EN.PA",
1082
+ "CAP.PA",
1083
+ "CA.PA",
1084
+ "ACA.PA",
1085
+ "BN.PA",
1086
+ "DSY.PA",
1087
+ "ENGI.PA",
1088
+ "EL.PA",
1089
+ "RMS.PA",
1090
+ "KER.PA",
1091
+ "OR.PA",
1092
+ "LR.PA",
1093
+ "MC.PA",
1094
+ "ML.PA",
1095
+ "ORA.PA",
1096
+ "RI.PA",
1097
+ "PUGOY",
1098
+ "PUB.PA",
1099
+ "RNO.PA",
1100
+ "SAF.PA",
1101
+ "SGO.PA",
1102
+ "SAN.PA",
1103
+ "SU.PA",
1104
+ "GLE.PA",
1105
+ "SW.PA",
1106
+ "STM.PA",
1107
+ "FTI.PA",
1108
+ "FP.PA",
1109
+ "URW.AS",
1110
+ "FR.PA",
1111
+ "VIE.PA",
1112
+ "DG.PA",
1113
+ "VIV.PA",
1114
+ ]
1115
+
1116
+ # DAX 30 constituents on 2021/02
1117
+ DAX_30_TICKER = [
1118
+ "DHER.DE",
1119
+ "RWE.DE",
1120
+ "FRE.DE",
1121
+ "MTX.DE",
1122
+ "MRK.DE",
1123
+ "LIN.DE",
1124
+ "ALV.DE",
1125
+ "VNA.DE",
1126
+ "EOAN.DE",
1127
+ "HEN3.DE",
1128
+ "DAI.DE",
1129
+ "DB1.DE",
1130
+ "DPW.DE",
1131
+ "DWNI.DE",
1132
+ "BMW.DE",
1133
+ "DTE.DE",
1134
+ "VOW3.DE",
1135
+ "MUV2.DE",
1136
+ "1COV.DE",
1137
+ "SAP.DE",
1138
+ "FME.DE",
1139
+ "BAS.DE",
1140
+ "BAYN.DE",
1141
+ "BEI.DE",
1142
+ "CON.DE",
1143
+ "SIE.DE",
1144
+ "ADS.DE",
1145
+ "HEI.DE",
1146
+ "DBK.DE",
1147
+ "IFX.DE",
1148
+ ]
1149
+
1150
+ # TecDAX constituents at 2021/02
1151
+ TECDAX_TICKER = [
1152
+ "ADV.DE",
1153
+ "AFX.DE",
1154
+ "AM3D.DE",
1155
+ "BC8.DE",
1156
+ "COK.DE",
1157
+ "DLG.DE",
1158
+ "DRI.DE",
1159
+ "DRW3.DE",
1160
+ "EVT.DE",
1161
+ "FNTN.DE",
1162
+ "GFT.DE",
1163
+ "JEN.DE",
1164
+ "MDG1.DE",
1165
+ "MOR.DE",
1166
+ "NDX1.DE",
1167
+ "NEM.DE",
1168
+ "O2D.DE",
1169
+ "PFV.DE",
1170
+ "QIA.DE",
1171
+ "RIB.DE",
1172
+ "S92.DE",
1173
+ "SANT.DE",
1174
+ "SOW.DE",
1175
+ "SRT3.DE",
1176
+ "UTDI.DE",
1177
+ "WAF.DE",
1178
+ "WDI.DE",
1179
+ ]
1180
+
1181
+ # MDAX 50 constituents at 2021/02
1182
+ MDAX_50_TICKER = [
1183
+ "1COV.DE",
1184
+ "AIR.DE",
1185
+ "AOX.DE",
1186
+ "ARL.DE",
1187
+ "BNR.DE",
1188
+ "BOSS.DE",
1189
+ "DEQ.DE",
1190
+ "DUE.DE",
1191
+ "DWNI.DE",
1192
+ "EVD.DE",
1193
+ "EVK.DE",
1194
+ "FIE.DE",
1195
+ "FPE3.DE",
1196
+ "FRA.DE",
1197
+ "G1A.DE",
1198
+ "GBF.DE",
1199
+ "GXI.DE",
1200
+ "HLE.DE",
1201
+ "HNR1.DE",
1202
+ "HOT.DE",
1203
+ "JUN3.DE",
1204
+ "KGX.DE",
1205
+ "KRN.DE",
1206
+ "LEG.DE",
1207
+ "LEO.DE",
1208
+ "LXS.DE",
1209
+ "MTX.DE",
1210
+ "NDA.DE",
1211
+ "NOEJ.DE",
1212
+ "OSR.DE",
1213
+ "PBB.DE",
1214
+ "RAA.DE",
1215
+ "RHM.DE",
1216
+ "RRTL.DE",
1217
+ "SAX.DE",
1218
+ "SDF.DE",
1219
+ "SHA.DE",
1220
+ "SNH.DE",
1221
+ "SY1.DE",
1222
+ "SZG.DE",
1223
+ "SZU.DE",
1224
+ "TEG.DE",
1225
+ "TLX.DE",
1226
+ "UN01.DE",
1227
+ "WCH.DE",
1228
+ "ZAL.DE",
1229
+ ]
1230
+
1231
+ # SDAX 50 constituents at 2021/02
1232
+ SDAX_50_TICKER = [
1233
+ "AAD.DE",
1234
+ "ACX.DE",
1235
+ "ADJ.DE",
1236
+ "ADL.DE",
1237
+ "BDT.DE",
1238
+ "BIO3.DE",
1239
+ "BVB.DE",
1240
+ "BYW6.DE",
1241
+ "CWC.DE",
1242
+ "DBAN.DE",
1243
+ "DEZ.DE",
1244
+ "DIC.DE",
1245
+ "G24.DE",
1246
+ "GIL.DE",
1247
+ "GLJ.DE",
1248
+ "GMM.DE",
1249
+ "HBH.DE",
1250
+ "HDD.DE",
1251
+ "HHFA.DE",
1252
+ "HLAG.DE",
1253
+ "HYQ.DE",
1254
+ "INH.DE",
1255
+ "KCO.DE",
1256
+ "KWS.DE",
1257
+ "PUM.DE",
1258
+ "RHK.DE",
1259
+ "SFQ.DE",
1260
+ "SGL.DE",
1261
+ "SIX2.DE",
1262
+ "SKB.DE",
1263
+ "STM.DE",
1264
+ "TC1.DE",
1265
+ "TLG.DE",
1266
+ "TTK.DE",
1267
+ "VOS.DE",
1268
+ "WAC.DE",
1269
+ "WCMK.DE",
1270
+ "WSU.DE",
1271
+ "WUW.DE",
1272
+ "ZIL2.DE",
1273
+ "ZO1.DE",
1274
+ ]
1275
+
1276
+ # LQ45 constituents at 2021/10
1277
+ LQ45_TICKER = [
1278
+ "ACES.JK",
1279
+ "ADRO.JK",
1280
+ "AKRA.JK",
1281
+ "ANTM.JK",
1282
+ "ASII.JK",
1283
+ "BBCA.JK",
1284
+ "BBNI.JK",
1285
+ "BBRI.JK",
1286
+ "BBTN.JK",
1287
+ "BMRI.JK",
1288
+ "BRPT.JK",
1289
+ "BSDE.JK",
1290
+ "CPIN.JK",
1291
+ "ERAA.JK",
1292
+ "EXCL.JK",
1293
+ "GGRM.JK",
1294
+ "HMSP.JK",
1295
+ "ICBP.JK",
1296
+ "INCO.JK",
1297
+ "INDF.JK",
1298
+ "INKP.JK",
1299
+ "INTP.JK",
1300
+ "ITMG.JK",
1301
+ "JPFA.JK",
1302
+ "JSMR.JK",
1303
+ "KLBF.JK",
1304
+ "MDKA.JK",
1305
+ "MEDC.JK",
1306
+ "MIKA.JK",
1307
+ "MNCN.JK",
1308
+ "PGAS.JK",
1309
+ "PTBA.JK",
1310
+ "PTPP.JK",
1311
+ "PWON.JK",
1312
+ "SMGR.JK",
1313
+ "SMRA.JK",
1314
+ "TBIG.JK",
1315
+ "TINS.JK",
1316
+ "TKIM.JK",
1317
+ "TLKM.JK",
1318
+ "TOWR.JK",
1319
+ "TPIA.JK",
1320
+ "UNTR.JK",
1321
+ "UNVR.JK",
1322
+ "WIKA.JK",
1323
+ ]
1324
+
1325
+ # SRI-KEHATI.JK - Sustainable Responsible Investm
1326
+ SRI_KEHATI_TICKER = [
1327
+ "AALI.JK",
1328
+ "ADHI.JK",
1329
+ "ASII.JK",
1330
+ "BBCA.JK",
1331
+ "BBNI.JK",
1332
+ "BBRI.JK",
1333
+ "BBTN.JK",
1334
+ "BMRI.JK",
1335
+ "BSDE.JK",
1336
+ "INDF.JK",
1337
+ "JPFA.JK",
1338
+ "JSMR.JK",
1339
+ "KLBF.JK",
1340
+ "PGAS.JK",
1341
+ "PJAA.JK",
1342
+ "PPRO.JK",
1343
+ "SIDO.JK",
1344
+ "SMGR.JK",
1345
+ "TINS.JK",
1346
+ "TLKM.JK",
1347
+ "UNTR.JK",
1348
+ "UNVR.JK",
1349
+ "WIKA.JK",
1350
+ "WSKT.JK",
1351
+ "WTON.JK",
1352
+ ]
1353
+
1354
+ # FX Ticker
1355
+ FX_TICKER = [
1356
+ "AUDCAD=X",
1357
+ "AUDCHF=X",
1358
+ "AUDJPY=X",
1359
+ "AUDNZD=X",
1360
+ "AUDSGD=X",
1361
+ "AUDUSD=X",
1362
+ "AUDUSD=X",
1363
+ "AUDUSD=X",
1364
+ "AUDUSD=X",
1365
+ "AUDUSD=X",
1366
+ "AUDUSD=X",
1367
+ "AUDUSD=X",
1368
+ "CADCHF=X",
1369
+ "CADHKD=X",
1370
+ "CADJPY=X",
1371
+ "CHFJPY=X",
1372
+ "CHFSGD=X",
1373
+ "EURAUD=X",
1374
+ "EURCAD=X",
1375
+ "EURCHF=X",
1376
+ "EURCHF=X",
1377
+ "EURCHF=X",
1378
+ "EURCZK=X",
1379
+ "EURGBP=X",
1380
+ "EURHKD=X",
1381
+ "EURHUF=X",
1382
+ "EURJPY=X",
1383
+ "EURNOK=X",
1384
+ "EURNZD=X",
1385
+ "EURPLN=X",
1386
+ "EURRUB=X",
1387
+ "EURSEK=X",
1388
+ "EURSGD=X",
1389
+ "EURTRY=X",
1390
+ "EURTRY=X",
1391
+ "EURUSD=X",
1392
+ "GBPAUD=X",
1393
+ "GBPAUD=X",
1394
+ "GBPAUD=X",
1395
+ "GBPCAD=X",
1396
+ "GBPCHF=X",
1397
+ "GBPJPY=X",
1398
+ "GBPNZD=X",
1399
+ "GBPUSD=X",
1400
+ "HKDJPY=X",
1401
+ "NZDCAD=X",
1402
+ "NZDCHF=X",
1403
+ "NZDJPY=X",
1404
+ "NZDUSD=X",
1405
+ "SGDJPY=X",
1406
+ "TRYJPY=X",
1407
+ "USDCAD=X",
1408
+ "USDCHF=X",
1409
+ "USDCNH=X",
1410
+ "USDCZK=X",
1411
+ "USDHKD=X",
1412
+ "USDHUF=X",
1413
+ "USDILS=X",
1414
+ "USDJPY=X",
1415
+ "USDMXN=X",
1416
+ "USDNOK=X",
1417
+ "USDPLN=X",
1418
+ "USDRON=X",
1419
+ "USDRUB=X",
1420
+ "USDSEK=X",
1421
+ "USDSGD=X",
1422
+ "USDTHB=X",
1423
+ "USDTRY=X",
1424
+ "USDZAR=X",
1425
+ "XAGUSD=X",
1426
+ "XAUUSD=X",
1427
+ "ZARJPY=X",
1428
+ "EURDKK=X",
1429
+ ]
finnlp/utils/data_processor.py ADDED
@@ -0,0 +1,247 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import pickle
3
+ from typing import List
4
+
5
+ import numpy as np
6
+ import pandas as pd
7
+
8
+
9
+ class DataProcessor:
10
+ def __init__(
11
+ self,
12
+ data_source: str,
13
+ start_date: str,
14
+ end_date: str,
15
+ time_interval: str,
16
+ **kwargs,
17
+ ):
18
+ self.data_source = data_source
19
+ self.start_date = start_date
20
+ self.end_date = end_date
21
+ self.time_interval = time_interval
22
+ self.dataframe = pd.DataFrame()
23
+
24
+ if self.data_source == "akshare":
25
+ from meta.data_processors.akshare import Akshare
26
+
27
+ processor_dict = {self.data_source: Akshare}
28
+ elif self.data_source == "alpaca":
29
+ from meta.data_processors.alpaca import Alpaca
30
+
31
+ processor_dict = {self.data_source: Alpaca}
32
+ elif self.data_source == "alphavantage":
33
+ from meta.data_processors.alphavantage import Alphavantage
34
+
35
+ processor_dict = {self.data_source: Alphavantage}
36
+ elif self.data_source == "baostock":
37
+ from meta.data_processors.baostock import Baostock
38
+
39
+ processor_dict = {self.data_source: Baostock}
40
+ elif self.data_source == "binance":
41
+ from meta.data_processors.binance import Binance
42
+
43
+ processor_dict = {self.data_source: Binance}
44
+ elif self.data_source == "ccxt":
45
+ from meta.data_processors.ccxt import Ccxt
46
+
47
+ processor_dict = {self.data_source: Ccxt}
48
+ elif self.data_source == "iexcloud":
49
+ from meta.data_processors.iexcloud import Iexcloud
50
+
51
+ processor_dict = {self.data_source: Iexcloud}
52
+ elif self.data_source == "joinquant":
53
+ from meta.data_processors.joinquant import Joinquant
54
+
55
+ processor_dict = {self.data_source: Joinquant}
56
+ elif self.data_source == "quandl":
57
+ from meta.data_processors.quandl import Quandl
58
+
59
+ processor_dict = {self.data_source: Quandl}
60
+ elif self.data_source == "quantconnect":
61
+ from meta.data_processors.quantconnect import Quantconnect
62
+
63
+ processor_dict = {self.data_source: Quantconnect}
64
+ elif self.data_source == "ricequant":
65
+ from meta.data_processors.ricequant import Ricequant
66
+
67
+ processor_dict = {self.data_source: Ricequant}
68
+ elif self.data_source == "tushare":
69
+ from meta.data_processors.tushare import Tushare
70
+
71
+ processor_dict = {self.data_source: Tushare}
72
+ elif self.data_source == "wrds":
73
+ from meta.data_processors.wrds import Wrds
74
+
75
+ processor_dict = {self.data_source: Wrds}
76
+ elif self.data_source == "yahoofinance":
77
+ from meta.data_processors.yahoofinance import Yahoofinance
78
+
79
+ processor_dict = {self.data_source: Yahoofinance}
80
+ else:
81
+ print(f"{self.data_source} is NOT supported yet.")
82
+
83
+ try:
84
+ self.processor = processor_dict.get(self.data_source)(
85
+ data_source, start_date, end_date, time_interval, **kwargs
86
+ )
87
+ print(f"{self.data_source} successfully connected")
88
+ except:
89
+ raise ValueError(
90
+ f"Please input correct account info for {self.data_source}!"
91
+ )
92
+
93
+ def download_data(self, ticker_list):
94
+ self.processor.download_data(ticker_list=ticker_list)
95
+ self.dataframe = self.processor.dataframe
96
+
97
+ def clean_data(self):
98
+ self.processor.dataframe = self.dataframe
99
+ self.processor.clean_data()
100
+ self.dataframe = self.processor.dataframe
101
+
102
+ def add_technical_indicator(
103
+ self, tech_indicator_list: List[str], select_stockstats_talib: int = 0
104
+ ):
105
+ self.tech_indicator_list = tech_indicator_list
106
+ self.processor.add_technical_indicator(
107
+ tech_indicator_list, select_stockstats_talib
108
+ )
109
+ self.dataframe = self.processor.dataframe
110
+
111
+ def add_turbulence(self):
112
+ self.processor.add_turbulence()
113
+ self.dataframe = self.processor.dataframe
114
+
115
+ def add_vix(self):
116
+ self.processor.add_vix()
117
+ self.dataframe = self.processor.dataframe
118
+
119
+ def df_to_array(self, if_vix: bool) -> np.array:
120
+ price_array, tech_array, turbulence_array = self.processor.df_to_array(
121
+ self.tech_indicator_list, if_vix
122
+ )
123
+ # fill nan with 0 for technical indicators
124
+ tech_nan_positions = np.isnan(tech_array)
125
+ tech_array[tech_nan_positions] = 0
126
+
127
+ return price_array, tech_array, turbulence_array
128
+
129
+ def data_split(self, df, start, end, target_date_col="time"):
130
+ """
131
+ split the dataset into training or testing using date
132
+ :param data: (df) pandas dataframe, start, end
133
+ :return: (df) pandas dataframe
134
+ """
135
+ data = df[(df[target_date_col] >= start) & (df[target_date_col] < end)]
136
+ data = data.sort_values([target_date_col, "tic"], ignore_index=True)
137
+ data.index = data[target_date_col].factorize()[0]
138
+ return data
139
+
140
+ def fillna(self):
141
+ self.processor.dataframe = self.dataframe
142
+ self.processor.fillna()
143
+ self.dataframe = self.processor.dataframe
144
+
145
+ def run(
146
+ self,
147
+ ticker_list: str,
148
+ technical_indicator_list: List[str],
149
+ if_vix: bool,
150
+ cache: bool = False,
151
+ select_stockstats_talib: int = 0,
152
+ ):
153
+ if self.time_interval == "1s" and self.data_source != "binance":
154
+ raise ValueError(
155
+ "Currently 1s interval data is only supported with 'binance' as data source"
156
+ )
157
+
158
+ cache_filename = (
159
+ "_".join(
160
+ ticker_list
161
+ + [
162
+ self.data_source,
163
+ self.start_date,
164
+ self.end_date,
165
+ self.time_interval,
166
+ ]
167
+ )
168
+ + ".pickle"
169
+ )
170
+ cache_dir = "./cache"
171
+ cache_path = os.path.join(cache_dir, cache_filename)
172
+
173
+ if cache and os.path.isfile(cache_path):
174
+ print(f"Using cached file {cache_path}")
175
+ self.tech_indicator_list = technical_indicator_list
176
+ with open(cache_path, "rb") as handle:
177
+ self.processor.dataframe = pickle.load(handle)
178
+ else:
179
+ self.download_data(ticker_list)
180
+ self.clean_data()
181
+ if cache:
182
+ if not os.path.exists(cache_dir):
183
+ os.mkdir(cache_dir)
184
+ with open(cache_path, "wb") as handle:
185
+ pickle.dump(
186
+ self.dataframe,
187
+ handle,
188
+ protocol=pickle.HIGHEST_PROTOCOL,
189
+ )
190
+
191
+ self.add_technical_indicator(technical_indicator_list, select_stockstats_talib)
192
+ if if_vix:
193
+ self.add_vix()
194
+ price_array, tech_array, turbulence_array = self.df_to_array(if_vix)
195
+ tech_nan_positions = np.isnan(tech_array)
196
+ tech_array[tech_nan_positions] = 0
197
+
198
+ return price_array, tech_array, turbulence_array
199
+
200
+
201
+ def test_joinquant():
202
+ # TRADE_START_DATE = "2019-09-01"
203
+ TRADE_START_DATE = "2020-09-01"
204
+ TRADE_END_DATE = "2021-09-11"
205
+
206
+ # supported time interval: '1m', '5m', '15m', '30m', '60m', '120m', '1d', '1w', '1M'
207
+ TIME_INTERVAL = "1d"
208
+ TECHNICAL_INDICATOR = [
209
+ "macd",
210
+ "boll_ub",
211
+ "boll_lb",
212
+ "rsi_30",
213
+ "dx_30",
214
+ "close_30_sma",
215
+ "close_60_sma",
216
+ ]
217
+
218
+ kwargs = {"username": "xxx", "password": "xxx"}
219
+ p = DataProcessor(
220
+ data_source="joinquant",
221
+ start_date=TRADE_START_DATE,
222
+ end_date=TRADE_END_DATE,
223
+ time_interval=TIME_INTERVAL,
224
+ **kwargs,
225
+ )
226
+
227
+ ticker_list = ["000612.XSHE", "601808.XSHG"]
228
+
229
+ p.download_data(ticker_list=ticker_list)
230
+
231
+ p.clean_data()
232
+ p.add_turbulence()
233
+ p.add_technical_indicator(TECHNICAL_INDICATOR)
234
+ p.add_vix()
235
+
236
+ price_array, tech_array, turbulence_array = p.run(
237
+ ticker_list, TECHNICAL_INDICATOR, if_vix=False, cache=True
238
+ )
239
+ pass
240
+
241
+
242
+ # if __name__ == "__main__":
243
+ # # test_joinquant()
244
+ # # test_binance()
245
+ # # test_yahoofinance()
246
+ # test_baostock()
247
+ # # test_quandl()
finnlp/utils/get_proxy.py ADDED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import requests
2
+ import parsel
3
+ from lxml import etree
4
+ from tqdm import tqdm
5
+ import time
6
+ import re
7
+
8
+ def check_china_ips(proxies_list):
9
+ """检测ip的方法"""
10
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
11
+
12
+ can_use = []
13
+ for proxy in tqdm(proxies_list, desc = "Checking ips"):
14
+ try:
15
+ response = requests.get('http://www.baidu.com', headers=headers, proxies=proxy, timeout=1) # 超时报错
16
+ if response.status_code == 200:
17
+ can_use.append(proxy)
18
+ except Exception as error:
19
+ # print(error)
20
+ pass
21
+ return can_use
22
+
23
+ def check_us_ips(proxies_list):
24
+ """检测ip的方法"""
25
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
26
+
27
+ can_use = []
28
+ for proxy in tqdm(proxies_list, desc = "Checking ips"):
29
+ try:
30
+ response = requests.get('http://www.google.com', headers=headers, proxies=proxy, timeout=1) # 超时报错
31
+ if response.status_code == 200:
32
+ can_use.append(proxy)
33
+ except Exception as error:
34
+ # print(error)
35
+ pass
36
+ return can_use
37
+
38
+ def get_china_free_proxy(pages = 10):
39
+ proxies_list = []
40
+ for page in tqdm(range(1, pages+1), desc = "Gathering free ips by pages..."):
41
+
42
+ base_url = f'https://www.kuaidaili.com/free/inha/{page}'
43
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
44
+ success = False
45
+ while not success:
46
+ try:
47
+ response = requests.get(base_url, headers=headers)
48
+ data = response.text
49
+ res = etree.HTML(data)
50
+ trs = res.xpath("/html/body/div[1]/div[4]/div[2]/div[2]/div[2]/table/tbody/tr")
51
+ if len(trs)!=0:
52
+ success = True
53
+ for tr in trs:
54
+ proxies_dict = {}
55
+ http_type = tr.xpath('./td[4]/text()')[0]
56
+ ip_num = tr.xpath('./td[1]/text()')[0]
57
+ port_num = tr.xpath('./td[2]/text()')[0]
58
+ proxies_dict[http_type] = ip_num + ':' + port_num
59
+ proxies_list.append(proxies_dict)
60
+ else:
61
+ time.delay(0.01)
62
+
63
+ except:
64
+ pass
65
+
66
+ can_use = check_china_ips(proxies_list)
67
+
68
+ print(f'获取到的代理ip数量: {len(proxies_list)} 。Get proxy ips: {len(proxies_list)}.')
69
+ print(f'能用的代理数量: {len(can_use)}。Usable proxy ips: {len(can_use)}.' )
70
+
71
+ return can_use
72
+
73
+ def get_us_free_proxy(pages = 10):
74
+ url = "https://openproxy.space/list/http"
75
+ headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.79 Safari/537.36'}
76
+ response = requests.get(url, headers=headers)
77
+ if response.status_code != 200:
78
+ print("Connection Error. Please make sure that your computer now have the access to Google.com")
79
+ res = etree.HTML(response.text)
80
+ http_type = "HTTP"
81
+ proxies_list = []
82
+
83
+ scripts = res.xpath("//script")
84
+ content = scripts[3].xpath(".//text()")
85
+ pattern = re.compile('LIST",data:(.+),added:')
86
+ result_list = pattern.findall(content[0])
87
+ result_list = result_list[0].strip("[{").strip("}]").split("},{")
88
+
89
+ for result in result_list:
90
+ pattern = re.compile('\[(.+)\]')
91
+ result = pattern.findall(result)
92
+ result = result[0].split(",")
93
+ result = [r.strip("\"") for r in result]
94
+ for ip in result:
95
+ proxies_list.append(
96
+ {http_type: ip}
97
+ )
98
+ total = pages* 15
99
+ proxies_list = proxies_list[:total]
100
+ can_use = check_us_ips(proxies_list)
101
+ print(f'Get proxy ips: {len(proxies_list)}.')
102
+ print(f'Usable proxy ips: {len(can_use)}.' )
103
+
104
+ return can_use
105
+
106
+ class Kuaidaili:
107
+ def __init__(self, tunnel, username, password):
108
+ self.tunnel = tunnel
109
+ self.username = username
110
+ self.password = password
111
+
112
+ def get_kuaidaili_tunnel_proxy(self):
113
+ proxies = {
114
+ "http": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": self.username, "pwd": self.password, "proxy": self.tunnel},
115
+ "https": "http://%(user)s:%(pwd)s@%(proxy)s/" % {"user": self.username, "pwd": self.password, "proxy": self.tunnel}
116
+ }
117
+ return proxies