Skip to content

Commit 4bfc891

Browse files
authored
Merge pull request microsoft#329 from D-X-Y/main
Fix Various Bugs for contrib.pytorch_ models
2 parents 08fefd5 + 70fc945 commit 4bfc891

File tree

15 files changed

+119
-99
lines changed

15 files changed

+119
-99
lines changed

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,5 @@ tags
3636
.vscode/
3737

3838
*.swp
39+
40+
./pretrain

examples/benchmarks/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ The numbers shown below demonstrate the performance of the entire `workflow` of
1717
| ALSTM (Yao Qin, et al.) | Alpha360 | 0.0493±0.01 | 0.3778±0.06| 0.0585±0.00 | 0.4606±0.04 | 0.0513±0.03 | 0.6727±0.38| -0.1085±0.02 |
1818
| GATs (Petar Velickovic, et al.) | Alpha360 | 0.0475±0.00 | 0.3515±0.02| 0.0592±0.00 | 0.4585±0.01 | 0.0876±0.02 | 1.1513±0.27| -0.0795±0.02 |
1919
| DoubleEnsemble (Chuheng Zhang, et al.) | Alpha360 | 0.0407±0.00| 0.3053±0.00 | 0.0490±0.00 | 0.3840±0.00 | 0.0380±0.02 | 0.5000±0.21 | -0.0984±0.02 |
20+
2021
## Alpha158 dataset
2122
| Model Name | Dataset | IC | ICIR | Rank IC | Rank ICIR | Annualized Return | Information Ratio | Max Drawdown |
2223
|---|---|---|---|---|---|---|---|---|
@@ -25,7 +26,6 @@ The numbers shown below demonstrate the performance of the entire `workflow` of
2526
| XGBoost (Tianqi Chen, et al.) | Alpha158 | 0.0481±0.00 | 0.3659±0.00| 0.0495±0.00 | 0.4033±0.00 | 0.1111±0.00 | 1.2915±0.00| -0.0893±0.00 |
2627
| LightGBM (Guolin Ke, et al.) | Alpha158 | 0.0475±0.00 | 0.3979±0.00| 0.0485±0.00 | 0.4123±0.00 | 0.1143±0.00 | 1.2744±0.00| -0.0800±0.00 |
2728
| MLP | Alpha158 | 0.0358±0.00 | 0.2738±0.03| 0.0425±0.00 | 0.3221±0.01 | 0.0836±0.02 | 1.0323±0.25| -0.1127±0.02 |
28-
| TabNet with pretrain (Sercan O. Arikm et al) | Alpha158 | 0.0344±0.00|0.205±0.11|0.0398±0.00 |0.3479±0.01|0.0827±0.02|1.1141±0.32 |-0.0925±0.02 |
2929
| TFT (Bryan Lim, et al.) | Alpha158 (with selected 20 features) | 0.0343±0.00 | 0.2071±0.02| 0.0107±0.00 | 0.0660±0.02 | 0.0623±0.02 | 0.5818±0.20| -0.1762±0.01 |
3030
| GRU (Kyunghyun Cho, et al.) | Alpha158 (with selected 20 features) | 0.0311±0.00 | 0.2418±0.04| 0.0425±0.00 | 0.3434±0.02 | 0.0330±0.02 | 0.4805±0.30| -0.1021±0.02 |
3131
| LSTM (Sepp Hochreiter, et al.) | Alpha158 (with selected 20 features) | 0.0312±0.00 | 0.2394±0.04| 0.0418±0.00 | 0.3324±0.03 | 0.0298±0.02 | 0.4198±0.33| -0.1348±0.03 |
-1.86 MB
Binary file not shown.

examples/benchmarks/TabNet/workflow_config_TabNet_Alpha158.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ task:
5555
kwargs: *data_handler_config
5656
segments:
5757
pretrain: [2008-01-01, 2014-12-31]
58-
pretrain_validation: [2015-01-01, 2020-08-01]
58+
pretrain_validation: [2015-01-01, 2016-12-31]
5959
train: [2008-01-01, 2014-12-31]
6060
valid: [2015-01-01, 2016-12-31]
6161
test: [2017-01-01, 2020-08-01]

