90 lines
2.8 KiB
Python
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)
|