diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1b87e13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +*/.ipynb_checkpoints/* +*/__pycache__/* diff --git a/experiments/.DS_Store b/experiments/.DS_Store deleted file mode 100644 index bcf6c89..0000000 Binary files a/experiments/.DS_Store and /dev/null differ diff --git a/experiments/stocks/.ipynb_checkpoints/ForecastGenerator-checkpoint.py b/experiments/stocks/.ipynb_checkpoints/ForecastGenerator-checkpoint.py deleted file mode 100644 index add7f03..0000000 --- a/experiments/stocks/.ipynb_checkpoints/ForecastGenerator-checkpoint.py +++ /dev/null @@ -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) \ No newline at end of file diff --git a/experiments/stocks/.ipynb_checkpoints/GenerateMultiMeanPreds-checkpoint.py b/experiments/stocks/.ipynb_checkpoints/GenerateMultiMeanPreds-checkpoint.py deleted file mode 100644 index 0c82708..0000000 --- a/experiments/stocks/.ipynb_checkpoints/GenerateMultiMeanPreds-checkpoint.py +++ /dev/null @@ -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 \ No newline at end of file diff --git a/experiments/stocks/.ipynb_checkpoints/LSTMGenerator-checkpoint.py b/experiments/stocks/.ipynb_checkpoints/LSTMGenerator-checkpoint.py deleted file mode 100644 index 7d7c05d..0000000 --- a/experiments/stocks/.ipynb_checkpoints/LSTMGenerator-checkpoint.py +++ /dev/null @@ -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) \ No newline at end of file diff --git a/experiments/stocks/.ipynb_checkpoints/example_tickers-checkpoint.txt b/experiments/stocks/.ipynb_checkpoints/example_tickers-checkpoint.txt deleted file mode 100644 index 23907e6..0000000 --- a/experiments/stocks/.ipynb_checkpoints/example_tickers-checkpoint.txt +++ /dev/null @@ -1,3 +0,0 @@ -AAPL -MSFT -GOOG \ No newline at end of file diff --git a/experiments/stocks/__pycache__/GenerateMultiMeanPreds.cpython-38.pyc b/experiments/stocks/__pycache__/GenerateMultiMeanPreds.cpython-38.pyc deleted file mode 100644 index 19b6b56..0000000 Binary files a/experiments/stocks/__pycache__/GenerateMultiMeanPreds.cpython-38.pyc and /dev/null differ diff --git a/experiments/weather/.DS_Store b/experiments/weather/.DS_Store deleted file mode 100644 index effe447..0000000 Binary files a/experiments/weather/.DS_Store and /dev/null differ