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_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 ======

View File

@ -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": {

View File

@ -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": {

View File

@ -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_

View File

@ -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

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_ = 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:

View File

@ -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+