From 73b7fa1aaf5fcb88d6d7129ce8b7b458d4425f89 Mon Sep 17 00:00:00 2001 From: Oleg Sheynin Date: Thu, 29 May 2025 17:10:10 -0400 Subject: [PATCH] progress --- src/pt_backtest.py | 2 +- src/strategies.py | 57 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 43 insertions(+), 16 deletions(-) diff --git a/src/pt_backtest.py b/src/pt_backtest.py index d1c08d7..9d7655d 100644 --- a/src/pt_backtest.py +++ b/src/pt_backtest.py @@ -49,7 +49,7 @@ def run_all_pairs(config: Dict, datafile: str, price_column: str, bt_result: Bac pairs_trades = [] strategy = StaticFitStrategy() for pair in _create_pairs(config): - single_pair_trades = strategy.run_pair(pair=pair, bt_result=bt_result) + single_pair_trades = strategy.run_pair(pair=pair, config=CONFIG, bt_result=bt_result) if single_pair_trades is not None and len(single_pair_trades) > 0: pairs_trades.append(single_pair_trades) # Check if result_list has any data before concatenating diff --git a/src/strategies.py b/src/strategies.py index 42f6907..0350e94 100644 --- a/src/strategies.py +++ b/src/strategies.py @@ -5,22 +5,10 @@ from typing import Dict, Optional import pandas as pd -# ============= statsmodels =================== - -from backtest_configs import CRYPTO_CONFIG from tools.trading_pair import TradingPair from results import BacktestResult NanoPerMin = 1e9 -UNSET_FLOAT: float = sys.float_info.max -UNSET_INT: int = sys.maxsize - - -CONFIG = CRYPTO_CONFIG -# CONFIG = EQT_CONFIG - - - class PairsTradingStrategy(ABC): TRADES_COLUMNS = [ @@ -38,8 +26,8 @@ class PairsTradingStrategy(ABC): class StaticFitStrategy(PairsTradingStrategy): - def run_pair(self, pair: TradingPair, bt_result: BacktestResult) -> Optional[pd.DataFrame]: # abstractmethod - pair.get_datasets(training_minutes=CONFIG["training_minutes"]) + def run_pair(self, config: Dict, pair: TradingPair, bt_result: BacktestResult) -> Optional[pd.DataFrame]: # abstractmethod + pair.get_datasets(training_minutes=config["training_minutes"]) try: is_cointegrated = pair.train_pair() if not is_cointegrated: @@ -55,7 +43,7 @@ class StaticFitStrategy(PairsTradingStrategy): print(f"{pair}: Prediction failed: {str(e)}") return None - pair_trades = self.create_trading_signals(pair=pair, config=CONFIG, result=bt_result) + pair_trades = self.create_trading_signals(pair=pair, config=config, result=bt_result) return pair_trades @@ -211,3 +199,42 @@ class StaticFitStrategy(PairsTradingStrategy): columns=self.TRADES_COLUMNS, ) +class SlidingFitStrategy(PairsTradingStrategy): + def __init__(self): + super().__init__() + self.curr_training_start_idx_ = 0 + + def run_pair(self, config: Dict, pair: TradingPair, bt_result: BacktestResult) -> Optional[pd.DataFrame]: + pair.user_data_['is_position_open'] = False + training_minutes = config["training_minutes"] + while True: + pair.get_datasets( + training_minutes=training_minutes, + training_start_index=self.curr_training_start_idx_, + testing_size=1 + ) + + if len(pair.training_df_) < training_minutes: + print(f"{pair}: Not enough training data. Completing the job.") + break + + try: + is_cointegrated = pair.train_pair() + if not is_cointegrated: + print(f"{pair} IS NOT COINTEGRATED") + return None + except Exception as e: + print(f"{pair}: Training failed: {str(e)}") + return None + + try: + pair.predict() + except Exception as e: + print(f"{pair}: Prediction failed: {str(e)}") + return None + + + pair_trades = self.create_trading_signals(pair=pair, config=config, result=bt_result) + + return pair_trades +