mirror of
https://github.com/wassname/Volt.git
synced 2026-10-03 12:10:38 +08:00
187 KiB
187 KiB
In [1]:
import pickle as pkl
import pandas as pd
import numpy as np
import torch
import matplotlib.pyplot as plt
import seaborn as sns
import os
from voltron.data import make_ticker_list, GetStockHistory
sns.set_style('white')
palette = ["#1b4079", "#C6DDF0", "#048A81", "#B9E28C", "#8C2155", "#AF7595", "#E6480F", "#FA9500"]
sns.set(palette = palette, font_scale=2.0, style="white", rc={"lines.linewidth": 4.0})Warning no robinhood utils.
In [2]:
matern_df = pd.read_pickle("./matern_calib.pkl")
volt_df = pd.read_pickle("./volt_calib.pkl")
matern_df.columns = volt_df.columns[0;31m---------------------------------------------------------------------------[0m [0;31mFileNotFoundError[0m Traceback (most recent call last) [0;32m<ipython-input-2-18f65b61756d>[0m in [0;36m<module>[0;34m[0m [0;32m----> 1[0;31m [0mmatern_df[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mread_pickle[0m[0;34m([0m[0;34m"./matern_calib.pkl"[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 2[0m [0mvolt_df[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mread_pickle[0m[0;34m([0m[0;34m"./volt_calib.pkl"[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [1;32m 3[0m [0mmatern_df[0m[0;34m.[0m[0mcolumns[0m [0;34m=[0m [0mvolt_df[0m[0;34m.[0m[0mcolumns[0m[0;34m[0m[0;34m[0m[0m [0;32m~/miniconda3/envs/rpp/lib/python3.8/site-packages/pandas/io/pickle.py[0m in [0;36mread_pickle[0;34m(filepath_or_buffer, compression, storage_options)[0m [1;32m 183[0m """ [1;32m 184[0m [0mexcs_to_catch[0m [0;34m=[0m [0;34m([0m[0mAttributeError[0m[0;34m,[0m [0mImportError[0m[0;34m,[0m [0mModuleNotFoundError[0m[0;34m,[0m [0mTypeError[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0;32m--> 185[0;31m with get_handle( [0m[1;32m 186[0m [0mfilepath_or_buffer[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [1;32m 187[0m [0;34m"rb"[0m[0;34m,[0m[0;34m[0m[0;34m[0m[0m [0;32m~/miniconda3/envs/rpp/lib/python3.8/site-packages/pandas/io/common.py[0m in [0;36mget_handle[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)[0m [1;32m 649[0m [0;32melse[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m [1;32m 650[0m [0;31m# Binary mode[0m[0;34m[0m[0;34m[0m[0;34m[0m[0m [0;32m--> 651[0;31m [0mhandle[0m [0;34m=[0m [0mopen[0m[0;34m([0m[0mhandle[0m[0;34m,[0m [0mioargs[0m[0;34m.[0m[0mmode[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m[1;32m 652[0m [0mhandles[0m[0;34m.[0m[0mappend[0m[0;34m([0m[0mhandle[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [1;32m 653[0m [0;34m[0m[0m [0;31mFileNotFoundError[0m: [Errno 2] No such file or directory: './matern_calib.pkl'
In [6]:
matern_df.Mean.unique()[0;31m---------------------------------------------------------------------------[0m [0;31mNameError[0m Traceback (most recent call last) [0;32m<ipython-input-6-5b36a26c82e9>[0m in [0;36m<module>[0;34m[0m [0;32m----> 1[0;31m [0mmatern_df[0m[0;34m.[0m[0mMean[0m[0;34m.[0m[0munique[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m [0m [0;31mNameError[0m: name 'matern_df' is not defined
In [7]:
def ECDF(sample_pxs, true_px):
return (torch.sum(sample_pxs < true_px, 0)/sample_pxs.shape[0])
def Calibration(pcts, percentile=0.95):
in_band = np.where((pcts < percentile))[0].shape[0]
return in_band/pcts.shape[0]
def GetCalibration(model, horizon=np.arange(75,100),
logger=[], exp=True):
ntrain = 400
n_test_times = 20
ntest = 100
pcts = torch.tensor([])
for tckr in ticker_list:
data = GetStockHistory(tckr, history=1000, end_date=end_date)
for idx, date in enumerate(data.index):
fpath = "./saved-outputs/"+ tckr + "/"
fname = model + "_"
if model == 'volt':
fname += "constant"
fname += str(date.date()) + ".pt"
if os.path.exists(fpath + fname):
preds = torch.load(fpath + fname)
if isinstance(preds, tuple):
preds = preds[0]
if preds.shape[-1] == 100:
preds = preds[:, horizon]
test_y = torch.tensor(data.iloc[idx:idx+100].Close.to_numpy())
if test_y.shape[0] == 100:
if exp:
preds = preds.exp()
pcts = torch.cat((pcts, ECDF(preds, test_y[horizon])))
if pcts.numel() == 0:
return logger
pcts = pcts.flatten().numpy()
percentiles = np.linspace(0.05, 0.95, 19)
for pct in percentiles:
clb = Calibration(pcts, pct)
logger.append([clb, np.round(pct, 2), model, "Constant", 100])
return loggerIn [8]:
data_path = "../../voltron/data/"
ticker_list = make_ticker_list(data_path + "test_tickers.txt")In [9]:
end_date = "2022-01-13"In [10]:
log = []
for model in ['volt', 'lstm']:
log = GetCalibration(model, horizon=np.arange(75,100),
logger=log, exp=True)In [11]:
df = pd.DataFrame(log)
df.columns = ['Calibration', 'Percentile', "Model", "Mean", "k"][0;31m---------------------------------------------------------------------------[0m
[0;31mValueError[0m Traceback (most recent call last)
[0;32m<ipython-input-11-e23ecfc68e6a>[0m in [0;36m<module>[0;34m[0m
[1;32m 1[0m [0mdf[0m [0;34m=[0m [0mpd[0m[0;34m.[0m[0mDataFrame[0m[0;34m([0m[0mlog[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0;32m----> 2[0;31m [0mdf[0m[0;34m.[0m[0mcolumns[0m [0;34m=[0m [0;34m[[0m[0;34m'Calibration'[0m[0;34m,[0m [0;34m'Percentile'[0m[0;34m,[0m [0;34m"Model"[0m[0;34m,[0m [0;34m"Mean"[0m[0;34m,[0m [0;34m"k"[0m[0;34m][0m[0;34m[0m[0;34m[0m[0m
[0m
[0;32m~/miniconda3/envs/rpp/lib/python3.8/site-packages/pandas/core/generic.py[0m in [0;36m__setattr__[0;34m(self, name, value)[0m
[1;32m 5476[0m [0;32mtry[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[1;32m 5477[0m [0mobject[0m[0;34m.[0m[0m__getattribute__[0m[0;34m([0m[0mself[0m[0;34m,[0m [0mname[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0;32m-> 5478[0;31m [0;32mreturn[0m [0mobject[0m[0;34m.[0m[0m__setattr__[0m[0;34m([0m[0mself[0m[0;34m,[0m [0mname[0m[0;34m,[0m [0mvalue[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0m[1;32m 5479[0m [0;32mexcept[0m [0mAttributeError[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[1;32m 5480[0m [0;32mpass[0m[0;34m[0m[0;34m[0m[0m
[0;32mpandas/_libs/properties.pyx[0m in [0;36mpandas._libs.properties.AxisProperty.__set__[0;34m()[0m
[0;32m~/miniconda3/envs/rpp/lib/python3.8/site-packages/pandas/core/generic.py[0m in [0;36m_set_axis[0;34m(self, axis, labels)[0m
[1;32m 668[0m [0;32mdef[0m [0m_set_axis[0m[0;34m([0m[0mself[0m[0;34m,[0m [0maxis[0m[0;34m:[0m [0mint[0m[0;34m,[0m [0mlabels[0m[0;34m:[0m [0mIndex[0m[0;34m)[0m [0;34m->[0m [0;32mNone[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[1;32m 669[0m [0mlabels[0m [0;34m=[0m [0mensure_index[0m[0;34m([0m[0mlabels[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0;32m--> 670[0;31m [0mself[0m[0;34m.[0m[0m_mgr[0m[0;34m.[0m[0mset_axis[0m[0;34m([0m[0maxis[0m[0;34m,[0m [0mlabels[0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[0m[1;32m 671[0m [0mself[0m[0;34m.[0m[0m_clear_item_cache[0m[0;34m([0m[0;34m)[0m[0;34m[0m[0;34m[0m[0m
[1;32m 672[0m [0;34m[0m[0m
[0;32m~/miniconda3/envs/rpp/lib/python3.8/site-packages/pandas/core/internals/managers.py[0m in [0;36mset_axis[0;34m(self, axis, new_labels)[0m
[1;32m 218[0m [0;34m[0m[0m
[1;32m 219[0m [0;32mif[0m [0mnew_len[0m [0;34m!=[0m [0mold_len[0m[0;34m:[0m[0;34m[0m[0;34m[0m[0m
[0;32m--> 220[0;31m raise ValueError(
[0m[1;32m 221[0m [0;34mf"Length mismatch: Expected axis has {old_len} elements, new "[0m[0;34m[0m[0;34m[0m[0m
[1;32m 222[0m [0;34mf"values have {new_len} elements"[0m[0;34m[0m[0;34m[0m[0m
[0;31mValueError[0m: Length mismatch: Expected axis has 0 elements, new values have 5 elementsIn [15]:
df = pd.concat([df, matern_df, volt_df])In [16]:
mat_df = df[(df['Model'] == 'matern') & (df['Mean'] == 'tewma') & (df['k'] == 400)]
lstm_df = df[df['Model']=='lstm']
volt_df = df[(df['Model'] == 'volt') & (df['Mean'] == 'ewma') & (df['k']==100)]
plt_df = pd.concat([lstm_df, mat_df, volt_df])In [27]:
mat_df = df[(df['Model'] == 'matern') & (df['Mean'] == 'constant')]
volt_df = df[(df['Model'] == 'volt') & (df['Mean'] == 'Constant')]
const_df = pd.concat([mat_df, volt_df])In [41]:
from matplotlib.lines import Line2D
fig, ax = plt.subplots(1,1,dpi=150, figsize=(6, 3))
percentiles = np.linspace(0.05, 0.95, 19)
pal = [palette[5], palette[7]]
# pal = [palette[5]]
sns.lineplot(x='Percentile', y="Calibration", hue='Model', data=const_df, ax=ax, alpha=0.2,
palette=pal, legend=True)
sns.scatterplot(x='Percentile', y="Calibration", hue='Model', data=const_df, ax=ax, s=120, legend=False, zorder=4,
palette=pal, alpha=0.35)
pal = [ palette[0], palette[4], palette[6]]
sns.lineplot(x='Percentile', y="Calibration", hue='Model', data=plt_df, ax=ax, alpha=0.5,
palette=pal, legend=True)
sns.scatterplot(x='Percentile', y="Calibration", hue='Model', data=plt_df, ax=ax, s=120, legend=False, zorder=4,
palette=pal)
x = np.linspace(0.05,0.95)
y = np.linspace(0, len(percentiles))
ax.plot(x, x, color="gray", lw=1., ls="--")
ax.set_title("Stock Price Calibration")
plt.tick_params(labelsize=16)
sns.despine()
custom_lines = [Line2D([0], [0], color=palette[0], lw=2),
Line2D([0], [0], color=palette[4], lw=2),
Line2D([0], [0], color=palette[6], lw=2),
Line2D([0], [0], color=palette[5], lw=2),
Line2D([0], [0], color=palette[7], lw=2)]
plt.legend(custom_lines, ['LSTM', r"Matérn + Magpie", "Volt + Magpie", "Matérn + Constant",
"Volt + Constant"],
fontsize=14, frameon=False, bbox_to_anchor=(1., 0.85))
# ax.legend(fontsize=14, bbox_to_anchor=(1., 0.75))
# plt.label("Percentile")
plt.savefig("./stock_calibration.pdf", bbox_inches="tight")
plt.show()In [ ]:
In [ ]: