From b474752959a3ae2c40b661c605b00a9946888eda Mon Sep 17 00:00:00 2001 From: Oleg Sheynin Date: Wed, 30 Jul 2025 23:15:24 +0000 Subject: [PATCH] initial cleaning after refactoring --- __DELETE__/configuration/vecm.cfg | 44 +++++++++++++++++++ .../configuration}/zscore.cfg | 0 .../configuration}/zscore_expanding.cfg | 0 .../lib}/pt_trading/expanding_window_fit.py | 0 .../lib}/pt_trading/fit_method.py | 0 {lib => __DELETE__/lib}/pt_trading/results.py | 0 .../lib}/pt_trading/rolling_window_fit.py | 0 .../lib}/pt_trading/trading_pair.py | 0 .../lib}/pt_trading/vecm_rolling_fit.py | 0 .../lib}/pt_trading/z-score_rolling_fit.py | 0 .../research}/cointegration_test.py | 0 .../research}/pt_backtest.py | 0 configuration/ols-exp.cfg | 43 ++++++++++++++++++ configuration/{new_zscore.cfg => ols.cfg} | 2 +- configuration/{new_vecm.cfg => vecm-exp.cfg} | 2 +- configuration/vecm.cfg | 4 +- lib/pt_strategy/model_data_policy.py | 10 +++-- lib/pt_strategy/models.py | 9 ++-- lib/pt_strategy/pt_market_data.py | 2 + lib/pt_strategy/results.py | 2 +- research/{backtest_new.py => backtest.py} | 0 {research => tests}/viz_test.py | 0 22 files changed, 105 insertions(+), 13 deletions(-) create mode 100644 __DELETE__/configuration/vecm.cfg rename {configuration => __DELETE__/configuration}/zscore.cfg (100%) rename {configuration => __DELETE__/configuration}/zscore_expanding.cfg (100%) rename {lib => __DELETE__/lib}/pt_trading/expanding_window_fit.py (100%) rename {lib => __DELETE__/lib}/pt_trading/fit_method.py (100%) rename {lib => __DELETE__/lib}/pt_trading/results.py (100%) rename {lib => __DELETE__/lib}/pt_trading/rolling_window_fit.py (100%) rename {lib => __DELETE__/lib}/pt_trading/trading_pair.py (100%) rename {lib => __DELETE__/lib}/pt_trading/vecm_rolling_fit.py (100%) rename {lib => __DELETE__/lib}/pt_trading/z-score_rolling_fit.py (100%) rename {research => __DELETE__/research}/cointegration_test.py (100%) rename {research => __DELETE__/research}/pt_backtest.py (100%) create mode 100644 configuration/ols-exp.cfg rename configuration/{new_zscore.cfg => ols.cfg} (95%) rename configuration/{new_vecm.cfg => vecm-exp.cfg} (92%) rename research/{backtest_new.py => backtest.py} (100%) rename {research => tests}/viz_test.py (100%) diff --git a/__DELETE__/configuration/vecm.cfg b/__DELETE__/configuration/vecm.cfg new file mode 100644 index 0000000..973578d --- /dev/null +++ b/__DELETE__/configuration/vecm.cfg @@ -0,0 +1,44 @@ +{ + "market_data_loading": { + "CRYPTO": { + "data_directory": "./data/crypto", + "db_table_name": "md_1min_bars", + "instrument_id_pfx": "PAIR-", + }, + "EQUITY": { + "data_directory": "./data/equity", + "db_table_name": "md_1min_bars", + "instrument_id_pfx": "STOCK-", + } + }, + + # ====== Funding ====== + "funding_per_pair": 2000.0, + + # ====== Trading Parameters ====== + "stat_model_price": "close", # "vwap" + "execution_price": { + "column": "vwap", + "shift": 1, + }, + "dis-equilibrium_open_trshld": 2.0, + "dis-equilibrium_close_trshld": 1.0, + "training_minutes": 120, # TODO Remove this + "training_size": 120, + "fit_method_class": "pt_trading.vecm_rolling_fit.VECMRollingFit", + + # ====== Stop Conditions ====== + "stop_close_conditions": { + "profit": 2.0, + "loss": -0.5 + } + + # ====== End of Session Closeout ====== + "close_outstanding_positions": true, + # "close_outstanding_positions": false, + "trading_hours": { + "timezone": "America/New_York", + "begin_session": "7:30:00", + "end_session": "18:30:00", + } +} \ No newline at end of file diff --git a/configuration/zscore.cfg b/__DELETE__/configuration/zscore.cfg similarity index 100% rename from configuration/zscore.cfg rename to __DELETE__/configuration/zscore.cfg diff --git a/configuration/zscore_expanding.cfg b/__DELETE__/configuration/zscore_expanding.cfg similarity index 100% rename from configuration/zscore_expanding.cfg rename to __DELETE__/configuration/zscore_expanding.cfg diff --git a/lib/pt_trading/expanding_window_fit.py b/__DELETE__/lib/pt_trading/expanding_window_fit.py similarity index 100% rename from lib/pt_trading/expanding_window_fit.py rename to __DELETE__/lib/pt_trading/expanding_window_fit.py diff --git a/lib/pt_trading/fit_method.py b/__DELETE__/lib/pt_trading/fit_method.py similarity index 100% rename from lib/pt_trading/fit_method.py rename to __DELETE__/lib/pt_trading/fit_method.py diff --git a/lib/pt_trading/results.py b/__DELETE__/lib/pt_trading/results.py similarity index 100% rename from lib/pt_trading/results.py rename to __DELETE__/lib/pt_trading/results.py diff --git a/lib/pt_trading/rolling_window_fit.py b/__DELETE__/lib/pt_trading/rolling_window_fit.py similarity index 100% rename from lib/pt_trading/rolling_window_fit.py rename to __DELETE__/lib/pt_trading/rolling_window_fit.py diff --git a/lib/pt_trading/trading_pair.py b/__DELETE__/lib/pt_trading/trading_pair.py similarity index 100% rename from lib/pt_trading/trading_pair.py rename to __DELETE__/lib/pt_trading/trading_pair.py diff --git a/lib/pt_trading/vecm_rolling_fit.py b/__DELETE__/lib/pt_trading/vecm_rolling_fit.py similarity index 100% rename from lib/pt_trading/vecm_rolling_fit.py rename to __DELETE__/lib/pt_trading/vecm_rolling_fit.py diff --git a/lib/pt_trading/z-score_rolling_fit.py b/__DELETE__/lib/pt_trading/z-score_rolling_fit.py similarity index 100% rename from lib/pt_trading/z-score_rolling_fit.py rename to __DELETE__/lib/pt_trading/z-score_rolling_fit.py diff --git a/research/cointegration_test.py b/__DELETE__/research/cointegration_test.py similarity index 100% rename from research/cointegration_test.py rename to __DELETE__/research/cointegration_test.py diff --git a/research/pt_backtest.py b/__DELETE__/research/pt_backtest.py similarity index 100% rename from research/pt_backtest.py rename to __DELETE__/research/pt_backtest.py diff --git a/configuration/ols-exp.cfg b/configuration/ols-exp.cfg new file mode 100644 index 0000000..09ef8f6 --- /dev/null +++ b/configuration/ols-exp.cfg @@ -0,0 +1,43 @@ +{ + "market_data_loading": { + "CRYPTO": { + "data_directory": "./data/crypto", + "db_table_name": "md_1min_bars", + "instrument_id_pfx": "PAIR-", + }, + "EQUITY": { + "data_directory": "./data/equity", + "db_table_name": "md_1min_bars", + "instrument_id_pfx": "STOCK-", + } + }, + + # ====== Funding ====== + "funding_per_pair": 2000.0, + # ====== Trading Parameters ====== + "stat_model_price": "close", + "execution_price": { + "column": "vwap", + "shift": 1, + }, + "dis-equilibrium_open_trshld": 2.0, + "dis-equilibrium_close_trshld": 0.5, + "training_size": 120, + "model_class": "pt_strategy.models.OLSModel", + "model_data_policy_class": "pt_strategy.model_data_policy.ExpandingWindowDataPolicy", + + # ====== Stop Conditions ====== + "stop_close_conditions": { + "profit": 2.0, + "loss": -0.5 + } + + # ====== End of Session Closeout ====== + "close_outstanding_positions": true, + # "close_outstanding_positions": false, + "trading_hours": { + "timezone": "America/New_York", + "begin_session": "7:30:00", + "end_session": "18:30:00", + } +} \ No newline at end of file diff --git a/configuration/new_zscore.cfg b/configuration/ols.cfg similarity index 95% rename from configuration/new_zscore.cfg rename to configuration/ols.cfg index 2ea53a8..0958bc9 100644 --- a/configuration/new_zscore.cfg +++ b/configuration/ols.cfg @@ -23,7 +23,7 @@ "dis-equilibrium_open_trshld": 2.0, "dis-equilibrium_close_trshld": 0.5, "training_size": 120, - "model_class": "pt_strategy.models.ZScoreOLSModel", + "model_class": "pt_strategy.models.OLSModel", "model_data_policy_class": "pt_strategy.model_data_policy.RollingWindowDataPolicy", # ====== Stop Conditions ====== diff --git a/configuration/new_vecm.cfg b/configuration/vecm-exp.cfg similarity index 92% rename from configuration/new_vecm.cfg rename to configuration/vecm-exp.cfg index 16562d1..d6031cd 100644 --- a/configuration/new_vecm.cfg +++ b/configuration/vecm-exp.cfg @@ -25,7 +25,7 @@ "dis-equilibrium_close_trshld": 1.0, "training_size": 120, "model_class": "pt_strategy.models.VECMModel", - "model_data_policy_class": "pt_strategy.model_data_policy.RollingWindowDataPolicy", + "model_data_policy_class": "pt_strategy.model_data_policy.ExpandingWindowDataPolicy", # ====== Stop Conditions ====== "stop_close_conditions": { diff --git a/configuration/vecm.cfg b/configuration/vecm.cfg index 973578d..16562d1 100644 --- a/configuration/vecm.cfg +++ b/configuration/vecm.cfg @@ -23,9 +23,9 @@ }, "dis-equilibrium_open_trshld": 2.0, "dis-equilibrium_close_trshld": 1.0, - "training_minutes": 120, # TODO Remove this "training_size": 120, - "fit_method_class": "pt_trading.vecm_rolling_fit.VECMRollingFit", + "model_class": "pt_strategy.models.VECMModel", + "model_data_policy_class": "pt_strategy.model_data_policy.RollingWindowDataPolicy", # ====== Stop Conditions ====== "stop_close_conditions": { diff --git a/lib/pt_strategy/model_data_policy.py b/lib/pt_strategy/model_data_policy.py index fc2e110..6907526 100644 --- a/lib/pt_strategy/model_data_policy.py +++ b/lib/pt_strategy/model_data_policy.py @@ -14,6 +14,8 @@ class DataParams: class ModelDataPolicy(ABC): config_: Dict[str, Any] current_data_params_: DataParams + count_:int + def __init__(self, config: Dict[str, Any]): self.config_ = config @@ -21,10 +23,12 @@ class ModelDataPolicy(ABC): training_size=config.get("training_size", 120), training_start_index=0, ) + self.count_ = 0 @abstractmethod def advance(self) -> DataParams: - ... + self.count_ += 1 + print(self.count_, end='\r') @staticmethod def create(config: Dict[str, Any]) -> ModelDataPolicy: @@ -43,9 +47,8 @@ class RollingWindowDataPolicy(ModelDataPolicy): self.count_ = 1 def advance(self) -> DataParams: + super().advance() self.current_data_params_.training_start_index += 1 - print(self.count_, end='\r') - self.count_ += 1 return self.current_data_params_ @@ -54,6 +57,7 @@ class ExpandingWindowDataPolicy(ModelDataPolicy): super().__init__(config) def advance(self) -> DataParams: + super().advance() self.current_data_params_.training_size += 1 return self.current_data_params_ diff --git a/lib/pt_strategy/models.py b/lib/pt_strategy/models.py index 24e819e..df60d1f 100644 --- a/lib/pt_strategy/models.py +++ b/lib/pt_strategy/models.py @@ -10,7 +10,7 @@ from pt_strategy.pt_model import PairsTradingModel, Prediction from pt_strategy.trading_pair import TradingPair -class ZScoreOLSModel(PairsTradingModel): +class OLSModel(PairsTradingModel): zscore_model_: Optional[sm.regression.linear_model.RegressionResultsWrapper] pair_predict_result_: Optional[pd.DataFrame] zscore_df_: Optional[pd.DataFrame] @@ -67,10 +67,9 @@ class VECMModel(PairsTradingModel): disequilibrium = (predicted_df[pair.colnames()] @ vecm_fit.beta)[0][0] scaled_disequilibrium = (disequilibrium - self.training_mu_) / self.training_std_ return Prediction( - tstamp_=pair.market_data_.index[-1], - disequilibrium_=disequilibrium, - scaled_disequilibrium_=scaled_disequilibrium, - pair_=pair, + tstamp=pair.market_data_.iloc[-1]["tstamp"], + disequilibrium=disequilibrium, + scaled_disequilibrium=scaled_disequilibrium, ) def _fit_VECM(self, pair: TradingPair) -> VECMResults: # type: ignore diff --git a/lib/pt_strategy/pt_market_data.py b/lib/pt_strategy/pt_market_data.py index 6446811..1709f1b 100644 --- a/lib/pt_strategy/pt_market_data.py +++ b/lib/pt_strategy/pt_market_data.py @@ -82,6 +82,8 @@ class ResearchMarketData(PtMarketData): ) self.origin_mkt_data_df_ = pd.concat([self.origin_mkt_data_df_, md_df]) + self.origin_mkt_data_df_ = self.origin_mkt_data_df_.sort_values(by="tstamp") + self.origin_mkt_data_df_ = self.origin_mkt_data_df_.dropna().reset_index(drop=True) self._set_market_data() def _set_market_data(self, ) -> None: diff --git a/lib/pt_strategy/results.py b/lib/pt_strategy/results.py index c3624f2..77aada9 100644 --- a/lib/pt_strategy/results.py +++ b/lib/pt_strategy/results.py @@ -4,7 +4,7 @@ from datetime import date, datetime from typing import Any, Dict, List, Optional, Tuple import pandas as pd -from pt_trading.trading_pair import TradingPair +from pt_strategy.trading_pair import TradingPair # Recommended replacement adapters and converters for Python 3.12+ diff --git a/research/backtest_new.py b/research/backtest.py similarity index 100% rename from research/backtest_new.py rename to research/backtest.py diff --git a/research/viz_test.py b/tests/viz_test.py similarity index 100% rename from research/viz_test.py rename to tests/viz_test.py