双均线量化交易策略指南

策略原理

采用两条不同周期的简单移动平均线(SMA):

  • 短期均线:5日线(快速反应价格变化)
  • 长期均线:20日线(反映长期趋势)

交易信号生成规则

复制代码
当 5日线 > 20日线 → 买入信号
当 5日线 < 20日线 → 卖出信号

Python实现模块

1. 数据获取模块

python 复制代码
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. 策略计算模块

python 复制代码
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. 回测引擎

python 复制代码
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)

可视化分析

python 复制代码
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日 长线投资

改进方向

  1. 增加交易成本计算(佣金、滑点)
  2. 结合波动率过滤避免震荡行情
  3. 添加止损止盈机制
  4. 多品种回测验证策略普适性

使用示例

python 复制代码
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}%")

注意事项

❗ 实际交易需考虑以下因素:

  • 避免在开盘价跳空时执行信号
  • 不同品种参数需重新优化
  • 回测存在过拟合风险
  • 需定期进行策略再平衡
相关推荐
DeepModel5 小时前
【概率分布】指数分布(Exponential Distribution)原理、推导与实战
python·算法·概率论
波特率1152005 小时前
miniconda入门使用
python·conda·miniconda·python环境
二闹5 小时前
别再死记硬背了!带你扒开*args和**kwargs的底裤
后端·python
m0_743297426 小时前
Python在金融科技(FinTech)中的应用
jvm·数据库·python
老师好,我是刘同学6 小时前
列表推导式详解与实战应用
python
与虾牵手6 小时前
Rust 入门:一个写了 6 年 Python 的人,被编译器骂了三天
python
2401_857865236 小时前
Python日志记录(Logging)最佳实践
jvm·数据库·python
AsDuang6 小时前
Python 3.12 MagicMethods - 54 - __rrshift__
开发语言·python
Bert.Cai6 小时前
Python字符串详解
开发语言·python
宸翰6 小时前
在VS code中如何舒适的开发Python
前端·python