Skip to content

回测 - 策略详解

框架内置 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 StrategyBuyAndHold
strategy = 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 Strategy
import 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_signalsell_signal 必须是整数 0 或 1
  • 不要在 __init__ 中执行耗时操作,策略实例会被 pickle 序列化以支持并行