双均线量化交易策略指南
策略原理
采用两条不同周期的简单移动平均线(SMA):
- 短期均线:5日线(快速反应价格变化)
- 长期均线:20日线(反映长期趋势)
交易信号生成规则:
当 5日线 > 20日线 → 买入信号
当 5日线 < 20日线 → 卖出信号
Python实现模块
1. 数据获取模块
import yfinance as yfdef fetch_stock_data(ticker, start_date, end_date):"""获取股票历史数据参数:ticker -- 股票代码 (例:'AAPL')start_date -- 开始日期 (格式:'YYYY-MM-DD')end_date -- 结束日期"""return yf.download(ticker, start=start_date, end=end_date)
2. 策略计算模块
def calculate_signals(data, short_window=5, long_window=20):"""计算双均线和交易信号参数说明:short_window -- 短期均线周期(默认5日)long_window -- 长期均线周期(默认20日)"""data['SMA5'] = data['Close'].rolling(short_window).mean()data['SMA20'] = data['Close'].rolling(long_window).mean()data['Signal'] = np.where(data['SMA5'] > data['SMA20'], 1, -1)return data
3. 回测引擎
def backtest_strategy(data, initial_capital=1000000):"""策略回测模块参数:initial_capital -- 初始资金(默认100万)"""position = 0capital_curve = [initial_capital]for i in range(1, len(data)):if data['Signal'][i-1] == 1 and position == 0:position = capital_curve[-1] / data['Close'][i]capital_curve.append(position * data['Close'][i])elif data['Signal'][i-1] == -1 and position != 0:capital_curve.append(capital_curve[-1])position = 0else:capital_curve.append(position * data['Close'][i] if position else capital_curve[-1])return pd.Series(capital_curve, index=data.index)
可视化分析
import matplotlib.pyplot as pltplt.figure(figsize=(12,6))
plt.plot(data['Close'], label='收盘价', alpha=0.5)
plt.plot(data['SMA5'], label='5日均线', linestyle='--')
plt.plot(data['SMA20'], label='20日均线', linestyle='-.')
plt.scatter(data[data['Signal'].diff() != 0].index, data['Close'][data['Signal'].diff() != 0], c=data['Signal'][data['Signal'].diff() != 0].map({1:'g', -1:'r'}),marker='^', s=100)
plt.title('双均线策略交易信号可视化')
plt.legend()
plt.savefig('strategy_visualization.png', dpi=300, bbox_inches='tight')
策略优化建议
参数调优组合
组合名称 | 短期均线 | 长期均线 | 适用场景 |
---|---|---|---|
激进型 | 3日 | 10日 | 高波动市场 |
平衡型 | 5日 | 20日 | 趋势行情 |
保守型 | 10日 | 50日 | 长线投资 |
改进方向
- 增加交易成本计算(佣金、滑点)
- 结合波动率过滤避免震荡行情
- 添加止损止盈机制
- 多品种回测验证策略普适性
使用示例
if __name__ == "__main__":# 获取数据data = fetch_stock_data('AAPL', '2020-01-01', '2023-12-31')# 计算策略strategy_data = calculate_signals(data)# 执行回测results = backtest_strategy(strategy_data)# 展示结果print(f"累计收益率:{(results[-1]/1000000-1)*100:.2f}%")
注意事项
❗ 实际交易需考虑以下因素:
- 避免在开盘价跳空时执行信号
- 不同品种参数需重新优化
- 回测存在过拟合风险
- 需定期进行策略再平衡