fix: Handle indicator parameter conversion in multi-ticker backtest

This commit is contained in:
Bobby (aider) 2025-02-14 00:06:45 -08:00
parent 8c2b8233cf
commit 840c96ede3

View File

@ -461,6 +461,20 @@ def run_multi_ticker_backtest(tickers: list, start_date: datetime, end_date: dat
"""Run backtest across multiple tickers and aggregate results""" """Run backtest across multiple tickers and aggregate results"""
all_results = [] all_results = []
# Convert indicator settings to the correct format
processed_settings = {}
for ind_name, ind_config in indicator_settings.items():
if isinstance(ind_config['params'], dict):
# If params is a dictionary of parameter values (non-optimization mode)
processed_settings[ind_name] = {
'type': ind_config['type'],
'params': {k: float(v) if isinstance(v, (int, float)) else v
for k, v in ind_config['params'].items()}
}
else:
# If params is a dictionary of parameter ranges (optimization mode)
processed_settings[ind_name] = ind_config
for ticker in tickers: for ticker in tickers:
try: try:
print(f"\nTesting strategy on {ticker}") print(f"\nTesting strategy on {ticker}")
@ -485,7 +499,7 @@ def run_multi_ticker_backtest(tickers: list, start_date: datetime, end_date: dat
# Run backtest # Run backtest
try: try:
DynamicStrategy.indicator_configs = indicator_settings DynamicStrategy.indicator_configs = processed_settings
bt = Backtest(df, DynamicStrategy, cash=100000, commission=.002) bt = Backtest(df, DynamicStrategy, cash=100000, commission=.002)
stats = bt.run() stats = bt.run()
@ -515,6 +529,7 @@ def run_multi_ticker_backtest(tickers: list, start_date: datetime, end_date: dat
except Exception as e: except Exception as e:
print(f"Error during backtest for {ticker}: {str(e)}") print(f"Error during backtest for {ticker}: {str(e)}")
print(f"Current indicator settings: {processed_settings}")
continue continue
except Exception as e: except Exception as e:
@ -527,6 +542,7 @@ def run_multi_ticker_backtest(tickers: list, start_date: datetime, end_date: dat
print("2. Is there data available for the selected date range?") print("2. Is there data available for the selected date range?")
print("3. Are the indicator settings valid?") print("3. Are the indicator settings valid?")
print("4. Are there any errors in the strategy logic?") print("4. Are there any errors in the strategy logic?")
print(f"Last used indicator settings: {processed_settings}")
raise ValueError("No valid results were generated from any ticker") raise ValueError("No valid results were generated from any ticker")
return pd.DataFrame(all_results) return pd.DataFrame(all_results)