qlib/contrib/model/pytorch_alstm.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ def __init__(
7878
self.optimizer = optimizer.lower()
7979
self.loss = loss
8080
self.device = torch.device("cuda:%d" % (GPU) if torch.cuda.is_available() and GPU >= 0 else "cpu")
81-
self.use_gpu = torch.cuda.is_available()
8281
self.seed = seed
8382

8483
self.logger.info(
@@ -94,7 +93,7 @@ def __init__(
9493
"\nearly_stop : {}"
9594
"\noptimizer : {}"
9695
"\nloss_type : {}"
97-
"\nvisible_GPU : {}"
96+
"\ndevice : {}"
9897
"\nuse_GPU : {}"
9998
"\nseed : {}".format(
10099
d_feat,
@@ -108,7 +107,7 @@ def __init__(
108107
early_stop,
109108
optimizer.lower(),
110109
loss,
111-
GPU,
110+
self.device,
112111
self.use_gpu,
113112
seed,
114113
)
@@ -137,6 +136,10 @@ def __init__(
137136
self.fitted = False
138137
self.ALSTM_model.to(self.device)
139138

139+
@property
140+
def use_gpu(self):
141+
return self.device != torch.device("cpu")
142+
140143
def mse(self, pred, label):
141144
loss = (pred - label) ** 2
142145
return torch.mean(loss)
@@ -205,12 +208,13 @@ def test_epoch(self, data_x, data_y):
205208
feature = torch.from_numpy(x_values[indices[i : i + self.batch_size]]).float().to(self.device)
206209
label = torch.from_numpy(y_values[indices[i : i + self.batch_size]]).float().to(self.device)
207210

208-
pred = self.ALSTM_model(feature)
209-
loss = self.loss_fn(pred, label)
210-
losses.append(loss.item())
211+
with torch.no_grad():
212+
pred = self.ALSTM_model(feature)
213+
loss = self.loss_fn(pred, label)
214+
losses.append(loss.item())
211215

212-
score = self.metric_fn(pred, label)
213-
scores.append(score.item())
216+
score = self.metric_fn(pred, label)
217+
scores.append(score.item())
214218

215219
return np.mean(losses), np.mean(scores)
216220

@@ -292,10 +296,7 @@ def predict(self, dataset):
292296
x_batch = torch.from_numpy(x_values[begin:end]).float().to(self.device)
293297

294298
with torch.no_grad():
295-
if self.use_gpu:
296-
pred = self.ALSTM_model(x_batch).detach().cpu().numpy()
297-
else:
298-
pred = self.ALSTM_model(x_batch).detach().numpy()
299+
pred = self.ALSTM_model(x_batch).detach().cpu().numpy()
299300

300301
preds.append(pred)
301302

qlib/contrib/model/pytorch_alstm_ts.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ def __init__(
8181
self.loss = loss
8282
self.device = torch.device("cuda:%d" % (GPU) if torch.cuda.is_available() and GPU >= 0 else "cpu")
8383
self.n_jobs = n_jobs
84-
self.use_gpu = torch.cuda.is_available()
8584
self.seed = seed
8685

8786
self.logger.info(
@@ -97,7 +96,7 @@ def __init__(
9796
"\nearly_stop : {}"
9897
"\noptimizer : {}"
9998
"\nloss_type : {}"
100-
"\nvisible_GPU : {}"
99+
"\ndevice : {}"
101100
"\nn_jobs : {}"
102101
"\nuse_GPU : {}"
103102
"\nseed : {}".format(
@@ -112,7 +111,7 @@ def __init__(
112111
early_stop,
113112
optimizer.lower(),
114113
loss,
115-
GPU,
114+
self.device,
116115
n_jobs,
117116
self.use_gpu,
118117
seed,
@@ -142,6 +141,10 @@ def __init__(
142141
self.fitted = False
143142
self.ALSTM_model.to(self.device)
144143

144+
@property
145+
def use_gpu(self):
146+
return self.device != torch.device("cpu")
147+
145148
def mse(self, pred, label):
146149
loss = (pred - label) ** 2
147150
return torch.mean(loss)
@@ -192,12 +195,13 @@ def test_epoch(self, data_loader):
192195
# feature[torch.isnan(feature)] = 0
193196
label = data[:, -1, -1].to(self.device)
194197

195-
pred = self.ALSTM_model(feature.float())
196-
loss = self.loss_fn(pred, label)
197-
losses.append(loss.item())
198+
with torch.no_grad():
199+
pred = self.ALSTM_model(feature.float())
200+
loss = self.loss_fn(pred, label)
201+
losses.append(loss.item())
198202

199-
score = self.metric_fn(pred, label)
200-
scores.append(score.item())
203+
score = self.metric_fn(pred, label)
204+
scores.append(score.item())
201205

202206
return np.mean(losses), np.mean(scores)
203207

@@ -277,10 +281,7 @@ def predict(self, dataset):
277281
feature = data[:, :, 0:-1].to(self.device)
278282

279283
with torch.no_grad():
280-
if self.use_gpu:
281-
pred = self.ALSTM_model(feature.float()).detach().cpu().numpy()
282-
else:
283-
pred = self.ALSTM_model(feature.float()).detach().numpy()
284+
pred = self.ALSTM_model(feature.float()).detach().cpu().numpy()
284285

285286
preds.append(pred)
286287

qlib/contrib/model/pytorch_gats.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ def __init__(
103103
"\nbase_model : {}"
104104
"\nwith_pretrain : {}"
105105
"\nmodel_path : {}"
106-
"\nvisible_GPU : {}"
106+
"\ndevice : {}"
107107
"\nuse_GPU : {}"
108108
"\nseed : {}".format(
109109
d_feat,
@@ -119,7 +119,7 @@ def __init__(
119119
base_model,
120120
with_pretrain,
121121
model_path,
122-
GPU,
122+
self.device,
123123
self.use_gpu,
124124
seed,
125125
)
@@ -149,6 +149,10 @@ def __init__(
149149
self.fitted = False
150150
self.GAT_model.to(self.device)
151151

152+
@property
153+
def use_gpu(self):
154+
return self.device != torch.device("cpu")
155+
152156
def mse(self, pred, label):
153157
loss = (pred - label) ** 2
154158
return torch.mean(loss)
@@ -326,10 +330,7 @@ def predict(self, dataset):
326330
x_batch = torch.from_numpy(x_values[batch]).float().to(self.device)
327331

328332
with torch.no_grad():
329-
if self.use_gpu:
330-
pred = self.GAT_model(x_batch).detach().cpu().numpy()
331-
else:
332-
pred = self.GAT_model(x_batch).detach().numpy()
333+
pred = self.GAT_model(x_batch).detach().cpu().numpy()
333334

334335
preds.append(pred)
335336

qlib/contrib/model/pytorch_gats_ts.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,6 @@ def __init__(
107107
self.model_path = model_path
108108
self.device = torch.device("cuda:%d" % (GPU) if torch.cuda.is_available() and GPU >= 0 else "cpu")
109109
self.n_jobs = n_jobs
110-
self.use_gpu = torch.cuda.is_available()
111110
self.seed = seed
112111

113112
self.logger.info(
@@ -171,6 +170,10 @@ def __init__(
171170
self.fitted = False
172171
self.GAT_model.to(self.device)
173172

173+
@property
174+
def use_gpu(self):
175+
return self.device != torch.device("cpu")
176+
174177
def mse(self, pred, label):
175178
loss = (pred - label) ** 2
176179
return torch.mean(loss)
@@ -347,10 +350,7 @@ def predict(self, dataset):
347350
feature = data[:, :, 0:-1].to(self.device)
348351

349352
with torch.no_grad():
350-
if self.use_gpu:
351-
pred = self.GAT_model(feature.float()).detach().cpu().numpy()
352-
else:
353-
pred = self.GAT_model(feature.float()).detach().numpy()
353+
pred = self.GAT_model(feature.float()).detach().cpu().numpy()
354354

355355
preds.append(pred)
356356

qlib/contrib/model/pytorch_gru.py

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ def __init__(
7878
self.optimizer = optimizer.lower()
7979
self.loss = loss
8080
self.device = torch.device("cuda:%d" % (GPU) if torch.cuda.is_available() and GPU >= 0 else "cpu")
81-
self.use_gpu = torch.cuda.is_available()
8281
self.seed = seed
8382

8483
self.logger.info(
@@ -137,6 +136,10 @@ def __init__(
137136
self.fitted = False
138137
self.gru_model.to(self.device)
139138

139+
@property
140+
def use_gpu(self):
141+
return self.device != torch.device("cpu")
142+
140143
def mse(self, pred, label):
141144
loss = (pred - label) ** 2
142145
return torch.mean(loss)
@@ -205,12 +208,13 @@ def test_epoch(self, data_x, data_y):
205208
feature = torch.from_numpy(x_values[indices[i : i + self.batch_size]]).float().to(self.device)
206209
label = torch.from_numpy(y_values[indices[i : i + self.batch_size]]).float().to(self.device)
207210

208-
pred = self.gru_model(feature)
209-
loss = self.loss_fn(pred, label)
210-
losses.append(loss.item())
211+
with torch.no_grad():
212+
pred = self.gru_model(feature)
213+
loss = self.loss_fn(pred, label)
214+
losses.append(loss.item())
211215

212-
score = self.metric_fn(pred, label)
213-
scores.append(score.item())
216+
score = self.metric_fn(pred, label)
217+
scores.append(score.item())
214218

215219
return np.mean(losses), np.mean(scores)
216220

@@ -292,10 +296,7 @@ def predict(self, dataset):
292296
x_batch = torch.from_numpy(x_values[begin:end]).float().to(self.device)
293297

294298
with torch.no_grad():
295-
if self.use_gpu:
296-
pred = self.gru_model(x_batch).detach().cpu().numpy()
297-
else:
298-
pred = self.gru_model(x_batch).detach().numpy()
299+
pred = self.gru_model(x_batch).detach().cpu().numpy()
299300

300301
preds.append(pred)
301302

qlib/contrib/model/pytorch_gru_ts.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,6 @@ def __init__(
8181
self.loss = loss
8282
self.device = torch.device("cuda:%d" % (GPU) if torch.cuda.is_available() and GPU >= 0 else "cpu")
8383
self.n_jobs = n_jobs
84-
self.use_gpu = torch.cuda.is_available()
8584
self.seed = seed
8685

8786
self.logger.info(
@@ -97,7 +96,7 @@ def __init__(
9796
"\nearly_stop : {}"
9897
"\noptimizer : {}"
9998
"\nloss_type : {}"
100-
"\nvisible_GPU : {}"
99+
"\ndevice : {}"
101100
"\nn_jobs : {}"
102101
"\nuse_GPU : {}"
103102
"\nseed : {}".format(
@@ -112,7 +111,7 @@ def __init__(
112111
early_stop,
113112
optimizer.lower(),
114113
loss,
115-
GPU,
114+
self.device,
116115
n_jobs,
117116
self.use_gpu,
118117
seed,
@@ -142,6 +141,10 @@ def __init__(
142141
self.fitted = False
143142
self.GRU_model.to(self.device)
144143

144+
@property
145+
def use_gpu(self):
146+
return self.device != torch.device("cpu")
147+
145148
def mse(self, pred, label):
146149
loss = (pred - label) ** 2
147150
return torch.mean(loss)
@@ -192,12 +195,13 @@ def test_epoch(self, data_loader):
192195
# feature[torch.isnan(feature)] = 0
193196
label = data[:, -1, -1].to(self.device)
194197

195-
pred = self.GRU_model(feature.float())
196-
loss = self.loss_fn(pred, label)
197-
losses.append(loss.item())
198+
with torch.no_grad():
199+
pred = self.GRU_model(feature.float())
200+
loss = self.loss_fn(pred, label)
201+
losses.append(loss.item())
198202

199-
score = self.metric_fn(pred, label)
200-
scores.append(score.item())
203+
score = self.metric_fn(pred, label)
204+
scores.append(score.item())
201205

202206
return np.mean(losses), np.mean(scores)
203207

@@ -277,10 +281,7 @@ def predict(self, dataset):
277281
feature = data[:, :, 0:-1].to(self.device)
278282

279283
with torch.no_grad():
280-
if self.use_gpu:
281-
pred = self.GRU_model(feature.float()).detach().cpu().numpy()
282-
else:
283-
pred = self.GRU_model(feature.float()).detach().numpy()
284+
pred = self.GRU_model(feature.float()).detach().cpu().numpy()
284285

285286
preds.append(pred)
286287

0 commit comments

Comments
 (0)