回测 - 策略详解
框架内置 11 种经典策略,所有策略继承自 Strategy 基类。
策略总览
| 策略 | 核心逻辑 | 关键参数 | 适用场景 |
|---|---|---|---|
| 买入持有 | 全程持仓 | 无 | 基准对比 |
| 均线交叉 | 短期均线上穿/下穿长期均线 | short_window, long_window | 趋势跟踪 |
| 海龟交易 | Donchian 通道突破 | entry_window, exit_window | 趋势跟踪 |
| RSI | 超买超卖反转 | rsi_window, oversold_threshold, overbought_threshold | 均值回归 |
| 布林带 | 价格触及上下轨反转 | window, num_std | 均值回归/突破 |
| 动量 | 价格动量突破阈值 | momentum_window, momentum_threshold | 趋势跟踪 |
| 均值回归 | 价格偏离均线回归 | ma_window, deviation_threshold | 均值回归 |
| 突破 | 价格突破 N 日最高价 | lookback_period, atr_multiplier | 趋势跟踪 |
| Dual Thrust | 前 N 日价格区间上下轨突破 | k1, k2, lookback_period | 日内/短线 |
| 成交量趋势 | 量价配合趋势确认 | ma_window, volume_window | 量价分析 |
| 成交量背离 | 价格与成交量背离 | rsi_window, volume_window | 反转信号 |
买入持有
最简单的基准策略。
from jh_quant.backtest import StrategyBuyAndHoldstrategy = StrategyBuyAndHold()均线交叉
from jh_quant.backtest import StrategyMovingAverageCrossover
strategy = StrategyMovingAverageCrossover( short_window=12, # 短期均线窗口 long_window=24, # 长期均线窗口)经典参数组合:5/20(短线)、12/24(中短线)、20/60(中长线)。
海龟交易
基于 Donchian 通道突破的经典趋势跟踪策略。
from jh_quant.backtest import StrategyTurtle
strategy = StrategyTurtle( entry_window=20, # 入场通道窗口 exit_window=10, # 离场通道窗口)RSI
from jh_quant.backtest import StrategyRSI
strategy = StrategyRSI( rsi_window=14, # RSI 计算窗口 oversold_threshold=30, # 超卖阈值(买入) overbought_threshold=70, # 超买阈值(卖出))常见组合:30/70(标准)、20/80(极端)。
布林带
from jh_quant.backtest import StrategyBollingerBands
strategy = StrategyBollingerBands( window=20, # 均线和标准差窗口 num_std=2.0, # 标准差倍数 use_mean_reversion=True, # True=均值回归, False=突破)动量
from jh_quant.backtest import StrategyMomentum
strategy = StrategyMomentum( momentum_window=20, # 动量计算窗口 momentum_threshold=0.05, # 动量阈值 ma_window=60, # 趋势过滤均线窗口)均值回归
from jh_quant.backtest import StrategyMeanReversion
strategy = StrategyMeanReversion( ma_window=20, # 均线窗口 deviation_threshold=0.02, # 偏离阈值 rsi_window=14, # RSI 辅助过滤窗口 rsi_oversold=30, # RSI 超卖辅助确认 rsi_overbought=70, # RSI 超买辅助确认)突破
from jh_quant.backtest import StrategyBreakout
strategy = StrategyBreakout( lookback_period=20, # 回顾窗口 atr_multiplier=2.0, # ATR 止损倍数 use_atr_stop=True, # 是否使用 ATR 跟踪止损)Dual Thrust
from jh_quant.backtest import StrategyDualThrust
strategy = StrategyDualThrust( k1=0.7, # 上轨系数 k2=0.7, # 下轨系数 lookback_period=20, # 回顾窗口)成交量趋势
from jh_quant.backtest import StrategyVolumeTrend
strategy = StrategyVolumeTrend( ma_window=20, # 价格均线窗口 volume_window=20, # 成交量均线窗口 buy_threshold=0.02, # 买入信号强度阈值 sell_threshold=-0.02, # 卖出信号强度阈值)成交量背离
from jh_quant.backtest import StrategyVolumeDivergence
strategy = StrategyVolumeDivergence( rsi_window=14, # RSI 窗口 volume_window=20, # 成交量均线窗口 buy_threshold=0.02, # 买入信号强度阈值 sell_threshold=-0.02, # 卖出信号强度阈值)自定义策略
继承 Strategy 基类,实现 _execute_one 方法:
from jh_quant.backtest import Strategyimport pandas as pd
class MyStrategy(Strategy): def __init__(self, ma_window=20): super().__init__() self.ma_window = ma_window
def _execute_one(self, symbol: str, df: pd.DataFrame) -> pd.DataFrame: """ 参数: symbol: 股票代码 df: 单只股票的价格数据,包含 open/high/low/close/volume 返回: 原 df 增加 buy_signal 和 sell_signal 列(0/1 整数) """ df = df.copy() df['ma'] = df['close'].rolling(self.ma_window).mean()
df['buy_signal'] = ( (df['close'] > df['ma']) & (df['close'].shift(1) <= df['ma'].shift(1)) ).astype(int)
df['sell_signal'] = ( (df['close'] < df['ma']) & (df['close'].shift(1) >= df['ma'].shift(1)) ).astype(int)
return df注意事项:
_execute_one接收的df已按日期排序,只包含单只股票的数据buy_signal和sell_signal必须是整数 0 或 1- 不要在
__init__中执行耗时操作,策略实例会被 pickle 序列化以支持并行