This commit is contained in:
2025-05-29 02:47:38 -04:00
parent 06884d72b7
commit 91623db4b7
5 changed files with 132 additions and 119 deletions
+10 -87
View File
@@ -8,6 +8,7 @@ import numpy as np
# ============= statsmodels ===================
from statsmodels.tsa.vector_ar.vecm import VECM
from backtest_configs import CRYPTO_CONFIG
from tools.data_loader import load_market_data, transform_dataframe
from tools.trading_pair import TradingPair
from results import BacktestResult
@@ -16,90 +17,11 @@ NanoPerMin = 1e9
UNSET_FLOAT: float = sys.float_info.max
UNSET_INT: int = sys.maxsize
# ------------------------ Configuration ------------------------
# Default configuration
CRYPTO_CONFIG: Dict = {
"security_type": "CRYPTO",
# --- Data retrieval
"data_directory": "./data/crypto",
"datafiles": [
"20250519.mktdata.ohlcv.db",
# "20250519.mktdata.ohlcv.db",
],
"db_table_name": "bnbspot_ohlcv_1min",
# ----- Instruments
"exchange_id": "BNBSPOT",
"instrument_id_pfx": "PAIR-",
"instruments": [
"BTC-USDT",
# "ETH-USDT",
"LTC-USDT",
],
"trading_hours": {
"begin_session": "00:00:00",
"end_session": "23:59:00",
"timezone": "UTC",
},
# ----- Model Settings
"price_column": "close",
"min_required_points": 30,
"zero_threshold": 1e-10,
"disequilibrium_open_trshld": 2,
"disequilibrium_close_trshld": 0.5,
# # ==========================================================================
"training_minutes": 120,
# ----- Validation
"funding_per_pair": 2000.0, # USD
}
# ========================== EQUITIES
EQT_CONFIG: Dict = {
# --- Data retrieval
"security_type": "EQUITY",
"data_directory": "./data/equity",
"datafiles": [
"20250508.alpaca_sim_md.db",
# "20250509.alpaca_sim_md.db",
# "20250512.alpaca_sim_md.db",
# "20250513.alpaca_sim_md.db",
# "20250514.alpaca_sim_md.db",
# "20250515.alpaca_sim_md.db",
# "20250516.alpaca_sim_md.db",
# "20250519.alpaca_sim_md.db",
# "20250520.alpaca_sim_md.db"
],
"db_table_name": "md_1min_bars",
# ----- Instruments
"exchange_id": "ALPACA",
"instrument_id_pfx": "STOCK-",
"instruments": [
"COIN",
"GBTC",
"HOOD",
"MSTR",
"PYPL",
],
"trading_hours": {
"begin_session": "9:30:00",
"end_session": "16:00:00",
"timezone": "America/New_York",
},
# ----- Model Settings
"price_column": "close",
"min_required_points": 30,
"zero_threshold": 1e-10,
"disequilibrium_open_trshld": 2.0,
"disequilibrium_close_trshld": 0.5,
"training_minutes": 120,
# ----- Validation
"funding_per_pair": 2000.0,
}
# ==========================================================================
# CONFIG = CRYPTO_CONFIG
CONFIG = EQT_CONFIG
CONFIG = CRYPTO_CONFIG
# CONFIG = EQT_CONFIG
BacktestResults = BacktestResult(config=CONFIG)
@@ -146,8 +68,8 @@ def create_trading_signals(pair: TradingPair) -> pd.DataFrame:
open_row_index = None
initial_abs_term = None
open_threshold = CONFIG["disequilibrium_open_trshld"]
close_threshold = CONFIG["disequilibrium_close_trshld"]
open_threshold = CONFIG["dis-equilibrium_open_trshld"]
close_threshold = CONFIG["dis-equilibrium_close_trshld"]
for row_idx in range(len(pair_result_df)):
curr_disequilibrium = pair_result_df["scaled_disequilibrium"][row_idx]
@@ -299,7 +221,10 @@ def run_single_pair(
market_data=market_data, training_minutes=CONFIG["training_minutes"]
)
try:
pair.train_pair()
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
@@ -387,8 +312,6 @@ if __name__ == "__main__":
# BacktestResults.print_results_summary(all_results)
BacktestResults.calculate_returns(all_results)
# Print grand totals
BacktestResults.print_grand_totals()
BacktestResults.print_outstanding_positions()