|
阅读:67回复:0
均值回归策略(震荡市)
均值回归策略(震荡市)
核心逻辑:价格偏离均值后会回归,高胜率(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}元") |
|
|