Skip to content

Commit

Permalink
Cache for GARCH variance. Speed increase x10.
Browse files Browse the repository at this point in the history
  • Loading branch information
Sinbad-The-Sailor committed Feb 24, 2024
1 parent d616352 commit ae02ccc
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 6 deletions.
10 changes: 5 additions & 5 deletions backtest.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,27 +26,27 @@
start_date = "2020-01-02"
end_date = "2020-01-05" # "2023-05-31"
date_range = pd.date_range(start=start_date, end=end_date, freq='B')
solutions = {}
solutions = {"2020-01-01": inital_weights}
times = {}

for date in date_range:
t1 = time.time()
universe.date_today = date
simulator = Simulator(universe)
simulator.calibrate()
simulator.run_simulation(time_steps=10, number_of_simulations=1000)
optimizer = MPCMaximumReturn(universe, portfolio, simulator.return_tensor, gamma=1, l1_penalty=0, l2_penalty=0.05,
simulator.run_simulation(time_steps=10, number_of_simulations=1_000)
optimizer = MPCMaximumReturn(universe, portfolio, simulator.return_tensor, gamma=2, l1_penalty=0, l2_penalty=0.15,
covariance_matrix=simulator.covariance_matrix)
optimizer.solve()

solution = optimizer.solution
times[date] = time.time() - t1
portfolio.weights = solution
solutions[date] = solution


print('\n' * 10)
for date, solution in solutions.items():
print(f"Took {times[date]} seconds.")
print(f"Took {times.get(date, -1)} seconds.")
for a, w in solution.items():
print(a, w)
print()
6 changes: 5 additions & 1 deletion src/abacus/models/garch.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# -*- coding: utf-8 -*-
import time

from cytoolz import memoize

import torch
import numpy as np

Expand Down Expand Up @@ -59,7 +63,6 @@ def transform_to_true(self, uniform_sample: torch.Tensor) -> torch.Tensor:
parameters = torch.tensor(self._solution.x)
mu_corr, mu_ewma = self._intermediary_parameters(parameters=parameters)


variance = self._compute_variance(parameters=torch.tensor(self._solution.x))[-1]
squared_return = self._squared_returns[-1]

Expand Down Expand Up @@ -125,6 +128,7 @@ def _compute_inital_variance(self) -> torch.Tensor:
return torch.square(torch.std(self._data[:INITIAL_VARIANCE_GARCH_OBSERVATIONS]))
return self._initial_squared_returns

@memoize
def _compute_variance(self, parameters: torch.Tensor) -> torch.Tensor:
initial_variance = self._initial_variance
variances = torch.zeros(self._number_of_observations)
Expand Down
2 changes: 2 additions & 0 deletions src/abacus/simulator/simulator.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
# -*- coding: utf-8 -*-
import time

import torch
import numpy as np
import pyvinecopulib as pv
Expand Down

0 comments on commit ae02ccc

Please sign in to comment.