diff --git a/data_provider/data_loader.py b/data_provider/data_loader.py index 47b20b9..5fb1316 100644 --- a/data_provider/data_loader.py +++ b/data_provider/data_loader.py @@ -229,6 +229,7 @@ class Dataset_Custom(Dataset): cols = list(df_raw.columns) cols.remove(self.target) cols.remove('date') + self.cols = ['date'] + cols + [self.target] df_raw = df_raw[['date'] + cols + [self.target]] # print(cols) num_train = int(len(df_raw) * 0.7) @@ -244,6 +245,11 @@ class Dataset_Custom(Dataset): df_data = df_raw[cols_data] elif self.features == 'S': df_data = df_raw[[self.target]] + elif self.features == 'M2S': + df_data = df_raw[cols + [self.target]] + self.n_dims = 1 # len(cols + [self.target]) + else: + raise NotImplementedError(self.features) if self.scale: train_data = df_data[border1s[0]:border2s[0]] @@ -265,8 +271,15 @@ class Dataset_Custom(Dataset): data_stamp = data_stamp.transpose(1, 0) self.data_x = data[border1:border2] - self.data_y = data[border1:border2] + self.dates = df_raw['date'][border1:border2] + # self.data_y = data[border1:border2] + # y is just the col we predict + self.data_y = data[border1:border2][:, [-1]] self.data_stamp = data_stamp + + # TODO check this is right. For example check that it makes the df + o = self.seq_len - self.label_len # + self.label_len + self.index = self.dates.iloc[o:].iloc[:len(self)] def __getitem__(self, index): s_begin = index diff --git a/exp/exp_main.py b/exp/exp_main.py index 839f93e..88299b3 100644 --- a/exp/exp_main.py +++ b/exp/exp_main.py @@ -5,6 +5,8 @@ from utils.tools import EarlyStopping, adjust_learning_rate from utils.metrics import metric from utils.Adam import Adam +from tqdm.auto import tqdm + import numpy as np import torch import torch.nn as nn @@ -121,58 +123,64 @@ class Exp_Main(Exp_Basic): model_optim = self._select_optimizer() criterion = self._select_criterion() - for epoch in range(self.args.train_epochs): - iter_count = 0 - train_loss = [] + with tqdm(unit='epoch', total=self.args.train_epochs) as p: + for epoch in range(self.args.train_epochs): + iter_count = 0 + train_loss = [] - self.model.train() - epoch_time = time.time() - for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(train_loader): - iter_count += 1 - model_optim.zero_grad() - batch_x = batch_x.float().to(self.device) + self.model.train() + epoch_time = time.time() + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(tqdm(train_loader, leave=False, desc='train')): + iter_count += 1 + model_optim.zero_grad() + batch_x = batch_x.float().to(self.device) - batch_y = batch_y.float().to(self.device) - batch_x_mark = batch_x_mark.float().to(self.device) - batch_y_mark = batch_y_mark.float().to(self.device) + batch_y = batch_y.float().to(self.device) + batch_x_mark = batch_x_mark.float().to(self.device) + batch_y_mark = batch_y_mark.float().to(self.device) - # decoder input - dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() - dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) + # decoder input + dec_inp = torch.zeros_like(batch_y[:, -self.args.pred_len:, :]).float() + dec_inp = torch.cat([batch_y[:, :self.args.label_len, :], dec_inp], dim=1).float().to(self.device) - # encoder - decoder - outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) + # encoder - decoder + outputs = self.model(batch_x, batch_x_mark, dec_inp, batch_y_mark) - f_dim = -1 if self.args.features == 'MS' else 0 - batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) - loss = criterion(outputs, batch_y) - train_loss.append(loss.item()) + f_dim = -1 if self.args.features == 'MS' else 0 + batch_y = batch_y[:, -self.args.pred_len:, f_dim:].to(self.device) + loss = criterion(outputs, batch_y) + train_loss.append(loss.item()) - if (i + 1) % 100 == 0: - print("\titers: {0}, epoch: {1} | loss: {2:.7f}".format(i + 1, epoch + 1, loss.item())) - speed = (time.time() - time_now) / iter_count - left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i) - print('\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time)) - iter_count = 0 - time_now = time.time() + # if (i + 1) % 10 == 0: + # print("\titers: {0}, epoch: {1} | loss: {2:.7f}".format(i + 1, epoch + 1, loss.item())) + # speed = (time.time() - time_now) / iter_count + # left_time = speed * ((self.args.train_epochs - epoch) * train_steps - i) + # print('\tspeed: {:.4f}s/iter; left time: {:.4f}s'.format(speed, left_time)) + # iter_count = 0 + # time_now = time.time() + + # p.desc = f'loss: {loss.item():.7f}' + - loss.backward() - torch.nn.utils.clip_grad_norm(self.model.parameters(), 1.0) - model_optim.step() + loss.backward() + torch.nn.utils.clip_grad_norm(self.model.parameters(), 1.0) + model_optim.step() - print("Epoch: {} cost time: {}".format(epoch + 1, time.time() - epoch_time)) - train_loss = np.average(train_loss) - vali_loss = self.vali(vali_data, vali_loader, criterion) - test_loss = self.vali(test_data, test_loader, criterion) + print("Epoch: {} cost time: {}".format(epoch + 1, time.time() - epoch_time)) + train_loss = np.average(train_loss) + vali_loss = self.vali(vali_data, vali_loader, criterion) + test_loss = self.vali(test_data, test_loader, criterion) - print("Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}".format( - epoch + 1, train_steps, train_loss, vali_loss, test_loss)) - early_stopping(vali_loss, self.model, path) - if early_stopping.early_stop: - print("Early stopping") - break + p.update() + p.desc = f'Train Loss: {test_loss:.7f} Vali Loss: {vali_loss:.7f}' + print("Epoch: {0}, Steps: {1} | Train Loss: {2:.7f} Vali Loss: {3:.7f} Test Loss: {4:.7f}".format( + epoch + 1, train_steps, train_loss, vali_loss, test_loss)) + early_stopping(vali_loss, self.model, path) + if early_stopping.early_stop: + print("Early stopping") + break - adjust_learning_rate(model_optim, epoch + 1, self.args) + adjust_learning_rate(model_optim, epoch + 1, self.args) best_model_path = path + '/' + 'checkpoint.pth' self.model.load_state_dict(torch.load(best_model_path)) @@ -191,7 +199,7 @@ class Exp_Main(Exp_Basic): self.model.eval() with torch.no_grad(): - for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(test_loader): + for i, (batch_x, batch_y, batch_x_mark, batch_y_mark) in enumerate(tqdm(test_loader, leave=False)): batch_x = batch_x.float().to(self.device) batch_y = batch_y.float().to(self.device) @@ -237,4 +245,4 @@ class Exp_Main(Exp_Basic): np.save(folder_path + 'pred.npy', preds) np.save(folder_path + 'true.npy', trues) - return + return preds, trues diff --git a/mjc_notes.md b/mjc_notes.md index 045a745..e34c30c 100644 --- a/mjc_notes.md +++ b/mjc_notes.md @@ -2,6 +2,6 @@ TODO: -- [ ] run on stocks data -- [ ] multivariate in, univariate out -- [ ] graph +- [x] run on stocks data +- [x] multivariate in, univariate out +- [x] graph diff --git a/models/etsformer/encoder.py b/models/etsformer/encoder.py index bcac64e..67ab3f2 100644 --- a/models/etsformer/encoder.py +++ b/models/etsformer/encoder.py @@ -183,6 +183,10 @@ class EncoderLayer(nn.Module): self.dropout2 = nn.Dropout(dropout) def forward(self, res, level, attn_mask=None): + + # when c_in!=c_out assume target columns are at end of channels + level = level[:, :, -self.c_out:] + season, season_attn = self._season_block(res) res = res - season[:, :-self.pred_len] growth, growth_attn = self._growth_block(res) diff --git a/models/etsformer/model.py b/models/etsformer/model.py index 3da1488..67c9169 100644 --- a/models/etsformer/model.py +++ b/models/etsformer/model.py @@ -73,6 +73,7 @@ class ETSformer(nn.Module): if self.training: x_enc = self.transform.transform(x_enc) res = self.enc_embedding(x_enc) + level, growths, seasons, season_attns, growth_attns = self.encoder(res, x_enc, attn_mask=enc_self_mask) growth, season, growth_dampings = self.decoder(growths, seasons) diff --git a/notebooks/001_001_run.ipynb b/notebooks/001_001_run.ipynb index c5e842d..45166cd 100644 --- a/notebooks/001_001_run.ipynb +++ b/notebooks/001_001_run.ipynb @@ -2,12 +2,12 @@ "cells": [ { "cell_type": "code", - "execution_count": 3, - "id": "cbdce1e4", + "execution_count": 1, + "id": "1d040af6", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T04:13:58.128994Z", - "start_time": "2022-11-28T04:13:58.127086Z" + "end_time": "2022-11-28T05:46:17.187327Z", + "start_time": "2022-11-28T05:46:17.185131Z" } }, "outputs": [], @@ -18,12 +18,12 @@ }, { "cell_type": "code", - "execution_count": 4, - "id": "1640aab2", + "execution_count": 2, + "id": "cab28167", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T04:13:58.305698Z", - "start_time": "2022-11-28T04:13:58.287564Z" + "end_time": "2022-11-28T05:46:17.217163Z", + "start_time": "2022-11-28T05:46:17.188560Z" } }, "outputs": [], @@ -38,12 +38,12 @@ }, { "cell_type": "code", - "execution_count": 9, - "id": "649ddfa9", + "execution_count": 3, + "id": "556c42a6", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T04:14:16.865244Z", - "start_time": "2022-11-28T04:14:16.858147Z" + "end_time": "2022-11-28T05:46:17.237413Z", + "start_time": "2022-11-28T05:46:17.218193Z" } }, "outputs": [], @@ -57,7 +57,7 @@ }, { "cell_type": "markdown", - "id": "bc96a9a7", + "id": "533ea89c", "metadata": {}, "source": [ "# Args" @@ -65,12 +65,12 @@ }, { "cell_type": "code", - "execution_count": 23, - "id": "7fcd9d4f", + "execution_count": 4, + "id": "67547b3d", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T04:18:43.064910Z", - "start_time": "2022-11-28T04:18:43.050776Z" + "end_time": "2022-11-28T05:46:18.208460Z", + "start_time": "2022-11-28T05:46:17.239067Z" } }, "outputs": [], @@ -80,12 +80,12 @@ }, { "cell_type": "code", - "execution_count": 51, - "id": "0602682d", + "execution_count": 5, + "id": "313dc79a", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T05:00:16.840051Z", - "start_time": "2022-11-28T05:00:16.816918Z" + "end_time": "2022-11-28T05:46:18.229834Z", + "start_time": "2022-11-28T05:46:18.209523Z" } }, "outputs": [ @@ -94,16 +94,16 @@ "output_type": "stream", "text": [ "Args in experiment:\n", - "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=12, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=12, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=12, features='M', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=10, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=128, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n" + "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=12, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=12, features='M', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=10, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=128, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)\n" ] }, { "data": { "text/plain": [ - "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=12, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=12, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=12, features='M', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=10, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=128, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)" + "Namespace(K=0, activation='sigmoid', batch_size=32, c_out=1, checkpoints='./checkpoints/', d_ff=2048, d_layers=2, d_model=512, damping_learning_rate=0, data='custom', data_path='OXY_2019.csv.gz', dec_in=12, des=\"'Exp'\", devices='0,1,2,3', dropout=0.2, e_layers=2, embed='timeF', enc_in=12, features='M', freq='h', gpu=0, itr=1, label_len=0, learning_rate=0.001, lradj='exponential_with_warmup', min_lr=1e-30, model='ETSformer', model_id='Exchange', n_heads=8, num_workers=10, optim='adam', output_attention=False, patience=5, pred_len=48, root_path='../dataset/stocks/', seq_len=128, smoothing_learning_rate=0, std=0.2, target='RSMKs_18_144_72_2ref_2ref', train_epochs=15, use_gpu=True, use_multi_gpu=False, warmup_epochs=3)" ] }, - "execution_count": 51, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -124,7 +124,7 @@ " --d_layers 2 \\\n", " --enc_in 12 \\\n", " --dec_in 12 \\\n", - " --c_out 12 \\\n", + " --c_out 1 \\\n", " --des 'Exp' \\\n", " --K 0 \\\n", " --learning_rate 1e-3 \\\n", @@ -138,24 +138,27 @@ }, { "cell_type": "code", - "execution_count": null, - "id": "7367a3cb", + "execution_count": 6, + "id": "232703ad", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T04:24:49.799842Z", - "start_time": "2022-11-28T04:24:49.783939Z" + "end_time": "2022-11-28T05:46:18.253534Z", + "start_time": "2022-11-28T05:46:18.230838Z" } }, "outputs": [], - "source": [] + "source": [ + "import torch" + ] }, { "cell_type": "code", - "execution_count": null, - "id": "93ed3ca8", + "execution_count": 7, + "id": "6bf4a662", "metadata": { "ExecuteTime": { - "start_time": "2022-11-28T05:00:17.097Z" + "end_time": "2022-11-28T05:47:47.495770Z", + "start_time": "2022-11-28T05:46:18.254440Z" } }, "outputs": [ @@ -168,138 +171,98 @@ ">>>>>>>start training : Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0>>>>>>>>>>>>>>>>>>>>>>>>>>\n", "train 37203\n", "val 5294\n", - "test 10632\n", - "\titers: 100, epoch: 1 | loss: 0.4932106\n", - "\tspeed: 0.0565s/iter; left time: 978.9201s\n", - "\titers: 200, epoch: 1 | loss: 0.4972929\n", - "\tspeed: 0.0485s/iter; left time: 835.0221s\n", - "\titers: 300, epoch: 1 | loss: 0.4357589\n", - "\tspeed: 0.0476s/iter; left time: 815.1622s\n", - "\titers: 400, epoch: 1 | loss: 0.5983973\n", - "\tspeed: 0.0477s/iter; left time: 811.9901s\n", - "\titers: 500, epoch: 1 | loss: 0.6287826\n", - "\tspeed: 0.0484s/iter; left time: 820.1333s\n", - "\titers: 600, epoch: 1 | loss: 0.4684563\n", - "\tspeed: 0.0488s/iter; left time: 821.1888s\n", - "\titers: 700, epoch: 1 | loss: 1.0543735\n", - "\tspeed: 0.0484s/iter; left time: 810.2026s\n", - "\titers: 800, epoch: 1 | loss: 0.7420598\n", - "\tspeed: 0.0474s/iter; left time: 788.7177s\n", - "\titers: 900, epoch: 1 | loss: 0.5108218\n", - "\tspeed: 0.0474s/iter; left time: 784.3583s\n", - "\titers: 1000, epoch: 1 | loss: 0.5239242\n", - "\tspeed: 0.0505s/iter; left time: 830.0246s\n", - "\titers: 1100, epoch: 1 | loss: 0.8626059\n", - "\tspeed: 0.0468s/iter; left time: 764.9884s\n", - "Epoch: 1 cost time: 56.83964204788208\n", - "Epoch: 1, Steps: 1162 | Train Loss: 0.6849515 Vali Loss: 0.3407791 Test Loss: 0.4381559\n", - "Validation loss decreased (inf --> 0.340779). Saving model ...\n", - "Updating learning rate to 0.00025\n", - "\titers: 100, epoch: 2 | loss: 0.9436644\n", - "\tspeed: 0.1952s/iter; left time: 3155.9649s\n", - "\titers: 200, epoch: 2 | loss: 0.5133687\n", - "\tspeed: 0.0487s/iter; left time: 783.2851s\n", - "\titers: 300, epoch: 2 | loss: 0.6383107\n", - "\tspeed: 0.0482s/iter; left time: 770.3673s\n", - "\titers: 400, epoch: 2 | loss: 1.1335649\n", - "\tspeed: 0.0492s/iter; left time: 781.1069s\n", - "\titers: 500, epoch: 2 | loss: 0.5905243\n", - "\tspeed: 0.0467s/iter; left time: 736.0656s\n", - "\titers: 600, epoch: 2 | loss: 0.7256416\n", - "\tspeed: 0.0474s/iter; left time: 742.6376s\n", - "\titers: 700, epoch: 2 | loss: 0.5506995\n", - "\tspeed: 0.0478s/iter; left time: 744.2372s\n", - "\titers: 800, epoch: 2 | loss: 0.6441094\n", - "\tspeed: 0.0487s/iter; left time: 753.5581s\n", - "\titers: 900, epoch: 2 | loss: 0.3798619\n", - "\tspeed: 0.0487s/iter; left time: 748.4489s\n", - "\titers: 1000, epoch: 2 | loss: 0.4259658\n", - "\tspeed: 0.0479s/iter; left time: 731.2631s\n", - "\titers: 1100, epoch: 2 | loss: 0.5248989\n", - "\tspeed: 0.0491s/iter; left time: 745.1800s\n", - "Epoch: 2 cost time: 56.406978130340576\n", - "Epoch: 2, Steps: 1162 | Train Loss: 0.6076249 Vali Loss: 0.3033751 Test Loss: 0.3955314\n", - "Validation loss decreased (0.340779 --> 0.303375). Saving model ...\n", - "Updating learning rate to 0.0005\n", - "\titers: 100, epoch: 3 | loss: 0.4865443\n", - "\tspeed: 0.2002s/iter; left time: 3003.6628s\n", - "\titers: 200, epoch: 3 | loss: 0.5826065\n", - "\tspeed: 0.0493s/iter; left time: 734.4833s\n", - "\titers: 300, epoch: 3 | loss: 1.2626467\n", - "\tspeed: 0.0480s/iter; left time: 710.5487s\n", - "\titers: 400, epoch: 3 | loss: 0.4687002\n", - "\tspeed: 0.0472s/iter; left time: 694.2853s\n", - "\titers: 500, epoch: 3 | loss: 0.3959515\n", - "\tspeed: 0.0474s/iter; left time: 693.0790s\n", - "\titers: 600, epoch: 3 | loss: 0.4113244\n", - "\tspeed: 0.0490s/iter; left time: 710.3280s\n", - "\titers: 700, epoch: 3 | loss: 0.4114936\n", - "\tspeed: 0.0476s/iter; left time: 685.9448s\n", - "\titers: 800, epoch: 3 | loss: 0.5290235\n", - "\tspeed: 0.0475s/iter; left time: 679.7407s\n", - "\titers: 900, epoch: 3 | loss: 0.4256401\n", - "\tspeed: 0.0478s/iter; left time: 678.8945s\n", - "\titers: 1000, epoch: 3 | loss: 0.6996748\n", - "\tspeed: 0.0491s/iter; left time: 692.3603s\n", - "\titers: 1100, epoch: 3 | loss: 0.7242295\n", - "\tspeed: 0.0470s/iter; left time: 658.2708s\n", - "Epoch: 3 cost time: 56.2166702747345\n", - "Epoch: 3, Steps: 1162 | Train Loss: 0.5938104 Vali Loss: 0.3029587 Test Loss: 0.3915149\n", - "Validation loss decreased (0.303375 --> 0.302959). Saving model ...\n", - "Updating learning rate to 0.00075\n", - "\titers: 100, epoch: 4 | loss: 0.4237639\n", - "\tspeed: 0.1944s/iter; left time: 2691.7509s\n", - "\titers: 200, epoch: 4 | loss: 0.3838455\n", - "\tspeed: 0.0469s/iter; left time: 644.7742s\n", - "\titers: 300, epoch: 4 | loss: 0.5273813\n", - "\tspeed: 0.0465s/iter; left time: 635.0866s\n", - "\titers: 400, epoch: 4 | loss: 1.2923048\n", - "\tspeed: 0.0482s/iter; left time: 652.7872s\n", - "\titers: 500, epoch: 4 | loss: 0.6386693\n", - "\tspeed: 0.0488s/iter; left time: 656.6116s\n", - "\titers: 600, epoch: 4 | loss: 0.5111505\n", - "\tspeed: 0.0483s/iter; left time: 644.4140s\n", - "\titers: 700, epoch: 4 | loss: 0.5771207\n", - "\tspeed: 0.0470s/iter; left time: 622.1141s\n", - "\titers: 800, epoch: 4 | loss: 0.6522042\n", - "\tspeed: 0.0471s/iter; left time: 619.3240s\n", - "\titers: 900, epoch: 4 | loss: 0.3418834\n", - "\tspeed: 0.0474s/iter; left time: 618.8682s\n", - "\titers: 1000, epoch: 4 | loss: 0.4811396\n", - "\tspeed: 0.0470s/iter; left time: 608.9635s\n", - "\titers: 1100, epoch: 4 | loss: 0.6203826\n", - "\tspeed: 0.0476s/iter; left time: 611.6955s\n", - "Epoch: 4 cost time: 55.756075620651245\n", - "Epoch: 4, Steps: 1162 | Train Loss: 0.5855654 Vali Loss: 0.3044514 Test Loss: 0.3943208\n", - "EarlyStopping counter: 1 out of 5\n", - "Updating learning rate to 0.001\n", - "\titers: 100, epoch: 5 | loss: 0.7008136\n", - "\tspeed: 0.1930s/iter; left time: 2447.9230s\n", - "\titers: 200, epoch: 5 | loss: 0.7495702\n", - "\tspeed: 0.0493s/iter; left time: 620.2588s\n", - "\titers: 300, epoch: 5 | loss: 1.0079670\n", - "\tspeed: 0.0487s/iter; left time: 608.5033s\n", - "\titers: 400, epoch: 5 | loss: 0.3510064\n", - "\tspeed: 0.0482s/iter; left time: 596.2644s\n", - "\titers: 500, epoch: 5 | loss: 0.4754097\n", - "\tspeed: 0.0474s/iter; left time: 581.7234s\n", - "\titers: 600, epoch: 5 | loss: 0.7314481\n", - "\tspeed: 0.0493s/iter; left time: 600.1122s\n", - "\titers: 700, epoch: 5 | loss: 0.8495453\n", - "\tspeed: 0.0483s/iter; left time: 583.0922s\n", - "\titers: 800, epoch: 5 | loss: 0.3931953\n", - "\tspeed: 0.0474s/iter; left time: 567.6057s\n", - "\titers: 900, epoch: 5 | loss: 0.3912098\n", - "\tspeed: 0.0488s/iter; left time: 580.1831s\n", - "\titers: 1000, epoch: 5 | loss: 0.4786185\n", - "\tspeed: 0.0483s/iter; left time: 568.7581s\n", - "\titers: 1100, epoch: 5 | loss: 0.6882768\n", - "\tspeed: 0.0471s/iter; left time: 550.3884s\n", - "Epoch: 5 cost time: 56.28184771537781\n", - "Epoch: 5, Steps: 1162 | Train Loss: 0.5815187 Vali Loss: 0.3013998 Test Loss: 0.4001175\n", - "Validation loss decreased (0.302959 --> 0.301400). Saving model ...\n", + "test 10632\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "2d751538f3e247c2a91f791fa7baae23", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/15 [00:00 0.090723). Saving model ...\n", + "Updating learning rate to 0.00025\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1162 [00:00 0.041100). Saving model ...\n", "Updating learning rate to 0.0005\n" ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "d80eecb04557428d97c625019b8efa7b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "train: 0%| | 0/1162 [00:00>>>>>>start training : \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m>>>>>>>>>>>>>>>>>>>>>>>>>>\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mformat(setting))\n\u001b[0;32m---> 29\u001b[0m \u001b[43mexp\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrain\u001b[49m\u001b[43m(\u001b[49m\u001b[43msetting\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 31\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124m'\u001b[39m\u001b[38;5;124m>>>>>>>testing : \u001b[39m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;124m<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;241m.\u001b[39mformat(setting))\n\u001b[1;32m 32\u001b[0m exp\u001b[38;5;241m.\u001b[39mtest(setting, data\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mval\u001b[39m\u001b[38;5;124m'\u001b[39m)\n", + "File \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/ETSformer/notebooks/../exp/exp_main.py:165\u001b[0m, in \u001b[0;36mtrain\u001b[0;34m(self, setting)\u001b[0m\n\u001b[1;32m 163\u001b[0m \n\u001b[1;32m 164\u001b[0m \n\u001b[0;32m--> 165\u001b[0m loss.backward()\n\u001b[1;32m 166\u001b[0m torch.nn.utils.clip_grad_norm(self.model.parameters(), 1.0)\n\u001b[1;32m 167\u001b[0m model_optim.step()\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/torch/_tensor.py:307\u001b[0m, in \u001b[0;36mTensor.backward\u001b[0;34m(self, gradient, retain_graph, create_graph, inputs)\u001b[0m\n\u001b[1;32m 298\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m has_torch_function_unary(\u001b[38;5;28mself\u001b[39m):\n\u001b[1;32m 299\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m handle_torch_function(\n\u001b[1;32m 300\u001b[0m Tensor\u001b[38;5;241m.\u001b[39mbackward,\n\u001b[1;32m 301\u001b[0m (\u001b[38;5;28mself\u001b[39m,),\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 305\u001b[0m create_graph\u001b[38;5;241m=\u001b[39mcreate_graph,\n\u001b[1;32m 306\u001b[0m inputs\u001b[38;5;241m=\u001b[39minputs)\n\u001b[0;32m--> 307\u001b[0m \u001b[43mtorch\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mautograd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mbackward\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgradient\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43minputs\u001b[49m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/miniforge3/envs/deeptime/lib/python3.8/site-packages/torch/autograd/__init__.py:154\u001b[0m, in \u001b[0;36mbackward\u001b[0;34m(tensors, grad_tensors, retain_graph, create_graph, grad_variables, inputs)\u001b[0m\n\u001b[1;32m 151\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m retain_graph \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[1;32m 152\u001b[0m retain_graph \u001b[38;5;241m=\u001b[39m create_graph\n\u001b[0;32m--> 154\u001b[0m \u001b[43mVariable\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_execution_engine\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mrun_backward\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 155\u001b[0m \u001b[43m \u001b[49m\u001b[43mtensors\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mgrad_tensors_\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mretain_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcreate_graph\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minputs\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 156\u001b[0m \u001b[43m \u001b[49m\u001b[43mallow_unreachable\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maccumulate_grad\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", + "\u001b[0;31mKeyboardInterrupt\u001b[0m: " + ] } ], "source": [ @@ -344,19 +307,82 @@ { "cell_type": "code", "execution_count": null, - "id": "74745d73", - "metadata": {}, + "id": "c8947845", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:47:47.497131Z", + "start_time": "2022-11-28T05:47:47.497124Z" + } + }, "outputs": [], - "source": [] + "source": [ + "# %debug" + ] + }, + { + "cell_type": "markdown", + "id": "b529496b", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:28:20.356399Z", + "start_time": "2022-11-28T05:28:20.339961Z" + } + }, + "source": [ + "# Plot" + ] }, { "cell_type": "code", - "execution_count": 49, - "id": "2ed3cbf1", + "execution_count": 31, + "id": "a07a10fd", "metadata": { "ExecuteTime": { - "end_time": "2022-11-28T04:48:15.407951Z", - "start_time": "2022-11-28T04:48:13.634492Z" + "end_time": "2022-11-28T05:51:03.121425Z", + "start_time": "2022-11-28T05:51:03.105672Z" + } + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "from matplotlib import pyplot as plt\n", + "%matplotlib inline" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a6267ce1", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:48:08.164061Z", + "start_time": "2022-11-28T05:48:08.146923Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "\"Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0\"" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "setting" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "bf69de77", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:48:08.544320Z", + "start_time": "2022-11-28T05:48:08.385744Z" } }, "outputs": [ @@ -364,25 +390,1245 @@ "name": "stdout", "output_type": "stream", "text": [ - "> \u001b[0;32m/media/wassname/SGIronWolf/projects5/investing/ETSformer/models/etsformer/encoder.py\u001b[0m(155)\u001b[0;36mforward\u001b[0;34m()\u001b[0m\n", - "\u001b[0;32m 153 \u001b[0;31m \u001b[0mgrowth\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgrowth\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m 154 \u001b[0;31m \u001b[0mseason\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mseason\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m--> 155 \u001b[0;31m \u001b[0mlevel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlevel\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mview\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mc_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m 156 \u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mes\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mlevel\u001b[0m \u001b[0;34m-\u001b[0m \u001b[0mseason\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maux_values\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mgrowth\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\u001b[0;32m 157 \u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mrearrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mout\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'b t h d -> b t (h d)'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0m\n", - "ipdb> q\n" + "test 10632\n" ] } ], "source": [ - "%debug" + "ds, dl = exp._get_data('test')" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "51bde225", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:49:46.339799Z", + "start_time": "2022-11-28T05:49:41.251944Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "test 10632\n", + "loading model\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + " 0%| | 0/332 [00:00" + ] + }, + "execution_count": 147, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds[i]\n", + "l1 = batch_x.shape[0]\n", + "l2 = batch_y.shape[0]\n", + "plt.plot(range(l1), batch_x[:, -1], label='past')\n", + "plt.plot(range(l1, l1+l2), batch_y[:, -1], color='blue', ls='--', label='true')\n", + "plt.plot(range(l1, l1+l2), preds[i], label='pred');\n", + "plt.legend(loc='lower left')" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "id": "61c13dcd", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:49:46.470552Z", + "start_time": "2022-11-28T05:49:46.341940Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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ud1uDhw4QFRUFE5n061svPIOjtPppHfv3h59jcDAQP0HbiFdf2vp+ltL199auv6edbY7NyeokbGIiIjYjgKOiIiI2I4CTivz9/dn3rx5+Pv7W12KV9L1t5auv7V0/a2l69++eGUjYxEREbE33cERERER21HAEREREdtRwBERERHbUcARERER21HAaUWPPfYYMTExdO7cmeTkZAoKCqwuyZZWr17NddddR1RUFA6Hg3/84x8Nnne73fz2t78lMjKSLl26MHr0aLZs2WJNsTa0YMECLr/8crp3705YWBg33ngjJSUlDfaprq5m6tSp9OzZk27dujF+/Hj27NljUcX28vjjj3PZZZfVDyaXkpLCO++8U/+8rn3befjhh3E4HEybNq1+m65/+6GA00pefPFFZsyYwbx58/j0009JSEjgmmuuoby83OrSbOfQoUMkJCTw2GOPNfr8f/3Xf5Gdnc0TTzxBfn4+AQEBXHPNNVRXV7dxpfa0atUqpk6dyscff0xubi61tbWMHTuWQ4cO1e8zffp03nzzTV5++WVWrVrFrl27+MlPfmJh1fbRu3dvHn74YYqKivjkk08YNWoUN9xwAxs3bgR07dtKYWEhTz75JJdddlmD7br+7YhbWsXQoUPdU6dOrf/52LFj7qioKPeCBQssrMr+APdrr71W/7PL5XJHRES4H3nkkfpt+/fvd/v7+7v//ve/W1Ch/ZWXl7sB96pVq9xut7nenTp1cr/88sv1+2zatMkNuPPy8qwq09Z69Ojhfvrpp3Xt28iBAwfcF110kTs3N9c9cuRI93333ed2u/XffnujOzit4OjRoxQVFTF69Oj6bU6nk9GjR5OXl2dhZd7nq6++oqysrMHvIigoiOTkZP0uPKSyshKAkJAQAIqKiqitrW3wOxg4cCB9+vTR76CVHTt2jGXLlnHo0CFSUlJ07dvI1KlT+dGPftTgOoP+229vvHKyzda2b98+jh07Rnh4eIPt4eHhFBcXW1SVdyorKwNo9Hdx4jlpPS6Xi2nTpnHFFVdw6aWXAuZ34OfnR3BwcIN99TtoPV988QUpKSlUV1fTrVs3XnvtNeLj41m3bp2uvYctW7aMTz/9lMLCwtOe03/77YsCjoi02NSpU9mwYQNr1qyxuhSvMmDAANatW0dlZSXLly/n7rvvZtWqVVaXZXvbt2/nvvvuIzc3l86dO1tdjpyFvqJqBb169cLHx+e0lvJ79uwhIiLCoqq804nrrd+F52VlZbFixQo++OADevfuXb89IiKCo0ePsn///gb763fQevz8/LjwwgtJTExkwYIFJCQk8Oc//1nX3sOKioooLy9nyJAh+Pr64uvry6pVq8jOzsbX15fw8HBd/3ZEAacV+Pn5kZiYyPvvv1+/zeVy8f7775OSkmJhZd6nX79+RERENPhdVFVVkZ+fr99FK3G73WRlZfHaa6+xcuVK+vXr1+D5xMREOnXq1OB3UFJSQmlpqX4HHuJyuaipqdG197DU1FS++OIL1q1bV78kJSWRnp5ev67r337oK6pWMmPGDO6++26SkpIYOnQof/rTnzh06BCTJk2yujTbOXjwIFu3bq3/+auvvmLdunWEhITQp08fpk2bxkMPPcRFF11Ev379mDt3LlFRUdx4443WFW0jU6dO5YUXXuD111+ne/fu9W0LgoKC6NKlC0FBQWRkZDBjxgxCQkIIDAzk3nvvJSUlhWHDhllcfcc3Z84cxo0bR58+fThw4AAvvPACH374Ie+++66uvYd17969vq3ZCQEBAfTs2bN+u65/O2J1Ny47WbRokbtPnz5uPz8/99ChQ90ff/yx1SXZ0gcffOAGTlvuvvtut9ttuorPnTvXHR4e7vb393enpqa6S0pKrC3aRhq79oD7mWeeqd/nyJEj7l/84hfuHj16uLt27eq+6aab3Lt377auaBv52c9+5u7bt6/bz8/PHRoa6k5NTXW/99579c/r2retU7uJu926/u2Jw+12uy3KViIiIiIeoTY4IiIiYjsKOCIiImI7CjgiIiJiOwo4IiIiYjsKOCIiImI7CjgiIiJiOwo4IiIiYjsKOCIiImI7CjgiIiJiOwo4IiIiYjsKOCIiImI7CjgiIiJiO/8fpvi3rLEj8EwAAAAASUVORK5CYII=\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plt.plot(preds[i]);\n", + "plt.plot(trues[i]);" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "bf881537", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:49:49.575579Z", + "start_time": "2022-11-28T05:49:49.558663Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "42767 2020-09-01 16:35:00\n", + "42768 2020-09-01 16:40:00\n", + "42769 2020-09-01 16:45:00\n", + "42770 2020-09-01 16:50:00\n", + "42771 2020-09-01 16:55:00\n", + " ... \n", + "53393 2020-12-31 17:35:00\n", + "53394 2020-12-31 18:30:00\n", + "53395 2020-12-31 19:15:00\n", + "53396 2020-12-31 19:20:00\n", + "53397 2020-12-31 19:55:00\n", + "Name: date, Length: 10631, dtype: object" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "ds.index" ] }, { "cell_type": "code", "execution_count": null, - "id": "2faf8241", + "id": "b1fecfd9", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 134, + "id": "a8df30fd", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:05:21.353091Z", + "start_time": "2022-11-28T06:05:21.333893Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.25000000e+01, 3.52880000e+02, 3.54100000e+01, 7.80450949e-01,\n", + " 9.82722730e-01, 5.37977462e-01, 8.07709812e-02, -2.64457225e-01,\n", + " -1.43769087e-01, 4.38652607e-01, 1.86131098e-01, -3.70741650e+00])" + ] + }, + "execution_count": 134, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds2[i]\n", + "batch_x[-1]" + ] + }, + { + "cell_type": "markdown", + "id": "d8028473", + "metadata": {}, + "source": [ + "# TODO check index" + ] + }, + { + "cell_type": "code", + "execution_count": 112, + "id": "52419362", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:01:04.184088Z", + "start_time": "2022-11-28T06:01:04.013429Z" + }, + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
closeref_closesec_closeRVOLs_50_12_2ref_2refMACDVs_3_10_9_2ref_2refMACDVs_8_24_9_2ref_2refRRVOLs_50_12_2ref_2refRSMKs_3_24_12_2ref_2refRSMKs_128_8_4_2ref_2refRRSs_12_12_12_2ref_2refVRRSs_5_21_12_2ref_2refRSMKs_18_144_72_2ref_2ref
date
2019-01-02 07:00:0060.7500246.390056.700.6345610.2288220.749770-0.0815720.7549480.0419740.4528820.094300-0.141763
2019-01-02 09:30:0060.2000246.300056.300.619485-0.1382710.516611-0.1595450.6907520.0373100.201226-0.050731-0.127774
2019-01-02 09:35:0059.8500246.520056.360.689500-0.5355640.191501-0.1047520.5533760.027199-0.217425-0.069932-0.117113
2019-01-02 09:40:0060.0600246.900156.700.746596-0.803242-0.130051-0.0707610.4029110.015511-0.473000-0.089949-0.109966
2019-01-02 09:45:0060.2350247.140056.690.701637-0.936439-0.409001-0.1305810.2636640.003868-0.679096-0.096488-0.105561
.......................................
2020-12-31 17:35:0017.3300374.210037.900.706492-0.129955-0.5517040.197178-0.842459-0.216290-3.579407-0.088556-1.118991
2020-12-31 18:30:0017.3200374.400037.960.615936-0.147461-0.5389420.174563-0.803874-0.213881-3.258388-0.075389-1.179880
2020-12-31 19:15:0017.3600374.390037.950.605291-0.105155-0.5081920.226633-0.756699-0.210656-2.735903-0.063731-1.239256
2020-12-31 19:20:0017.3501374.390037.950.592393-0.065321-0.4753750.268617-0.720279-0.207647-2.416748-0.053941-1.297199
2020-12-31 19:55:0017.4000374.390037.950.5048770.054870-0.4086120.198019-0.664792-0.201618-2.009522-0.045287-1.352772
\n", + "

