策略原理
采用两条不同周期的简单移动平均线(SMA):
- 短期均线:5日线(快速反应价格变化)
- 长期均线:20日线(反映长期趋势)
交易信号生成规则:
当 5日线 > 20日线 → 买入信号
当 5日线 < 20日线 → 卖出信号
Python实现模块
1. 数据获取模块
import yfinance as yf
def 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 = 0
capital_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 = 0
else:
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 plt
plt.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}%")
注意事项
❗ 实际交易需考虑以下因素:
- 避免在开盘价跳空时执行信号
- 不同品种参数需重新优化
- 回测存在过拟合风险
- 需定期进行策略再平衡