一、这篇解决什么问题
做量化研究时,很多人卡在第一步:知道策略逻辑,但不知道怎么把它变成可运行、可验证的代码。
双均线是量化里最经典的入门策略,逻辑只有一句话:短期均线上穿长期均线时买入,下穿时卖出。它足够简单,能把“数据获取 → 信号生成 → 回测 → 评估”整条链路跑通,而且每个环节都看得见、改得动。
本文用一只 ETF 的日频数据,完整实现这个流程。读完你可以得到:
- 一份可运行的双均线回测代码
- 一张带买卖点标记的价格图
- 一份绩效指标对比(策略 vs 基准)
- 一张参数敏感性表格
二、环境与数据准备
2.1 依赖库
pipinstallpandas numpy matplotlib aksharepandas:数据处理numpy:数值计算matplotlib:绘图akshare:免费数据源,获取 ETF 日频行情
2.2 获取数据
importpandasaspdimportnumpyasnpimportakshareasak# 获取沪深300ETF日频数据(前复权)df=ak.fund_etf_hist_em(symbol="510300",period="daily",start_date="20200101",end_date="20241231",adjust="qfq"# 前复权,避免除权跳空造成假信号)df=df.rename(columns={'日期':'date','开盘':'open','最高':'high','最低':'low','收盘':'close','成交量':'volume'})df['date']=pd.to_datetime(df['date'])df=df.sort_values('date').reset_index(drop=True)print(df.head())print(df.shape)检查点:
- 数据是否按日期升序
- 是否有缺失值
- 复权方式是否为前复权
- 时间范围是否覆盖至少一轮牛熊
关于复权处理的详细说明,见本系列第1期《Python量化交易入门:用Pandas做数据清洗与复权处理》。
三、核心实现
3.1 策略规则先写清楚
写代码之前,先把规则用文字定义好。这一步不能跳。
| 项目 | 设定 |
|---|---|
| 标的 | 沪深300ETF(510300) |
| 短期均线 | 5日 |
| 长期均线 | 20日 |
| 买入条件 | 短期均线上穿长期均线(金叉),次日开盘买入 |
| 卖出条件 | 短期均线下穿长期均线(死叉),次日开盘卖出 |
| 仓位 | 满仓买入,空仓卖出,不加杠杆 |
| 成本 | 佣金万分之三 + 滑点千分之一 |
为什么用次日开盘:均线是用当日收盘价算的,收盘后才知道信号,最早只能次日开盘执行。这是避免未来函数的基本要求。
3.2 计算均线与信号
# 计算均线df['ma5']=df['close'].rolling(5).mean()df['ma20']=df['close'].rolling(20).mean()# 金叉:当日 ma5 > ma20 且前一日 ma5 <= ma20df['golden_cross']=((df['ma5']>df['ma20'])&(df['ma5'].shift(1)<=df['ma20'].shift(1)))# 死叉:当日 ma5 < ma20 且前一日 ma5 >= ma20df['death_cross']=((df['ma5']<df['ma20'])&(df['ma5'].shift(1)>=df['ma20'].shift(1)))# 持仓信号:金叉后为1,死叉后为0df['signal']=np.nan df.lo