53398 rows × 12 columns

\n", + "
" + ], + "text/plain": [ + " close ref_close sec_close RVOLs_50_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 60.7500 246.3900 56.70 0.634561 \n", + "2019-01-02 09:30:00 60.2000 246.3000 56.30 0.619485 \n", + "2019-01-02 09:35:00 59.8500 246.5200 56.36 0.689500 \n", + "2019-01-02 09:40:00 60.0600 246.9001 56.70 0.746596 \n", + "2019-01-02 09:45:00 60.2350 247.1400 56.69 0.701637 \n", + "... ... ... ... ... \n", + "2020-12-31 17:35:00 17.3300 374.2100 37.90 0.706492 \n", + "2020-12-31 18:30:00 17.3200 374.4000 37.96 0.615936 \n", + "2020-12-31 19:15:00 17.3600 374.3900 37.95 0.605291 \n", + "2020-12-31 19:20:00 17.3501 374.3900 37.95 0.592393 \n", + "2020-12-31 19:55:00 17.4000 374.3900 37.95 0.504877 \n", + "\n", + " MACDVs_3_10_9_2ref_2ref MACDVs_8_24_9_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 0.228822 0.749770 \n", + "2019-01-02 09:30:00 -0.138271 0.516611 \n", + "2019-01-02 09:35:00 -0.535564 0.191501 \n", + "2019-01-02 09:40:00 -0.803242 -0.130051 \n", + "2019-01-02 09:45:00 -0.936439 -0.409001 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.129955 -0.551704 \n", + "2020-12-31 18:30:00 -0.147461 -0.538942 \n", + "2020-12-31 19:15:00 -0.105155 -0.508192 \n", + "2020-12-31 19:20:00 -0.065321 -0.475375 \n", + "2020-12-31 19:55:00 0.054870 -0.408612 \n", + "\n", + " RRVOLs_50_12_2ref_2ref RSMKs_3_24_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 -0.081572 0.754948 \n", + "2019-01-02 09:30:00 -0.159545 0.690752 \n", + "2019-01-02 09:35:00 -0.104752 0.553376 \n", + "2019-01-02 09:40:00 -0.070761 0.402911 \n", + "2019-01-02 09:45:00 -0.130581 0.263664 \n", + "... ... ... \n", + "2020-12-31 17:35:00 0.197178 -0.842459 \n", + "2020-12-31 18:30:00 0.174563 -0.803874 \n", + "2020-12-31 19:15:00 0.226633 -0.756699 \n", + "2020-12-31 19:20:00 0.268617 -0.720279 \n", + "2020-12-31 19:55:00 0.198019 -0.664792 \n", + "\n", + " RSMKs_128_8_4_2ref_2ref RRSs_12_12_12_2ref_2ref \\\n", + "date \n", + "2019-01-02 07:00:00 0.041974 0.452882 \n", + "2019-01-02 09:30:00 0.037310 0.201226 \n", + "2019-01-02 09:35:00 0.027199 -0.217425 \n", + "2019-01-02 09:40:00 0.015511 -0.473000 \n", + "2019-01-02 09:45:00 0.003868 -0.679096 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.216290 -3.579407 \n", + "2020-12-31 18:30:00 -0.213881 -3.258388 \n", + "2020-12-31 19:15:00 -0.210656 -2.735903 \n", + "2020-12-31 19:20:00 -0.207647 -2.416748 \n", + "2020-12-31 19:55:00 -0.201618 -2.009522 \n", + "\n", + " VRRSs_5_21_12_2ref_2ref RSMKs_18_144_72_2ref_2ref \n", + "date \n", + "2019-01-02 07:00:00 0.094300 -0.141763 \n", + "2019-01-02 09:30:00 -0.050731 -0.127774 \n", + "2019-01-02 09:35:00 -0.069932 -0.117113 \n", + "2019-01-02 09:40:00 -0.089949 -0.109966 \n", + "2019-01-02 09:45:00 -0.096488 -0.105561 \n", + "... ... ... \n", + "2020-12-31 17:35:00 -0.088556 -1.118991 \n", + "2020-12-31 18:30:00 -0.075389 -1.179880 \n", + "2020-12-31 19:15:00 -0.063731 -1.239256 \n", + "2020-12-31 19:20:00 -0.053941 -1.297199 \n", + "2020-12-31 19:55:00 -0.045287 -1.352772 \n", + "\n", + "[53398 rows x 12 columns]" + ] + }, + "execution_count": 112, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = ds.root_path + '/' + ds.data_path\n", + "df = pd.read_csv(f).set_index('date', drop=False)\n", + "df = df[ds.cols[1:]]\n", + "# df[:] = ds.scaler.transform(df.values)\n", + "df\n", + "# df" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "id": "95f31a0e", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:03:58.540981Z", + "start_time": "2022-11-28T06:03:58.391515Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array([ 1.25000000e+01, 3.52880000e+02, 3.54100000e+01, 7.80450949e-01,\n", + " 9.82722730e-01, 5.37977462e-01, 8.07709812e-02, -2.64457225e-01,\n", + " -1.43769087e-01, 4.38652607e-01, 1.86131098e-01, -3.70741650e+00])" + ] + }, + "execution_count": 129, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from data_provider.data_loader import Dataset_Custom\n", + "ds2 = Dataset_Custom(\n", + " ds.root_path,\n", + " flag=\"test\",\n", + "# size=ds.size,\n", + " features=ds.features,\n", + " data_path=ds.data_path,\n", + " target=ds.target,\n", + " scale=False,\n", + " timeenc=ds.timeenc,\n", + " freq=ds.freq\n", + ")\n", + "\n", + "(batch_x, batch_y, batch_x_mark, batch_y_mark) = ds2[i]\n", + "batch_x[-1]" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "96b70f74", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:01:19.928649Z", + "start_time": "2022-11-28T06:01:19.909555Z" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 130, + "id": "9a324721", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:04:00.891901Z", + "start_time": "2022-11-28T06:04:00.878942Z" + } + }, + "outputs": [ + { + "data": { + "text/plain": [ + "close 12.720000\n", + "ref_close 350.630000\n", + "sec_close 35.720000\n", + "RVOLs_50_12_2ref_2ref 0.253561\n", + "MACDVs_3_10_9_2ref_2ref -0.258574\n", + "MACDVs_8_24_9_2ref_2ref -0.449367\n", + "RRVOLs_50_12_2ref_2ref -0.148139\n", + "RSMKs_3_24_12_2ref_2ref -0.424728\n", + "RSMKs_128_8_4_2ref_2ref -0.150821\n", + "RRSs_12_12_12_2ref_2ref -4.458638\n", + "VRRSs_5_21_12_2ref_2ref -0.035404\n", + "RSMKs_18_144_72_2ref_2ref -2.292316\n", + "Name: 2020-09-01 08:05:00, dtype: float64" + ] + }, + "execution_count": 130, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt = ds2.index.iloc[i]\n", + "df.loc[dt]" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "id": "7672e83e", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:04:07.801626Z", + "start_time": "2022-11-28T06:04:07.779799Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
closeref_closesec_closeRVOLs_50_12_2ref_2refMACDVs_3_10_9_2ref_2refMACDVs_8_24_9_2ref_2refRRVOLs_50_12_2ref_2refRSMKs_3_24_12_2ref_2refRSMKs_128_8_4_2ref_2refRRSs_12_12_12_2ref_2refVRRSs_5_21_12_2ref_2refRSMKs_18_144_72_2ref_2ref
date
2020-09-01 07:05:0012.78351.0235.710.1930380.139308-0.167503-0.457840-0.120366-0.097117-1.113143-0.057836-2.129797
2020-09-01 07:15:0012.72350.8335.760.1722460.054992-0.167238-0.389511-0.147534-0.104186-1.869118-0.087983-2.147435
2020-09-01 07:20:0012.70350.8035.700.185312-0.078002-0.211485-0.306203-0.198667-0.115042-2.702641-0.110004-2.165641
2020-09-01 07:25:0012.72350.7035.650.192109-0.164477-0.258804-0.284154-0.255096-0.123646-3.397736-0.104798-2.183736
2020-09-01 07:30:0012.73350.5035.660.225091-0.201191-0.295878-0.229570-0.285606-0.132584-3.782116-0.069555-2.201911
2020-09-01 07:40:0012.72350.5635.670.192338-0.232440-0.334591-0.414401-0.320162-0.140044-4.080456-0.062384-2.220361
2020-09-01 07:45:0012.71350.5435.670.172743-0.274229-0.380497-0.416034-0.356426-0.145459-4.530481-0.056956-2.239216
2020-09-01 07:50:0012.72350.4935.700.148786-0.289147-0.417921-0.358402-0.382376-0.147811-4.467765-0.033833-2.257165
2020-09-01 08:00:0012.72350.6335.710.231278-0.276805-0.436961-0.233196-0.404503-0.150513-4.532557-0.031680-2.275121
2020-09-01 08:05:0012.72350.6335.720.253561-0.258574-0.449367-0.148139-0.424728-0.150821-4.458638-0.035404-2.292316
\n", + "
" + ], + "text/plain": [ + " close ref_close sec_close RVOLs_50_12_2ref_2ref \\\n", + "date \n", + "2020-09-01 07:05:00 12.78 351.02 35.71 0.193038 \n", + "2020-09-01 07:15:00 12.72 350.83 35.76 0.172246 \n", + "2020-09-01 07:20:00 12.70 350.80 35.70 0.185312 \n", + "2020-09-01 07:25:00 12.72 350.70 35.65 0.192109 \n", + "2020-09-01 07:30:00 12.73 350.50 35.66 0.225091 \n", + "2020-09-01 07:40:00 12.72 350.56 35.67 0.192338 \n", + "2020-09-01 07:45:00 12.71 350.54 35.67 0.172743 \n", + "2020-09-01 07:50:00 12.72 350.49 35.70 0.148786 \n", + "2020-09-01 08:00:00 12.72 350.63 35.71 0.231278 \n", + "2020-09-01 08:05:00 12.72 350.63 35.72 0.253561 \n", + "\n", + " MACDVs_3_10_9_2ref_2ref MACDVs_8_24_9_2ref_2ref \\\n", + "date \n", + "2020-09-01 07:05:00 0.139308 -0.167503 \n", + "2020-09-01 07:15:00 0.054992 -0.167238 \n", + "2020-09-01 07:20:00 -0.078002 -0.211485 \n", + "2020-09-01 07:25:00 -0.164477 -0.258804 \n", + "2020-09-01 07:30:00 -0.201191 -0.295878 \n", + "2020-09-01 07:40:00 -0.232440 -0.334591 \n", + "2020-09-01 07:45:00 -0.274229 -0.380497 \n", + "2020-09-01 07:50:00 -0.289147 -0.417921 \n", + "2020-09-01 08:00:00 -0.276805 -0.436961 \n", + "2020-09-01 08:05:00 -0.258574 -0.449367 \n", + "\n", + " RRVOLs_50_12_2ref_2ref RSMKs_3_24_12_2ref_2ref \\\n", + "date \n", + "2020-09-01 07:05:00 -0.457840 -0.120366 \n", + "2020-09-01 07:15:00 -0.389511 -0.147534 \n", + "2020-09-01 07:20:00 -0.306203 -0.198667 \n", + "2020-09-01 07:25:00 -0.284154 -0.255096 \n", + "2020-09-01 07:30:00 -0.229570 -0.285606 \n", + "2020-09-01 07:40:00 -0.414401 -0.320162 \n", + "2020-09-01 07:45:00 -0.416034 -0.356426 \n", + "2020-09-01 07:50:00 -0.358402 -0.382376 \n", + "2020-09-01 08:00:00 -0.233196 -0.404503 \n", + "2020-09-01 08:05:00 -0.148139 -0.424728 \n", + "\n", + " RSMKs_128_8_4_2ref_2ref RRSs_12_12_12_2ref_2ref \\\n", + "date \n", + "2020-09-01 07:05:00 -0.097117 -1.113143 \n", + "2020-09-01 07:15:00 -0.104186 -1.869118 \n", + "2020-09-01 07:20:00 -0.115042 -2.702641 \n", + "2020-09-01 07:25:00 -0.123646 -3.397736 \n", + "2020-09-01 07:30:00 -0.132584 -3.782116 \n", + "2020-09-01 07:40:00 -0.140044 -4.080456 \n", + "2020-09-01 07:45:00 -0.145459 -4.530481 \n", + "2020-09-01 07:50:00 -0.147811 -4.467765 \n", + "2020-09-01 08:00:00 -0.150513 -4.532557 \n", + "2020-09-01 08:05:00 -0.150821 -4.458638 \n", + "\n", + " VRRSs_5_21_12_2ref_2ref RSMKs_18_144_72_2ref_2ref \n", + "date \n", + "2020-09-01 07:05:00 -0.057836 -2.129797 \n", + "2020-09-01 07:15:00 -0.087983 -2.147435 \n", + "2020-09-01 07:20:00 -0.110004 -2.165641 \n", + "2020-09-01 07:25:00 -0.104798 -2.183736 \n", + "2020-09-01 07:30:00 -0.069555 -2.201911 \n", + "2020-09-01 07:40:00 -0.062384 -2.220361 \n", + "2020-09-01 07:45:00 -0.056956 -2.239216 \n", + "2020-09-01 07:50:00 -0.033833 -2.257165 \n", + "2020-09-01 08:00:00 -0.031680 -2.275121 \n", + "2020-09-01 08:05:00 -0.035404 -2.292316 " + ] + }, + "execution_count": 131, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[:dt].tail(10)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "id": "910f7951", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T06:04:08.155567Z", + "start_time": "2022-11-28T06:04:08.136362Z" + } + }, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "\n", + "\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
closeref_closesec_closeRVOLs_50_12_2ref_2refMACDVs_3_10_9_2ref_2refMACDVs_8_24_9_2ref_2refRRVOLs_50_12_2ref_2refRSMKs_3_24_12_2ref_2refRSMKs_128_8_4_2ref_2refRRSs_12_12_12_2ref_2refVRRSs_5_21_12_2ref_2refRSMKs_18_144_72_2ref_2ref
date
2020-09-01 08:05:0012.7200350.6335.72000.253561-0.258574-0.449367-0.148139-0.424728-0.150821-4.458638-0.035404-2.292316
2020-09-01 08:10:0012.7100350.6535.71000.377474-0.257495-0.464872-0.056481-0.439078-0.149315-3.802018-0.059968-2.308917
2020-09-01 08:15:0012.7200350.6735.70000.333210-0.238231-0.470690-0.050828-0.429932-0.147446-3.118936-0.048271-2.325404
2020-09-01 08:20:0012.7400350.6935.70000.332308-0.170788-0.448436-0.034869-0.433898-0.145277-2.6344330.017789-2.340819
2020-09-01 08:25:0012.7000350.7535.69000.412416-0.177005-0.4463220.035903-0.458732-0.144407-2.273931-0.074174-2.357595
2020-09-01 08:45:0012.7200350.9035.72000.396500-0.163743-0.4370720.053250-0.491988-0.143145-1.893402-0.078288-2.374942
2020-09-01 08:50:0012.7200350.6535.73000.624533-0.144462-0.4248470.224395-0.536655-0.141796-1.570535-0.055490-2.392740
2020-09-01 08:55:0012.7000350.3235.70000.612150-0.167709-0.4284420.164079-0.588308-0.140547-1.379467-0.056093-2.411249
2020-09-01 09:00:0012.6702350.0035.65000.801189-0.253867-0.4632910.362784-0.631686-0.140254-1.113389-0.096814-2.430535
2020-09-01 09:05:0012.6700349.6735.60010.725914-0.341901-0.5139730.187611-0.685693-0.139431-0.708685-0.078523-2.450620
\n", + "
" + ], + "text/plain": [ + " close ref_close sec_close RVOLs_50_12_2ref_2ref \\\n", + "date \n", + "2020-09-01 08:05:00 12.7200 350.63 35.7200 0.253561 \n", + "2020-09-01 08:10:00 12.7100 350.65 35.7100 0.377474 \n", + "2020-09-01 08:15:00 12.7200 350.67 35.7000 0.333210 \n", + "2020-09-01 08:20:00 12.7400 350.69 35.7000 0.332308 \n", + "2020-09-01 08:25:00 12.7000 350.75 35.6900 0.412416 \n", + "2020-09-01 08:45:00 12.7200 350.90 35.7200 0.396500 \n", + "2020-09-01 08:50:00 12.7200 350.65 35.7300 0.624533 \n", + "2020-09-01 08:55:00 12.7000 350.32 35.7000 0.612150 \n", + "2020-09-01 09:00:00 12.6702 350.00 35.6500 0.801189 \n", + "2020-09-01 09:05:00 12.6700 349.67 35.6001 0.725914 \n", + "\n", + " MACDVs_3_10_9_2ref_2ref MACDVs_8_24_9_2ref_2ref \\\n", + "date \n", + "2020-09-01 08:05:00 -0.258574 -0.449367 \n", + "2020-09-01 08:10:00 -0.257495 -0.464872 \n", + "2020-09-01 08:15:00 -0.238231 -0.470690 \n", + "2020-09-01 08:20:00 -0.170788 -0.448436 \n", + "2020-09-01 08:25:00 -0.177005 -0.446322 \n", + "2020-09-01 08:45:00 -0.163743 -0.437072 \n", + "2020-09-01 08:50:00 -0.144462 -0.424847 \n", + "2020-09-01 08:55:00 -0.167709 -0.428442 \n", + "2020-09-01 09:00:00 -0.253867 -0.463291 \n", + "2020-09-01 09:05:00 -0.341901 -0.513973 \n", + "\n", + " RRVOLs_50_12_2ref_2ref RSMKs_3_24_12_2ref_2ref \\\n", + "date \n", + "2020-09-01 08:05:00 -0.148139 -0.424728 \n", + "2020-09-01 08:10:00 -0.056481 -0.439078 \n", + "2020-09-01 08:15:00 -0.050828 -0.429932 \n", + "2020-09-01 08:20:00 -0.034869 -0.433898 \n", + "2020-09-01 08:25:00 0.035903 -0.458732 \n", + "2020-09-01 08:45:00 0.053250 -0.491988 \n", + "2020-09-01 08:50:00 0.224395 -0.536655 \n", + "2020-09-01 08:55:00 0.164079 -0.588308 \n", + "2020-09-01 09:00:00 0.362784 -0.631686 \n", + "2020-09-01 09:05:00 0.187611 -0.685693 \n", + "\n", + " RSMKs_128_8_4_2ref_2ref RRSs_12_12_12_2ref_2ref \\\n", + "date \n", + "2020-09-01 08:05:00 -0.150821 -4.458638 \n", + "2020-09-01 08:10:00 -0.149315 -3.802018 \n", + "2020-09-01 08:15:00 -0.147446 -3.118936 \n", + "2020-09-01 08:20:00 -0.145277 -2.634433 \n", + "2020-09-01 08:25:00 -0.144407 -2.273931 \n", + "2020-09-01 08:45:00 -0.143145 -1.893402 \n", + "2020-09-01 08:50:00 -0.141796 -1.570535 \n", + "2020-09-01 08:55:00 -0.140547 -1.379467 \n", + "2020-09-01 09:00:00 -0.140254 -1.113389 \n", + "2020-09-01 09:05:00 -0.139431 -0.708685 \n", + "\n", + " VRRSs_5_21_12_2ref_2ref RSMKs_18_144_72_2ref_2ref \n", + "date \n", + "2020-09-01 08:05:00 -0.035404 -2.292316 \n", + "2020-09-01 08:10:00 -0.059968 -2.308917 \n", + "2020-09-01 08:15:00 -0.048271 -2.325404 \n", + "2020-09-01 08:20:00 0.017789 -2.340819 \n", + "2020-09-01 08:25:00 -0.074174 -2.357595 \n", + "2020-09-01 08:45:00 -0.078288 -2.374942 \n", + "2020-09-01 08:50:00 -0.055490 -2.392740 \n", + "2020-09-01 08:55:00 -0.056093 -2.411249 \n", + "2020-09-01 09:00:00 -0.096814 -2.430535 \n", + "2020-09-01 09:05:00 -0.078523 -2.450620 " + ] + }, + "execution_count": 132, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "df.loc[dt:].head(10)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "29852e6b", + "metadata": { + "ExecuteTime": { + "end_time": "2022-11-28T05:54:40.421346Z", + "start_time": "2022-11-28T05:54:40.403132Z" + } + }, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b5bdd08e", "metadata": {}, "outputs": [], "source": [] @@ -390,7 +1636,15 @@ { "cell_type": "code", "execution_count": null, - "id": "609a7018", + "id": "5ebb795d", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "04019450", "metadata": {}, "outputs": [], "source": [] diff --git a/notebooks/results/Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0/test_metrics.npy b/notebooks/results/Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0/test_metrics.npy new file mode 100644 index 0000000..57ab577 Binary files /dev/null and b/notebooks/results/Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0/test_metrics.npy differ diff --git a/notebooks/results/Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0/val_metrics.npy b/notebooks/results/Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0/val_metrics.npy new file mode 100644 index 0000000..a03d8dd Binary files /dev/null and b/notebooks/results/Exchange_ETSformer_custom_ftM_sl128_pl48_dm512_nh8_el2_dl2_df2048_K0_lr0.001_'Exp'_0/val_metrics.npy differ