Files
stock/scripts/backtest_engine.py

90 lines
2.8 KiB
Python

"""
Strategy backtesting engine for A-share stocks.
Supports:
- Predefined strategies (MA crossover, momentum, mean reversion, etc.)
- Custom entry/exit rules
- Multi-strategy comparison
- Performance metrics (returns, drawdown, Sharpe, win rate)
Usage: python3 backtest_engine.py <function> <json_args>
"""
import sys
import json
def run(strategy_name=None, entry_rule=None, exit_rule=None,
universe="hs300", symbols=None, start_date="20210101", end_date="20251231"):
"""Run a single backtest. Stub - to be implemented."""
return json.dumps({
"status": "stub",
"message": f"Backtest (strategy={strategy_name or 'custom'}, universe={universe}) — not yet implemented",
"metrics": {
"cumulative_return": None,
"annualized_return": None,
"win_rate": None,
"max_drawdown": None,
"sharpe_ratio": None,
"benchmark_return": None,
},
}, ensure_ascii=False)
def predefined():
"""List available predefined strategies."""
strategies = [
{
"name": "ma_cross",
"description": "MA Golden Cross: buy when 20-day MA crosses above 60-day MA",
"params": {"fast": 20, "slow": 60},
},
{
"name": "momentum_breakout",
"description": "Momentum Breakout: buy when price breaks 20-day high with volume > 1.5x avg",
"params": {"lookback": 20, "volume_multiplier": 1.5},
},
{
"name": "mean_reversion",
"description": "Mean Reversion: buy when price deviates >2 std below 20-day MA, sell at MA",
"params": {"ma_period": 20, "std_dev": 2},
},
{
"name": "turtle",
"description": "Turtle Trading: breakout of 20-day high, exit at 10-day low",
"params": {"entry_period": 20, "exit_period": 10},
},
]
return json.dumps({"strategies": strategies}, ensure_ascii=False)
def compare(strategies, universe="hs300", start_date="20210101", end_date="20251231"):
"""Compare multiple strategies. Stub - to be implemented."""
return json.dumps({
"status": "stub",
"message": f"Strategy comparison ({strategies}) — not yet implemented",
"comparison": [],
}, ensure_ascii=False)
FUNCTIONS = {
"run": run,
"predefined": predefined,
"compare": compare,
}
if __name__ == "__main__":
if len(sys.argv) < 2:
print("Usage: backtest_engine.py <function> [json_args]")
sys.exit(1)
func_name = sys.argv[1]
args = json.loads(sys.argv[2]) if len(sys.argv) > 2 else {}
if func_name not in FUNCTIONS:
print(f"Unknown function: {func_name}")
sys.exit(1)
result = FUNCTIONS[func_name](**args)
print(result)