Skip to content

Commit

Permalink
New working instrument factory for stock instrument.
Browse files Browse the repository at this point in the history
  • Loading branch information
Sinbad-The-Sailor committed Aug 5, 2023
1 parent 93a7cd0 commit 07291ba
Show file tree
Hide file tree
Showing 6 changed files with 382 additions and 56 deletions.
68 changes: 68 additions & 0 deletions src2/main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# -*- coding: utf-8 -*-
import torch
import pandas as pd
import numpy as np

from datetime import datetime
from matplotlib import pyplot as plt

from utils.stock_factory import StockFactory
from utils.instruments import Stock
from utils.config import STOCK_ADMISSIBLE_MODELS

from models.ar import AR
from models.garch import GARCH



start = datetime.strptime("2005-05-01", r"%Y-%m-%d")
end = datetime.strptime("2023-06-01", r"%Y-%m-%d")
instrument_specification = ["XOM", "GS", "T"]
instrument_factory = StockFactory(tickers=instrument_specification,
start=start,
end=end)
stocks = instrument_factory.build_stocks()



class Simulator:

def __init__(self, instruments: list):
self._instruments = instruments
self._calibrated = False

def calibrate(self):
self._calibrate_instruments()
self._calibrate_copula()
self._calibrated = True

def _calibrate_instruments(self):
for instrument in self._instruments:
if isinstance(instrument, Stock):
self._calibrate_stock(instrument)

def _calibrate_copula(self):
...

def _calibrate_stock(self, stock):
current_aic = np.inf
risk_factor = stock.risk_factors[0]
data = risk_factor.price_history.log_returns

for model_name in STOCK_ADMISSIBLE_MODELS:
if model_name == "AR":
model = AR(data)
model.calibrate()
if model.aic < current_aic:
risk_factor.model = model

elif model_name == "GARCH":
model = GARCH(data)
model.calibrate()
if model.aic < current_aic:
risk_factor.model = model


def run_simulation(time_steps: int) -> torch.Tensor:
# Check for succesful calibration, Throw an error otherwise.
...
3 changes: 1 addition & 2 deletions src2/models/garch.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ def parameters(self) -> tuple[float, 3]:
optimal_parameters = self._optimal_parameters
alpha = optimal_parameters[0]
beta = optimal_parameters[1]
long_run_variance = self._long_run_variance
long_run_variance = self._long_run_variance.item()

return alpha, beta, long_run_variance

Expand Down Expand Up @@ -72,7 +72,6 @@ def transform_to_true(self, uniform_sample: torch.Tensor) -> torch.Tensor:

return simulated_values


def transform_to_uniform(self):
self._check_calibration()

Expand Down
8 changes: 4 additions & 4 deletions src2/simulator/simulator.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@

class Simulator:

def __init__(self, assets: list[Asset]):
self.assets = assets
def __init__(self, instruments: list[Asset]):
self._instruments = instruments
self.is_calibrated = False



def calibrate(self):
# Find models for each risk factor. Use a factory design pattern.
# Find models for each risk factor.
# Use a factory design pattern.
# If none are succesful throw an error.

...


Expand Down
333 changes: 283 additions & 50 deletions src2/testing.ipynb

Large diffs are not rendered by default.

3 changes: 3 additions & 0 deletions src2/utils/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,6 @@
MAXIMUM_AR_ORDER = 5
INITIAL_VARIANCE_GARCH_OBSERVATIONS = 20
INITIAL_GARCH_PARAMETERS = (0.05, 0.90)

STOCK_ADMISSIBLE_MODELS = ("AR",
"GARCH")
23 changes: 23 additions & 0 deletions src2/utils/stock_factory.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-

from utils.instruments import Asset, Stock, RiskFactor
from utils.data_handler import YahooDataHandler

class StockFactory:

def __init__(self, tickers, start, end, interval=None):
self._tickers = tickers
self._start = start
self._end = end
self._ydr = YahooDataHandler()


def build_stocks(self) -> list[Stock]:
stocks = []
for ticker in self._tickers:
price_history = self._ydr.get_price_history(ticker, self._start, self._end)
identifier = f"{ticker}_RF"
risk_factor = RiskFactor(identifier, price_history)
stock = Stock(identifier=ticker, risk_factors=[risk_factor])
stocks.append(stock)
return stocks

0 comments on commit 07291ba

Please sign in to comment.