kyLE_LEng commited on
Commit
74f15a2
·
verified ·
1 Parent(s): d0115c3

Train PatchTST cross-sectional return forecaster

Browse files
README.md ADDED
@@ -0,0 +1,80 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ library_name: transformers
3
+ tags:
4
+ - time-series
5
+ - forecasting
6
+ - patchtst
7
+ - finance
8
+ - probabilistic-forecasting
9
+ datasets:
10
+ - siddharthmb/stocks-ohlcv
11
+ ---
12
+
13
+ # PatchTST Cross-Sectional Return Forecast
14
+
15
+ This model is a `PatchTSTForPrediction` model trained to forecast future cross-sectional stock return distributions.
16
+
17
+ ## Data
18
+
19
+ - Dataset: `siddharthmb/stocks-ohlcv`
20
+ - Source file: `ohlcv.csv`
21
+ - Tickers: `AAPL, MSFT, AMZN, GOOGL, NVDA, TSLA, AMD, INTC, ADBE, ORCL, CSCO, IBM, JPM, BAC, V, MA, AXP, JNJ, PG, KO`
22
+ - Input: past daily log returns in percentage points
23
+ - Target: future daily log returns in percentage points
24
+ - Split: chronological train / validation / test
25
+
26
+ ## Model
27
+
28
+ ```python
29
+ PatchTSTConfig(
30
+ context_length=512,
31
+ prediction_length=64,
32
+ num_input_channels=20,
33
+ patch_length=16,
34
+ patch_stride=8,
35
+ d_model=128,
36
+ num_hidden_layers=4,
37
+ num_attention_heads=4,
38
+ distribution_output="student_t",
39
+ loss="nll",
40
+ scaling="std",
41
+ )
42
+ ```
43
+
44
+ Student-t output is used because financial returns are heavy-tailed.
45
+
46
+ ## Metrics
47
+
48
+ Validation:
49
+
50
+ ```json
51
+ {
52
+ "loss": 40.24222278594971,
53
+ "mae": 3.3909754753112793,
54
+ "mse": 15.027800559997559,
55
+ "directional_accuracy": 0.5080167271784233,
56
+ "flattened_ic": 0.002849485427271254,
57
+ "cross_sectional_ic": 0.008907554652154311,
58
+ "cross_sectional_rank_ic": 0.008295830343493587
59
+ }
60
+ ```
61
+
62
+ Test:
63
+
64
+ ```json
65
+ {
66
+ "loss": 38.46169090270996,
67
+ "mae": 3.328381299972534,
68
+ "mse": 14.407476425170898,
69
+ "directional_accuracy": 0.534091938405797,
70
+ "flattened_ic": 0.00037866420310066716,
71
+ "cross_sectional_ic": 0.00456014569165105,
72
+ "cross_sectional_rank_ic": 0.009876399072214697
73
+ }
74
+ ```
75
+
76
+ NLL/loss is the primary metric because this is a probabilistic forecasting model.
77
+
78
+ ## Intended Use
79
+
80
+ Research and experimentation with probabilistic multi-asset return forecasting. This is not a production trading system or investment advice.
config.json ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "activation_function": "gelu",
3
+ "architectures": [
4
+ "PatchTSTForPrediction"
5
+ ],
6
+ "attention_dropout": 0.05,
7
+ "bias": true,
8
+ "channel_attention": false,
9
+ "channel_consistent_masking": false,
10
+ "context_length": 512,
11
+ "d_model": 128,
12
+ "distribution_output": "student_t",
13
+ "do_mask_input": null,
14
+ "dtype": "float32",
15
+ "ff_dropout": 0.05,
16
+ "ffn_dim": 512,
17
+ "head_dropout": 0.05,
18
+ "init_std": 0.02,
19
+ "loss": "nll",
20
+ "mask_type": "random",
21
+ "mask_value": 0,
22
+ "model_type": "patchtst",
23
+ "norm_eps": 1e-05,
24
+ "norm_type": "batchnorm",
25
+ "num_attention_heads": 4,
26
+ "num_forecast_mask_patches": [
27
+ 2
28
+ ],
29
+ "num_hidden_layers": 4,
30
+ "num_input_channels": 20,
31
+ "num_parallel_samples": 100,
32
+ "num_targets": 1,
33
+ "output_range": null,
34
+ "patch_length": 16,
35
+ "patch_stride": 8,
36
+ "path_dropout": 0.0,
37
+ "pooling_type": "mean",
38
+ "positional_dropout": 0.0,
39
+ "positional_encoding_type": "sincos",
40
+ "pre_norm": true,
41
+ "prediction_length": 64,
42
+ "random_mask_ratio": 0.5,
43
+ "scaling": "std",
44
+ "share_embedding": true,
45
+ "share_projection": true,
46
+ "transformers_version": "5.6.2",
47
+ "unmasked_channel_indices": null,
48
+ "use_cls_token": false
49
+ }
metrics.json ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "validation": {
3
+ "loss": 40.24222278594971,
4
+ "mae": 3.3909754753112793,
5
+ "mse": 15.027800559997559,
6
+ "directional_accuracy": 0.5080167271784233,
7
+ "flattened_ic": 0.002849485427271254,
8
+ "cross_sectional_ic": 0.008907554652154311,
9
+ "cross_sectional_rank_ic": 0.008295830343493587
10
+ },
11
+ "test": {
12
+ "loss": 38.46169090270996,
13
+ "mae": 3.328381299972534,
14
+ "mse": 14.407476425170898,
15
+ "directional_accuracy": 0.534091938405797,
16
+ "flattened_ic": 0.00037866420310066716,
17
+ "cross_sectional_ic": 0.00456014569165105,
18
+ "cross_sectional_rank_ic": 0.009876399072214697
19
+ },
20
+ "best_validation_loss": 40.24222278594971,
21
+ "num_train_windows": 2249,
22
+ "num_validation_windows": 482,
23
+ "num_test_windows": 483,
24
+ "num_return_steps": 3789,
25
+ "selected_tickers": [
26
+ "AAPL",
27
+ "MSFT",
28
+ "AMZN",
29
+ "GOOGL",
30
+ "NVDA",
31
+ "TSLA",
32
+ "AMD",
33
+ "INTC",
34
+ "ADBE",
35
+ "ORCL",
36
+ "CSCO",
37
+ "IBM",
38
+ "JPM",
39
+ "BAC",
40
+ "V",
41
+ "MA",
42
+ "AXP",
43
+ "JNJ",
44
+ "PG",
45
+ "KO"
46
+ ],
47
+ "data_source": "siddharthmb/stocks-ohlcv"
48
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2aadf08503beae78d838efa41c4a7ce79460ec2edad54bb669ad4dd0b94e133d
3
+ size 3331624
selected_tickers.json ADDED
@@ -0,0 +1,22 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ "AAPL",
3
+ "MSFT",
4
+ "AMZN",
5
+ "GOOGL",
6
+ "NVDA",
7
+ "TSLA",
8
+ "AMD",
9
+ "INTC",
10
+ "ADBE",
11
+ "ORCL",
12
+ "CSCO",
13
+ "IBM",
14
+ "JPM",
15
+ "BAC",
16
+ "V",
17
+ "MA",
18
+ "AXP",
19
+ "JNJ",
20
+ "PG",
21
+ "KO"
22
+ ]
training_config.json ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "model_repo_id": "JumpHigh/patchtst-cross-sectional-return-forecast",
3
+ "dataset_id": "siddharthmb/stocks-ohlcv",
4
+ "dataset_file": "ohlcv.csv",
5
+ "tickers": [
6
+ "AAPL",
7
+ "MSFT",
8
+ "AMZN",
9
+ "GOOGL",
10
+ "NVDA",
11
+ "TSLA",
12
+ "AMD",
13
+ "INTC",
14
+ "ADBE",
15
+ "ORCL",
16
+ "CSCO",
17
+ "IBM",
18
+ "JPM",
19
+ "BAC",
20
+ "V",
21
+ "MA",
22
+ "AXP",
23
+ "JNJ",
24
+ "PG",
25
+ "KO",
26
+ "WMT",
27
+ "HD"
28
+ ],
29
+ "num_channels": 20,
30
+ "use_synthetic": false,
31
+ "synthetic_steps": 1800,
32
+ "context_length": 512,
33
+ "prediction_length": 64,
34
+ "patch_length": 16,
35
+ "patch_stride": 8,
36
+ "d_model": 128,
37
+ "num_hidden_layers": 4,
38
+ "num_attention_heads": 4,
39
+ "ffn_dim": 512,
40
+ "batch_size": 64,
41
+ "eval_batch_size": 128,
42
+ "num_epochs": 20,
43
+ "learning_rate": 0.0005,
44
+ "weight_decay": 0.01,
45
+ "warmup_ratio": 0.05,
46
+ "max_grad_norm": 1.0,
47
+ "window_stride": 1,
48
+ "train_fraction": 0.7,
49
+ "validation_fraction": 0.15,
50
+ "random_seed": 7,
51
+ "max_csv_chunks": null,
52
+ "csv_chunksize": 500000,
53
+ "min_rows_per_ticker": 1000,
54
+ "device": "auto",
55
+ "bf16": true,
56
+ "output_dir": "patchtst-return-model",
57
+ "checkpoint_upload_every": 1,
58
+ "resume_from_model_id": null,
59
+ "resume_from_subfolder": null
60
+ }
training_history.json ADDED
@@ -0,0 +1,222 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [
2
+ {
3
+ "epoch": 1.0,
4
+ "train_loss": 38.083184242248535,
5
+ "val_loss": 40.33867359161377,
6
+ "val_mae": 3.411853313446045,
7
+ "val_mse": 15.193361282348633,
8
+ "val_directional_accuracy": 0.5080167271784233,
9
+ "val_flattened_ic": -0.007615978990012297,
10
+ "val_cross_sectional_ic": -0.004534054731422012,
11
+ "val_cross_sectional_rank_ic": -0.003705142654353727
12
+ },
13
+ {
14
+ "epoch": 2.0,
15
+ "train_loss": 36.96161471472846,
16
+ "val_loss": 40.26822090148926,
17
+ "val_mae": 3.3166604042053223,
18
+ "val_mse": 14.50558853149414,
19
+ "val_directional_accuracy": 0.5080167271784233,
20
+ "val_flattened_ic": -0.004560436252413131,
21
+ "val_cross_sectional_ic": 0.006662598467151822,
22
+ "val_cross_sectional_rank_ic": 0.00664660874177144
23
+ },
24
+ {
25
+ "epoch": 3.0,
26
+ "train_loss": 36.62392701043023,
27
+ "val_loss": 40.24265670776367,
28
+ "val_mae": 3.3373842239379883,
29
+ "val_mse": 14.650705337524414,
30
+ "val_directional_accuracy": 0.5080167271784233,
31
+ "val_flattened_ic": -0.001804785034913796,
32
+ "val_cross_sectional_ic": 0.0036212050047214326,
33
+ "val_cross_sectional_rank_ic": 0.003974374473528218
34
+ },
35
+ {
36
+ "epoch": 4.0,
37
+ "train_loss": 36.54268667432997,
38
+ "val_loss": 40.24222278594971,
39
+ "val_mae": 3.3909754753112793,
40
+ "val_mse": 15.027800559997559,
41
+ "val_directional_accuracy": 0.5080167271784233,
42
+ "val_flattened_ic": 0.002849485427271254,
43
+ "val_cross_sectional_ic": 0.008907554652154311,
44
+ "val_cross_sectional_rank_ic": 0.008295830343493587
45
+ },
46
+ {
47
+ "epoch": 5.0,
48
+ "train_loss": 36.36816957261827,
49
+ "val_loss": 40.289424896240234,
50
+ "val_mae": 3.5364367961883545,
51
+ "val_mse": 16.097305297851562,
52
+ "val_directional_accuracy": 0.5080167271784233,
53
+ "val_flattened_ic": 0.010637149928228217,
54
+ "val_cross_sectional_ic": 0.01254028547568924,
55
+ "val_cross_sectional_rank_ic": 0.012717803325741737
56
+ },
57
+ {
58
+ "epoch": 6.0,
59
+ "train_loss": 36.245592541164825,
60
+ "val_loss": 40.88849925994873,
61
+ "val_mae": 3.3615570068359375,
62
+ "val_mse": 14.834178924560547,
63
+ "val_directional_accuracy": 0.5080167271784233,
64
+ "val_flattened_ic": 0.003901970950778491,
65
+ "val_cross_sectional_ic": 0.009459000169539322,
66
+ "val_cross_sectional_rank_ic": 0.008210668658159921
67
+ },
68
+ {
69
+ "epoch": 7.0,
70
+ "train_loss": 36.17875459459093,
71
+ "val_loss": 40.588151931762695,
72
+ "val_mae": 3.464787006378174,
73
+ "val_mse": 15.583830833435059,
74
+ "val_directional_accuracy": 0.5080167271784233,
75
+ "val_flattened_ic": 0.0003019660426648835,
76
+ "val_cross_sectional_ic": 0.011623528854580577,
77
+ "val_cross_sectional_rank_ic": 0.01000813106417496
78
+ },
79
+ {
80
+ "epoch": 8.0,
81
+ "train_loss": 36.111580000983345,
82
+ "val_loss": 40.75489616394043,
83
+ "val_mae": 3.4724013805389404,
84
+ "val_mse": 15.655922889709473,
85
+ "val_directional_accuracy": 0.5080167271784233,
86
+ "val_flattened_ic": -0.0005500266980102771,
87
+ "val_cross_sectional_ic": 0.010404556197328153,
88
+ "val_cross_sectional_rank_ic": 0.009252205331794215
89
+ },
90
+ {
91
+ "epoch": 9.0,
92
+ "train_loss": 36.20632118648953,
93
+ "val_loss": 40.907135009765625,
94
+ "val_mae": 3.3920974731445312,
95
+ "val_mse": 15.056652069091797,
96
+ "val_directional_accuracy": 0.5080167271784233,
97
+ "val_flattened_ic": 0.003980670460070644,
98
+ "val_cross_sectional_ic": 0.011293668916766964,
99
+ "val_cross_sectional_rank_ic": 0.010589151171497205
100
+ },
101
+ {
102
+ "epoch": 10.0,
103
+ "train_loss": 36.06566704644097,
104
+ "val_loss": 40.421080589294434,
105
+ "val_mae": 3.639277219772339,
106
+ "val_mse": 16.902896881103516,
107
+ "val_directional_accuracy": 0.5080167271784233,
108
+ "val_flattened_ic": 0.007341202383667006,
109
+ "val_cross_sectional_ic": 0.011621638468400851,
110
+ "val_cross_sectional_rank_ic": 0.010598461922440957
111
+ },
112
+ {
113
+ "epoch": 11.0,
114
+ "train_loss": 36.03963163163927,
115
+ "val_loss": 40.760315895080566,
116
+ "val_mae": 3.4333012104034424,
117
+ "val_mse": 15.35942554473877,
118
+ "val_directional_accuracy": 0.5080167271784233,
119
+ "val_flattened_ic": 0.005621932392516035,
120
+ "val_cross_sectional_ic": 0.010134697969808124,
121
+ "val_cross_sectional_rank_ic": 0.00971345310891336
122
+ },
123
+ {
124
+ "epoch": 12.0,
125
+ "train_loss": 35.92404344346788,
126
+ "val_loss": 40.78456687927246,
127
+ "val_mae": 3.4662928581237793,
128
+ "val_mse": 15.61866283416748,
129
+ "val_directional_accuracy": 0.5080167271784233,
130
+ "val_flattened_ic": 0.002791623376575148,
131
+ "val_cross_sectional_ic": 0.010330648263476008,
132
+ "val_cross_sectional_rank_ic": 0.010109086902942002
133
+ },
134
+ {
135
+ "epoch": 13.0,
136
+ "train_loss": 35.91519652472602,
137
+ "val_loss": 40.635114669799805,
138
+ "val_mae": 3.5329291820526123,
139
+ "val_mse": 16.112895965576172,
140
+ "val_directional_accuracy": 0.5080167271784233,
141
+ "val_flattened_ic": 0.004213413893204711,
142
+ "val_cross_sectional_ic": 0.00952933497620134,
143
+ "val_cross_sectional_rank_ic": 0.010670364318472528
144
+ },
145
+ {
146
+ "epoch": 14.0,
147
+ "train_loss": 35.848304960462784,
148
+ "val_loss": 40.73093318939209,
149
+ "val_mae": 3.5100510120391846,
150
+ "val_mse": 15.946887969970703,
151
+ "val_directional_accuracy": 0.5080167271784233,
152
+ "val_flattened_ic": 0.00392609038899626,
153
+ "val_cross_sectional_ic": 0.008849087968878637,
154
+ "val_cross_sectional_rank_ic": 0.010017295572957288
155
+ },
156
+ {
157
+ "epoch": 15.0,
158
+ "train_loss": 35.82760238647461,
159
+ "val_loss": 40.43489170074463,
160
+ "val_mae": 3.625938892364502,
161
+ "val_mse": 16.810781478881836,
162
+ "val_directional_accuracy": 0.5080167271784233,
163
+ "val_flattened_ic": 0.00781645433054024,
164
+ "val_cross_sectional_ic": 0.010207095669747703,
165
+ "val_cross_sectional_rank_ic": 0.011286190060212772
166
+ },
167
+ {
168
+ "epoch": 16.0,
169
+ "train_loss": 35.766165839301216,
170
+ "val_loss": 40.554080963134766,
171
+ "val_mae": 3.5608644485473633,
172
+ "val_mse": 16.3228759765625,
173
+ "val_directional_accuracy": 0.5080167271784233,
174
+ "val_flattened_ic": 0.0064557249490545835,
175
+ "val_cross_sectional_ic": 0.009355821729599345,
176
+ "val_cross_sectional_rank_ic": 0.010908446557264528
177
+ },
178
+ {
179
+ "epoch": 17.0,
180
+ "train_loss": 35.79002337985568,
181
+ "val_loss": 40.70481204986572,
182
+ "val_mae": 3.5340394973754883,
183
+ "val_mse": 16.12973976135254,
184
+ "val_directional_accuracy": 0.5080167271784233,
185
+ "val_flattened_ic": 0.005141178299342731,
186
+ "val_cross_sectional_ic": 0.00909001187852127,
187
+ "val_cross_sectional_rank_ic": 0.010601825492153622
188
+ },
189
+ {
190
+ "epoch": 18.0,
191
+ "train_loss": 35.705347273084854,
192
+ "val_loss": 40.6538782119751,
193
+ "val_mae": 3.553518533706665,
194
+ "val_mse": 16.27594566345215,
195
+ "val_directional_accuracy": 0.5080167271784233,
196
+ "val_flattened_ic": 0.004920604161290905,
197
+ "val_cross_sectional_ic": 0.009183120655085818,
198
+ "val_cross_sectional_rank_ic": 0.010772928821015191
199
+ },
200
+ {
201
+ "epoch": 19.0,
202
+ "train_loss": 35.71415985955132,
203
+ "val_loss": 40.60822868347168,
204
+ "val_mae": 3.5670886039733887,
205
+ "val_mse": 16.373994827270508,
206
+ "val_directional_accuracy": 0.5080167271784233,
207
+ "val_flattened_ic": 0.005817315295070838,
208
+ "val_cross_sectional_ic": 0.0091734453730104,
209
+ "val_cross_sectional_rank_ic": 0.010696151686269615
210
+ },
211
+ {
212
+ "epoch": 20.0,
213
+ "train_loss": 35.677709897359215,
214
+ "val_loss": 40.61790466308594,
215
+ "val_mae": 3.563636541366577,
216
+ "val_mse": 16.348026275634766,
217
+ "val_directional_accuracy": 0.5080167271784233,
218
+ "val_flattened_ic": 0.00564756208816658,
219
+ "val_cross_sectional_ic": 0.0090889727632987,
220
+ "val_cross_sectional_rank_ic": 0.010605920272673385
221
+ }
222
+ ]