Python量化入门:50行代码实现双均线策略回测
在金融投资领域,量化交易逐渐成为主流方式之一。通过编写程序来执行交易策略,可以有效避免人为情绪干扰,并实现自动化和高效化操作。本文将带大家使用 Python 实现一个经典的量化交易策略——双均线策略(Dual Moving Average Crossover Strategy) 的简单回测。
我们将使用 Python 中的 pandas 和 matplotlib 等库完成数据处理与可视化,并用不到 50 行代码实现整个回测流程,适合初学者快速上手量化交易的基础知识。
一、什么是双均线策略?
双均线策略是一种基于技术分析的趋势跟踪策略,其核心思想是利用两条不同周期的移动平均线(如短期均线和长期均线)进行信号判断:
当短期均线上穿长期均线时,产生买入信号; 当短期均线下穿长期均线时,产生卖出信号。这种策略适用于趋势明显的行情,在股票、期货、加密货币等市场中广泛应用。
二、准备工作
1. 安装依赖库
确保你已经安装了以下 Python 库:
pip install pandas matplotlib yfinance我们使用的库说明如下:
pandas:用于数据处理; matplotlib:用于绘图; yfinance:用于获取美股历史数据(可替换为本地 CSV 数据源);三、策略实现步骤
我们将按照以下步骤实现双均线策略:
获取历史数据; 计算短期和长期移动平均线; 生成买卖信号; 模拟持仓并计算收益; 绘制净值曲线。四、完整代码实现(50行以内)
下面是我们使用 Python 编写的双均线策略回测代码,仅需约 45 行即可完成基础功能。
import pandas as pd import matplotlib.pyplot as plt import yfinance as yf # 下载苹果公司历史数据 data = yf.download(‘AAPL’, start=’2020-01-01′, end=’2023-01-01′) # 设置短期和长期窗口 short_window = 40 long_window = 100 # 计算移动平均线 data[‘short_ma’] = data[‘Close’].rolling(window=short_window, min_periods=1).mean() data[‘long_ma’] = data[‘Close’].rolling(window=long_window, min_periods=1).mean() # 生成交易信号 data[‘signal’] = 0 data[‘signal’][short_window:] = \ (data[‘short_ma’][short_window:] > data[‘long_ma’][short_window:]) * 1 data[‘positions’] = data[‘signal’].diff() # 初始化账户信息 initial_capital = 100000.0 positions = pd.DataFrame(index=data.index).fillna(0.0) positions[‘AAPL’] = data[‘signal’] # 持仓状态:1为持有,0为空仓 # 计算持仓价值变化 portfolio = positions.multiply(data[‘Close’], axis=0) pos_diff = positions.diff() portfolio[‘holdings’] = portfolio[‘AAPL’] portfolio[‘cash’] = initial_capital – (pos_diff.multiply(data[‘Close’], axis=0)).cumsum()[‘AAPL’] portfolio[‘total’] = portfolio[‘cash’] + portfolio[‘holdings’] portfolio[‘returns’] = portfolio[‘total’].pct_change() # 打印最终总资产 print(f”初始资金: {initial_capital:.2f}”) print(f”最终总资产: {portfolio[‘total’][-1]:.2f}”) print(f”累计收益率: {(portfolio[‘total’][-1] / initial_capital – 1) * 100:.2f}%”) # 绘图展示 plt.figure(figsize=(14, 7)) plt.plot(data[‘Close’], label=’收盘价’) plt.plot(data[‘short_ma’], label=f'{short_window}日均线’) plt.plot(data[‘long_ma’], label=f'{long_window}日均线’) plt.plot(data.loc[data[‘positions’] == 1].index, data[‘short_ma’][data[‘positions’] == 1], ‘^’, markersize=10, color=’g’, lw=0, label=’买入信号’) plt.plot(data.loc[data[‘positions’] == -1].index, data[‘short_ma’][data[‘positions’] == -1], ‘v’, markersize=10, color=’r’, lw=0, label=’卖出信号’) plt.title(‘双均线策略信号图’) plt.legend() plt.show() # 净值曲线 plt.figure(figsize=(14, 7)) plt.plot(portfolio[‘total’], label=’策略净值’) plt.title(‘策略净值曲线’) plt.legend() plt.show()五、策略回测结果解读
运行上述代码后,你会看到两个图表:
双均线信号图:显示价格走势及买卖信号; 策略净值曲线图:展示从初始资金到最终资产的变化过程。同时,控制台会输出:
初始资金; 最终总资产; 累计收益率百分比。你可以根据这些指标评估策略的表现。
六、策略优化建议
虽然本策略非常简洁,但也可以进一步优化,例如:
引入手续费、滑点模拟; 使用复权价格数据; 尝试不同的均线组合(如EMA vs SMA); 增加止损止盈机制; 多品种多策略扩展。七、总结
本文通过不到 50 行 Python 代码,演示了如何实现一个完整的双均线策略回测系统。虽然该策略相对简单,但它涵盖了量化交易的核心流程:数据获取、信号生成、仓位管理、收益计算和可视化。
对于初学者来说,这是一个非常好的起点。随着对量化交易理解的加深,你可以逐步引入更多高级模块(如 backtrader、zipline 等),构建更复杂的交易系统。
附录:参考资料
yfinance 文档 Pandas 官方文档 Matplotlib 官方文档如果你喜欢这类内容,欢迎继续关注“Python量化交易”系列文章,我们将持续分享更多实战技巧和策略实现!
字数统计:约 1600 字