bug fixes

This commit is contained in:
Oleg Sheynin 2025-07-25 06:39:17 +00:00
parent 1af35000ab
commit bcf4447cb6
6 changed files with 601 additions and 820 deletions

View File

@ -16,6 +16,10 @@
"funding_per_pair": 2000.0, "funding_per_pair": 2000.0,
# ====== Trading Parameters ====== # ====== Trading Parameters ======
"price_column": "close", "price_column": "close",
"execution_price": {
"column": "vwap",
"shift": 1,
},
"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, "training_minutes": 120,

View File

@ -16,6 +16,10 @@
"funding_per_pair": 2000.0, "funding_per_pair": 2000.0,
# ====== Trading Parameters ====== # ====== Trading Parameters ======
"price_column": "close", "price_column": "close",
"execution_price": {
"column": "vwap",
"shift": 1,
},
"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_minutes": 120, "training_minutes": 120,

View File

@ -417,7 +417,7 @@ class BacktestResult:
# Print pair returns with disequilibrium information # Print pair returns with disequilibrium information
day_return = 0.0 day_return = 0.0
if self.pairs_trades_[pair]: if pair in self.pairs_trades_:
print(f"{pair}:") print(f"{pair}:")
pair_return = 0.0 pair_return = 0.0

View File

@ -6,6 +6,12 @@ import pandas as pd
def load_sqlite_to_dataframe(db_path:str, query:str) -> pd.DataFrame: def load_sqlite_to_dataframe(db_path:str, query:str) -> pd.DataFrame:
df: pd.DataFrame = pd.DataFrame()
import os
if not os.path.exists(db_path):
print(f"WARNING: database file {db_path} does not exist")
return df
try: try:
conn = sqlite3.connect(db_path) conn = sqlite3.connect(db_path)

File diff suppressed because one or more lines are too long

View File

@ -81,6 +81,10 @@ def run_backtest(
print(f"WARNING: insufficient data files: {datafiles}") print(f"WARNING: insufficient data files: {datafiles}")
return bt_result return bt_result
if not all([os.path.exists(datafile) for datafile in datafiles]):
print(f"WARNING: data file {datafiles} does not exist")
return bt_result
pairs_trades = [] pairs_trades = []
pairs = create_pairs( pairs = create_pairs(
@ -138,10 +142,6 @@ def main() -> None:
instruments = get_instruments(args, config) instruments = get_instruments(args, config)
datafiles = resolve_datafiles(config, args.date_pattern, instruments) datafiles = resolve_datafiles(config, args.date_pattern, instruments)
if not datafiles:
print("No data files found to process.")
return
days = list(set([day for day, _ in datafiles])) days = list(set([day for day, _ in datafiles]))
print(f"Found {len(datafiles)} data files to process:") print(f"Found {len(datafiles)} data files to process:")
for df in datafiles: for df in datafiles:
@ -154,13 +154,18 @@ def main() -> None:
# Initialize a dictionary to store all trade results # Initialize a dictionary to store all trade results
all_results: Dict[str, Dict[str, Any]] = {} all_results: Dict[str, Dict[str, Any]] = {}
is_config_stored = False
# Process each data file
price_column = config["price_column"]
# Store configuration in database for reference for day in sorted(days):
if args.result_db.upper() != "NONE": md_datafiles = [datafile for md_day, datafile in datafiles if md_day == day]
# Get list of all instruments for storage if not all([os.path.exists(datafile) for datafile in md_datafiles]):
print(f"WARNING: insufficient data files: {md_datafiles}")
# Remove duplicates while preserving order continue
print(f"\n====== Processing {day} ======")
if not is_config_stored:
store_config_in_database( store_config_in_database(
db_path=args.result_db, db_path=args.result_db,
config_file_path=args.config, config_file_path=args.config,
@ -169,13 +174,7 @@ def main() -> None:
datafiles=datafiles, datafiles=datafiles,
instruments=instruments, instruments=instruments,
) )
is_config_stored = True
# Process each data file
price_column = config["price_column"]
for day in sorted(days):
md_datafiles = [datafile for md_day, datafile in datafiles if md_day == day]
print(f"\n====== Processing {day} ======")
# Process data for this file # Process data for this file
try: try:
@ -189,6 +188,10 @@ def main() -> None:
instruments=instruments, instruments=instruments,
) )
if bt_results.trades is None or len(bt_results.trades) == 0:
print(f"No trades found for {day}")
continue
# Store results with day name as key # Store results with day name as key
filename = os.path.basename(day) filename = os.path.basename(day)
all_results[filename] = { all_results[filename] = {