老帅李华杰
管理员
管理员
  • UID2
  • 粉丝35
  • 关注0
  • 发帖数464
  • 社区居民
  • 忠实会员
  • 喜欢达人
  • 原创写手
阅读:82回复:0

均值回归策略(震荡市)

楼主#
更多 发布于:2026-03-17 22:22
均值回归策略(震荡市)
核心逻辑:价格偏离均值后会回归,高胜率(60%-70%)但盈亏比低,适合震荡行情。

用布林带判断偏离程度
超买做空,超卖做多,固定止盈止损


import pandas as pd
import numpy as np
import talib

def mean_reversion_strategy(df, bb_period=20, bb_dev=2, sl_pct=0.01, tp_pct=0.005):
    # 计算布林带
    df['bb_mid'] = talib.MA(df['close'], timeperiod=bb_period)
    df['bb_upper'], df['bb_mid'], df['bb_lower'] = talib.BBANDS(
        df['close'], timeperiod=bb_period, nbdevup=bb_dev, nbdevdn=bb_dev
    )
    
    # 初始化信号和仓位
    df['signal'] = 0
    df['position'] = 0
    df['stop_loss'] = 0
    df['take_profit'] = 0
    df['pnl'] = 0
    
    # 遍历计算信号
    for i in range(bb_period, len(df)):
        current_close = df.iloc['close']
        prev_position = df.iloc[i-1]['position']
        
        # 超卖做多:价格低于下轨且无仓位
        if current_close < df.iloc['bb_lower'] and prev_position == 0:
            df.iloc[i, df.columns.get_loc('signal')] = 1
            df.iloc[i, df.columns.get_loc('position')] = 1
            df.iloc[i, df.columns.get_loc('stop_loss')] = current_close * (1 - sl_pct)
            df.iloc[i, df.columns.get_loc('take_profit')] = current_close * (1 + tp_pct)
        
        # 超买做空:价格高于上轨且无仓位
        elif current_close > df.iloc['bb_upper'] and prev_position == 0:
            df.iloc[i, df.columns.get_loc('signal')] = -1
            df.iloc[i, df.columns.get_loc('position')] = -1
            df.iloc[i, df.columns.get_loc('stop_loss')] = current_close * (1 + sl_pct)
            df.iloc[i, df.columns.get_loc('take_profit')] = current_close * (1 - tp_pct)
        
        # 止盈止损平仓
        elif prev_position == 1:
            if current_close <= df.iloc[i-1]['stop_loss'] or current_close >= df.iloc[i-1]['take_profit']:
                df.iloc[i, df.columns.get_loc('signal')] = -1
                df.iloc[i, df.columns.get_loc('position')] = 0
            else:
                df.iloc[i, df.columns.get_loc('position')] = 1
        elif prev_position == -1:
            if current_close >= df.iloc[i-1]['stop_loss'] or current_close <= df.iloc[i-1]['take_profit']:
                df.iloc[i, df.columns.get_loc('signal')] = 1
                df.iloc[i, df.columns.get_loc('position')] = 0
            else:
                df.iloc[i, df.columns.get_loc('position')] = -1
        
        # 计算盈亏
        if prev_position != 0:
            price_change = df.iloc['close'] - df.iloc[i-1]['close']
            df.iloc[i, df.columns.get_loc('pnl')] = prev_position * price_change * 10
    
    df['cum_pnl'] = df['pnl'].cumsum()
    return df

# 回测示例
if __name__ == "__main__":
    df = load_futures_data('futures_data.csv')  # 复用之前的加载函数
    result = mean_reversion_strategy(df)
    
    total_trades = len(result[result['signal'] != 0]) // 2
    win_trades = len(result[result['pnl'] > 0])
    win_rate = win_trades / total_trades if total_trades > 0 else 0
    total_pnl = result['cum_pnl'].iloc[-1]
    
    print(f"均值回归策略 - 总交易次数:{total_trades}")
    print(f"均值回归策略 - 胜率:{win_rate:.2%}")
    print(f"均值回归策略 - 累计盈亏:{total_pnl:.2f}元")
好的指标等于至高的阵地,明察秋毫自然马到成功; 微信手机同号:15907742318 老帅李华杰
游客

返回顶部