策略原理
采用兩條不同周期的簡單移動平均線(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}%")
注意事項
? 實際交易需考慮以下因素:
- 避免在開盤價跳空時執行信號
- 不同品種參數需重新優化
- 回測存在過擬合風險
- 需定期進行策略再平衡