initial cleaning after refactoring

This commit is contained in:
Oleg Sheynin 2025-07-30 23:15:24 +00:00
parent 1b6b5e5735
commit b474752959
22 changed files with 105 additions and 13 deletions

View File

@ -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",
}
}

43
configuration/ols-exp.cfg Normal file
View File

@ -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",
}
}

View File

@ -23,7 +23,7 @@
"dis-equilibrium_open_trshld": 2.0, "dis-equilibrium_open_trshld": 2.0,
"dis-equilibrium_close_trshld": 0.5, "dis-equilibrium_close_trshld": 0.5,
"training_size": 120, "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", "model_data_policy_class": "pt_strategy.model_data_policy.RollingWindowDataPolicy",
# ====== Stop Conditions ====== # ====== Stop Conditions ======

View File

@ -25,7 +25,7 @@
"dis-equilibrium_close_trshld": 1.0, "dis-equilibrium_close_trshld": 1.0,
"training_size": 120, "training_size": 120,
"model_class": "pt_strategy.models.VECMModel", "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 Conditions ======
"stop_close_conditions": { "stop_close_conditions": {

View File

@ -23,9 +23,9 @@
}, },
"dis-equilibrium_open_trshld": 2.0, "dis-equilibrium_open_trshld": 2.0,
"dis-equilibrium_close_trshld": 1.0, "dis-equilibrium_close_trshld": 1.0,
"training_minutes": 120, # TODO Remove this
"training_size": 120, "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 Conditions ======
"stop_close_conditions": { "stop_close_conditions": {

View File

@ -14,6 +14,8 @@ class DataParams:
class ModelDataPolicy(ABC): class ModelDataPolicy(ABC):
config_: Dict[str, Any] config_: Dict[str, Any]
current_data_params_: DataParams current_data_params_: DataParams
count_:int
def __init__(self, config: Dict[str, Any]): def __init__(self, config: Dict[str, Any]):
self.config_ = config self.config_ = config
@ -21,10 +23,12 @@ class ModelDataPolicy(ABC):
training_size=config.get("training_size", 120), training_size=config.get("training_size", 120),
training_start_index=0, training_start_index=0,
) )
self.count_ = 0
@abstractmethod @abstractmethod
def advance(self) -> DataParams: def advance(self) -> DataParams:
... self.count_ += 1
print(self.count_, end='\r')
@staticmethod @staticmethod
def create(config: Dict[str, Any]) -> ModelDataPolicy: def create(config: Dict[str, Any]) -> ModelDataPolicy:
@ -43,9 +47,8 @@ class RollingWindowDataPolicy(ModelDataPolicy):
self.count_ = 1 self.count_ = 1
def advance(self) -> DataParams: def advance(self) -> DataParams:
super().advance()
self.current_data_params_.training_start_index += 1 self.current_data_params_.training_start_index += 1
print(self.count_, end='\r')
self.count_ += 1
return self.current_data_params_ return self.current_data_params_
@ -54,6 +57,7 @@ class ExpandingWindowDataPolicy(ModelDataPolicy):
super().__init__(config) super().__init__(config)
def advance(self) -> DataParams: def advance(self) -> DataParams:
super().advance()
self.current_data_params_.training_size += 1 self.current_data_params_.training_size += 1
return self.current_data_params_ return self.current_data_params_

View File

@ -10,7 +10,7 @@ from pt_strategy.pt_model import PairsTradingModel, Prediction
from pt_strategy.trading_pair import TradingPair from pt_strategy.trading_pair import TradingPair
class ZScoreOLSModel(PairsTradingModel): class OLSModel(PairsTradingModel):
zscore_model_: Optional[sm.regression.linear_model.RegressionResultsWrapper] zscore_model_: Optional[sm.regression.linear_model.RegressionResultsWrapper]
pair_predict_result_: Optional[pd.DataFrame] pair_predict_result_: Optional[pd.DataFrame]
zscore_df_: 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] disequilibrium = (predicted_df[pair.colnames()] @ vecm_fit.beta)[0][0]
scaled_disequilibrium = (disequilibrium - self.training_mu_) / self.training_std_ scaled_disequilibrium = (disequilibrium - self.training_mu_) / self.training_std_
return Prediction( return Prediction(
tstamp_=pair.market_data_.index[-1], tstamp=pair.market_data_.iloc[-1]["tstamp"],
disequilibrium_=disequilibrium, disequilibrium=disequilibrium,
scaled_disequilibrium_=scaled_disequilibrium, scaled_disequilibrium=scaled_disequilibrium,
pair_=pair,
) )
def _fit_VECM(self, pair: TradingPair) -> VECMResults: # type: ignore def _fit_VECM(self, pair: TradingPair) -> VECMResults: # type: ignore

View File

@ -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_ = 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() self._set_market_data()
def _set_market_data(self, ) -> None: def _set_market_data(self, ) -> None:

View File

@ -4,7 +4,7 @@ from datetime import date, datetime
from typing import Any, Dict, List, Optional, Tuple from typing import Any, Dict, List, Optional, Tuple
import pandas as pd 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+ # Recommended replacement adapters and converters for Python 3.12+