This commit is contained in:
wjmaddox
2022-06-16 20:48:44 -04:00
parent 7a04276104
commit e89bf076e8
8 changed files with 2 additions and 548 deletions
+2
View File
@@ -0,0 +1,2 @@
*/.ipynb_checkpoints/*
*/__pycache__/*
BIN
View File
Binary file not shown.
@@ -1,114 +0,0 @@
import numpy as np
import torch
import pandas as pd
import gpytorch
import argparse
import datetime
import warnings
from voltron.data import make_ticker_list, GetStockHistory
import sys
from GenerateMultiMeanPreds import GenerateStockPredictions, GenerateBasicPredictions
from gpytorch.utils.warnings import NumericalWarning
warnings.simplefilter("ignore", NumericalWarning)
def main(args):
ticker_file = args.ticker_fname + ".txt"
tckr_list = make_ticker_list(ticker_file)
if args.end_date.lower() == "none":
end_date = datetime.date.today()
else:
end_date = datetime.datetime.strptime(args.end_date, "%Y-%m-%d")
for tckr in tckr_list:
# try:
data = GetStockHistory(tckr, history=args.ntrain + args.lookback)
if args.kernel.lower() == 'volt':
GenerateStockPredictions(tckr, data, forecast_horizon=args.forecast_horizon,
train_iters=args.train_iters,
nsample=args.nsample, mean=args.mean,
ntrain=args.ntrain, save=args.save,
ntimes=args.ntimes)
else:
GenerateBasicPredictions(tckr, data, forecast_horizon=args.forecast_horizon,
kernel_name=args.kernel, mean_name=args.mean,
k=args.k, train_iters=args.train_iters,
nsample=args.nsample, ntimes=args.ntimes,
ntrain=args.ntrain, save=args.save)
# except:
# print("FAILED ", tckr)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--ticker_fname",
type=str,
default='test_tickers',
)
parser.add_argument(
"--ntrain",
type=int,
default=400,
)
parser.add_argument(
"--ntimes",
type=int,
default=25,
)
parser.add_argument(
"--forecast_horizon",
type=int,
default=100,
)
parser.add_argument(
'--kernel',
type=str,
default="volt",
)
parser.add_argument(
'--mean',
type=str,
default="ewma",
)
parser.add_argument(
"--nsample",
type=int,
default=1000,
)
parser.add_argument(
"--printing",
type=bool,
default=False
)
parser.add_argument(
"--train_iters",
type=int,
default=300,
)
parser.add_argument(
"--end_date",
default="none",
)
parser.add_argument(
"--lookback",
type=int,
default=500,
)
parser.add_argument(
"--save",
type=bool,
default=True,
)
parser.add_argument(
"--k",
type=int,
default=100,
)
args = parser.parse_args()
main(args)
@@ -1,298 +0,0 @@
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import torch
import pandas as pd
import os
import gpytorch
import argparse
import datetime
from botorch.models import SingleTaskGP
from botorch.optim.fit import fit_gpytorch_torch
from gpytorch.likelihoods import GaussianLikelihood
from gpytorch.mlls import ExactMarginalLogLikelihood
from gpytorch.means import ConstantMean, LinearMean
from gpytorch.kernels import SpectralMixtureKernel, MaternKernel, RBFKernel, ScaleKernel
from voltron.means import EWMAMean, DEWMAMean, TEWMAMean
from voltron.train_utils import LearnGPCV, TrainVolModel, TrainVoltMagpieModel, TrainBasicModel
from voltron.models import VoltMagpie
from voltron.means import LogLinearMean
from voltron.rollout_utils import GeneratePrediction, Rollouts
from voltron.data import make_ticker_list, DataGetter, GetStockHistory
def GenerateGPCVPredictions(ticker, dat,
forecast_horizon=20, ntimes=25,
train_iters=400, nsample=1000,
ntrain=400):
end_idxs = torch.arange(ntrain, dat.shape[0],
int((dat.shape[0]-ntrain)/ntimes))
ntest = forecast_horizon
dt = 1./252
savepath = "./saved-outputs/" + ticker + "/"
if not os.path.exists(savepath):
os.mkdir(savepath)
for last_day in end_idxs:
date = str(dat.index[last_day.item()].date())
print(date, ticker)
train_y = torch.FloatTensor(dat.Close[last_day.item()-ntrain:last_day.item()].to_numpy())
train_x = torch.arange(train_y.shape[0]-1) * dt
test_x = torch.arange(ntest) * dt + train_x[-1] + train_x[1]
# try:
use_cuda = torch.cuda.is_available()
if use_cuda:
train_x = train_x.cuda()
test_x = test_x.cuda()
train_y = train_y.cuda()
model, likelihood = LearnGPCV(train_x, train_y,
train_iters=train_iters, printing=False, return_model=True)
preds = likelihood(model(test_x),
return_gaussian=False).sample(torch.Size((nsample,)))
preds = preds.cumsum(-1).squeeze()
preds = preds.view(-1, preds.shape[-1])
save_samples = preds.view(-1, preds.shape[-1]) * (dt ** 0.5) + train_y[-1].log()
torch.save(save_samples, savepath + "gpcv_" + date + ".pt")
return
def GenerateStockPredictions(ticker, dat,
forecast_horizon=20,
train_iters=400, nsample=1000,
ntrain=400, mean='ewma', kernel='volt',
save=False, k=300, ntimes=-1):
if ntimes == -1:
end_idxs = torch.arange(ntrain, dat.shape[0])
else:
end_idxs = torch.arange(ntrain, dat.shape[0],
int((dat.shape[0]-ntrain)/ntimes))
ntest = forecast_horizon
dt = 1./252
model_name = kernel + "_" + mean + str(k) + "_"
par_dir = "./saved-outputs/"
if not os.path.exists(par_dir):
os.mkdir(par_dir)
savepath = par_dir + ticker + "/"
if not os.path.exists(savepath):
os.mkdir(savepath)
for last_day in end_idxs:
date = str(dat.index[last_day.item()].date())
# try:
train_y = torch.FloatTensor(dat.Close[last_day.item()-ntrain:last_day.item()].to_numpy())
train_x = torch.arange(train_y.shape[0]-1) * dt
test_x = torch.arange(ntest) * dt + train_x[-1] + train_x[1]
# try:
use_cuda = torch.cuda.is_available()
if use_cuda:
train_x = train_x.cuda()
test_x = test_x.cuda()
train_y = train_y.cuda()
# print("Producing " + ticker + " Forecasts.....")
if kernel == "volt":
vol = LearnGPCV(train_x, train_y, train_iters=train_iters,
printing=False)
vmod, vlh = TrainVolModel(train_x, vol,
train_iters=train_iters, printing=False)
voltron, lh = TrainVoltMagpieModel(train_x, train_y[1:],
vmod, vlh, vol,
printing=False,
train_iters=train_iters,
k=k, mean_func=mean)
vmod.eval();
if mean in ['ewma', 'dewma', 'tewma']:
save_samples = Rollouts(train_x, train_y, test_x, voltron,
nsample=nsample)
else: ## VOLT + STANDARD MEAN
voltron.vol_model.eval()
predvol = voltron.vol_model(test_x).sample(torch.Size((nsample, ))).exp()
save_samples = GeneratePrediction(train_x, train_y, test_x,
predvol, voltron).detach()
del predvol
del voltron, lh, vmod, vlh, vol
torch.cuda.empty_cache()
if save:
if not os.path.exists(savepath):
os.mkdir(savepath)
torch.save(save_samples, savepath + model_name + date + ".pt")
# except:
# nans = torch.ones(nsample, ntest) * torch.nan
# if save:
# if not os.path.exists(savepath):
# os.mkdir(savepath)
# torch.save(nans, savepath + model_name + date + ".pt")
return dat, save_samples
def GenerateOneDayPredictions(ticker, train_y, date,
forecast_horizon=20,
train_iters=400, nsample=1000,
ntrain=400, save=False, mean=None):
ntest = forecast_horizon
dt = 1./252
par_dir = "./saved-outputs/"
if not os.path.exists(par_dir):
os.mkdir(par_dir)
savepath = par_dir + ticker + "/"
if not os.path.exists(savepath):
os.mkdir(savepath)
train_x = torch.arange(train_y.shape[0]-1) * dt
test_x = torch.arange(ntest) * dt + train_x[-1] + train_x[1]
use_cuda = torch.cuda.is_available()
if use_cuda:
train_x = train_x.cuda()
test_x = test_x.cuda()
train_y = train_y.cuda()
vol = LearnGPCV(train_x, train_y, train_iters=train_iters,
printing=False)
vmod, vlh = TrainVolModel(train_x, vol,
train_iters=train_iters, printing=False)
if mean=='constant':
voltron, lh = TrainVoltMagpieModel(train_x, train_y[1:],
vmod, vlh, vol,
printing=False,
train_iters=200,
mean_func='constant')
vmod.eval();
voltron.eval();
save_samples = Rollouts(train_x, train_y, test_x, voltron,
nsample=nsample)
if save:
model_name = "volt_" + mean + "_"
torch.save(save_samples, savepath + model_name + date + ".pt")
else:
for mean in ['ewma', 'dewma', 'tewma']:
for k in [25, 50, 100, 200, 300, 400]:
try:
voltron, lh = TrainVoltMagpieModel(train_x, train_y[1:],
vmod, vlh, vol,
printing=False,
train_iters=0,
k=k, mean_func=mean)
vmod.eval();
voltron.eval();
save_samples = Rollouts(train_x, train_y, test_x, voltron,
nsample=nsample)
except:
print("Failed: ", ticker, mean, k)
if save:
save_samples = torch.ones(nsample, ntest) * torch.nan
if save:
model_name = "volt_" + mean + str(k) + "_"
torch.save(save_samples, savepath + model_name + date + ".pt")
del voltron, lh, vmod, vlh, vol, save_samples
torch.cuda.empty_cache()
return
def GenerateBasicPredictions(ticker, dat, kernel_name, mean_name='ewma', k=400,
forecast_horizon=100,
train_iters=600, nsample=1000,
ntrain=400, save=False, ntimes=-1):
if ntimes == -1:
end_idxs = torch.arange(ntrain, dat.shape[0])
else:
end_idxs = torch.arange(ntrain, dat.shape[0],
int((dat.shape[0]-ntrain)/ntimes))
ntest = forecast_horizon
dt = 1./252
par_dir = "./saved-outputs/"
if not os.path.exists(par_dir):
os.mkdir(par_dir)
savepath = par_dir + ticker + "/"
if not os.path.exists(savepath):
os.mkdir(savepath)
for last_day in end_idxs:
date = str(dat.index[last_day.item()].date())
train_y = torch.FloatTensor(dat.Close[last_day.item()-ntrain:last_day.item()].to_numpy())
train_x = torch.arange(train_y.shape[0]-1) * dt
test_x = torch.arange(ntest) * dt + train_x[-1] + train_x[1]
# try:
use_cuda = torch.cuda.is_available()
if use_cuda:
train_x = train_x.cuda()
test_x = test_x.cuda()
train_y = train_y.cuda()
# print("Producing " + ticker + " Forecasts.....")
kernel_possibilities = {"sm": SpectralMixtureKernel,
"matern": MaternKernel,
"rbf": RBFKernel}
kernel = kernel_possibilities[kernel_name.lower()]
if kernel_name.lower() != 'sm':
kernel = ScaleKernel(kernel())
else:
kernel = kernel(num_mixtures=15)
kernel.initialize_from_data_empspect(train_x, train_y.log())
train_y = train_y[1:]
model = SingleTaskGP(
train_x.view(-1,1),
train_y.log().reshape(-1, 1),
covar_module=kernel,
likelihood=GaussianLikelihood()
)
mean_name = mean_name.lower()
if mean_name == "loglinear":
model.mean_module = LogLinearMean(1)
model.mean_module.initialize_from_data(train_x, train_y.log())
elif mean_name == 'linear':
model.mean_module = LinearMean(1)
elif mean_name == "constant":
model.mean_module = ConstantMean()
elif mean_name == "ewma":
model.mean_module = EWMAMean(train_x, train_y.log(), k=k).to(train_x.device)
elif mean_name == "dewma":
model.mean_module = DEWMAMean(train_x, train_y.log(), k=k).to(train_x.device)
elif mean_name == "tewma":
model.mean_module = TEWMAMean(train_x, train_y.log(), k=k).to(train_x.device)
if use_cuda:
model = model.to(train_x.device)
print("Fitting Model", ticker)
mll = ExactMarginalLogLikelihood(model.likelihood, model)
fit_gpytorch_torch(mll, options={'maxiter':train_iters, 'disp':False})
if mean_name in ["loglinear", "constant", 'linear']:
save_samples = model.posterior(test_x).sample(torch.Size((nsample,
))).squeeze(-1).cpu().detach()
else:
save_samples = Rollouts(
train_x, train_y, test_x, model, nsample=nsample, method = "nonvol"
).cpu().detach()
model_name = kernel_name + "_" + mean_name + str(k) + "_"
torch.save(save_samples, savepath + model_name + date + ".pt")
model.train()
torch.cuda.empty_cache()
del model
return dat, save_samples
@@ -1,133 +0,0 @@
import numpy as np
import torch
import pandas as pd
import gpytorch
import argparse
import datetime
import warnings
import os
from voltron.data import make_ticker_list, GetStockHistory
from LSTMUtils import SequenceDataset, LSTM, TrainLSTM, LSTMRollouts, NLL
from torch.utils.data import DataLoader
def main(args):
data_path = "../../voltron/data/"
ticker_file = args.ticker_fname + ".txt"
tckr_list = make_ticker_list(data_path + ticker_file)
# tckr_list = ['TSLA']
use_cuda = False
if torch.cuda.is_available():
use_cuda = True
ntest = args.forecast_horizon
ntrain = args.ntrain
seq_len = args.seq_length
if args.end_date.lower() == "none":
end_date = datetime.date.today()
else:
end_date = datetime.datetime.strptime(args.end_date, "%Y-%m-%d")
for tckr in tckr_list:
try:
data = GetStockHistory(tckr, history= ntrain + args.lookback)
end_idxs = torch.arange(args.ntrain, data.shape[0],
int((data.shape[0]-args.ntrain)/args.ntimes))
savepath = "./saved-outputs/" + tckr + "/"
if not os.path.exists(savepath):
os.mkdir(savepath)
for last_day in end_idxs:
date = str(data.index[last_day.item()].date())
raw_y = data.Close[last_day.item()-ntrain:last_day.item()].to_numpy()
raw_y = torch.FloatTensor(raw_y).log()
train_y = (raw_y - raw_y.mean())/raw_y.std()
## make trainloader ##
dset = SequenceDataset(train_y, seq_len)
trainloader = DataLoader(dset, batch_size=args.batch_size, shuffle=True)
model = LSTM(2, seq_len, 128, 1)
if use_cuda:
model = model.cuda()
optimizer = torch.optim.Adam(model.parameters(), lr=0.01)
TrainLSTM(trainloader, model, NLL, optimizer, epochs=args.train_epochs,
printing=True, use_cuda=use_cuda)
rollouts = LSTMRollouts(model, args.nsample, ntest,
dset, use_cuda).cpu()
rollouts = rollouts * raw_y.std() + raw_y.mean()
torch.save(rollouts, savepath + "lstm_" + date + ".pt")
del model
except:
print("FAILED ", tckr)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument(
"--ntimes",
type=int,
default=25,
)
parser.add_argument(
"--forecast_horizon",
type=int,
default=20,
)
parser.add_argument(
"--seq_length",
type=int,
default=25,
)
parser.add_argument(
"--ticker_fname",
type=str,
default='test_tickers',
)
parser.add_argument(
"--ntrain",
type=int,
default=400,
)
parser.add_argument(
"--batch_size",
type=int,
default=128,
)
parser.add_argument(
"--nsample",
type=int,
default=1000,
)
parser.add_argument(
"--printing",
type=bool,
default=False
)
parser.add_argument(
"--train_epochs",
type=int,
default=200,
)
parser.add_argument(
"--end_date",
default="none",
)
parser.add_argument(
"--lookback",
type=int,
default=500,
)
parser.add_argument(
"--save",
type=bool,
default=False,
)
args = parser.parse_args()
main(args)
@@ -1,3 +0,0 @@
AAPL
MSFT
GOOG
BIN
View File
Binary file not shown.