progress
This commit is contained in:
+102
-18
@@ -1,28 +1,112 @@
|
||||
from abc import ABC, abstractmethod
|
||||
import sys
|
||||
|
||||
from typing import Any, Dict, List, Optional
|
||||
from typing import Any, Dict, List
|
||||
|
||||
import pandas as pd
|
||||
import numpy as np
|
||||
|
||||
# ============= statsmodels ===================
|
||||
from statsmodels.tsa.vector_ar.vecm import VECM
|
||||
|
||||
from backtest_configs import CRYPTO_CONFIG
|
||||
from strategies import StaticFitStrategy
|
||||
from strategies import SlidingFitStrategy, StaticFitStrategy
|
||||
from tools.data_loader import load_market_data
|
||||
from tools.trading_pair import TradingPair
|
||||
from results import BacktestResult
|
||||
|
||||
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",
|
||||
# "20250520.mktdata.ohlcv.db",
|
||||
# "20250521.mktdata.ohlcv.db",
|
||||
# "20250522.mktdata.ohlcv.db",
|
||||
# "20250523.mktdata.ohlcv.db",
|
||||
# "20250524.mktdata.ohlcv.db",
|
||||
# "20250525.mktdata.ohlcv.db",
|
||||
],
|
||||
"db_table_name": "bnbspot_ohlcv_1min",
|
||||
# ----- Instruments
|
||||
"exchange_id": "BNBSPOT",
|
||||
"instrument_id_pfx": "PAIR-",
|
||||
"instruments": [
|
||||
"BTC-USDT",
|
||||
"BCH-USDT",
|
||||
"ETH-USDT",
|
||||
"LTC-USDT",
|
||||
"XRP-USDT",
|
||||
"ADA-USDT",
|
||||
"SOL-USDT",
|
||||
"DOT-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,
|
||||
|
||||
"dis-equilibrium_open_trshld": 2.0,
|
||||
"dis-equilibrium_close_trshld": 0.5,
|
||||
|
||||
# "training_minutes": 120,
|
||||
"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,
|
||||
"dis-equilibrium_open_trshld": 2.0,
|
||||
"dis-equilibrium_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
|
||||
STRATEGY = StaticFitStrategy()
|
||||
|
||||
# CONFIG = CRYPTO_CONFIG
|
||||
# STRATEGY = SlidingFitStrategy()
|
||||
|
||||
def run_all_pairs(config: Dict, datafile: str, price_column: str, bt_result: BacktestResult) -> None:
|
||||
|
||||
@@ -44,12 +128,11 @@ def run_all_pairs(config: Dict, datafile: str, price_column: str, bt_result: Bac
|
||||
)
|
||||
pairs.append(pair)
|
||||
return pairs
|
||||
|
||||
|
||||
|
||||
pairs_trades = []
|
||||
strategy = StaticFitStrategy()
|
||||
for pair in _create_pairs(config):
|
||||
single_pair_trades = strategy.run_pair(pair=pair, config=CONFIG, 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
|
||||
@@ -99,9 +182,10 @@ def main() -> None:
|
||||
|
||||
# BacktestResults.print_results_summary(all_results)
|
||||
bt_results.calculate_returns(all_results)
|
||||
|
||||
# Print grand totals
|
||||
bt_results.print_grand_totals()
|
||||
bt_results.print_outstanding_positions()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user