双均线策略

双均线策略是最经典的趋势跟踪策略之一

策略原理

双均线策略通过计算两条不同周期的移动平均线,利用它们的金叉和死叉信号来判断买卖时机:

  • 短期均线:反映近期价格趋势(如 MA5、MA10)

  • 长期均线:反映中长期价格趋势(如 MA20、MA50、MA200)

核心逻辑

  • 短期均线上穿长期均线 → 金叉 → 买入信号(趋势转多)

  • 短期均线下穿长期均线 → 死叉 → 卖出信号(趋势转空)

策略实现

# 快线
FAST_PERIODS = [5, 10, 20, 30]
# 慢线
SLOW_PERIODS = [20, 30, 60, 120, 250]

def _ma_cross(ta_func: Callable, close: pd.DataFrame, fast: int=20, slow: int=50):
    """均线交叉策略"""
    fast_ma: pd.DataFrame = ta_func(close=close, length=fast)
    slow_ma: pd.DataFrame = ta_func(close=close, length=slow)
    entries = (fast_ma > slow_ma) & (fast_ma.shift(1) <= slow_ma.shift(1))
    exits = (fast_ma < slow_ma) & (fast_ma.shift(1) >= slow_ma.shift(1))
    return entries, exits

def ma_cross_grids_strategy(ta_func: Callable, df: pd.DataFrame):

    valid_funcs = [ta.sma, ta.ema, ta.wma]
    if ta_func not in valid_funcs:
        raise ValueError(f"不支持该函数: {ta_func}")

    results = {}
    for fast in FAST_PERIODS:
        for slow in SLOW_PERIODS:
            if fast >= slow:
                continue
            
            name = f'{ta_func.__name__}({fast}/{slow})'
            entries, exits = _ma_cross(ta_func, close=df['close'], fast=fast, slow=slow)
            results[name] = vbt.Portfolio.from_signals(close=df['close'], entries=entries, exits=exits, init_cash=100000, fees=0.001, freq='D')

    return results