一、这篇解决什么问题做量化研究时,很多人卡在第一步:知道策略逻辑,但不知道怎么把它变成可运行、可验证的代码。双均线是量化里最经典的入门策略,逻辑只有一句话:短期均线上穿长期均线时买入,下穿时卖出。它足够简单,能把“数据获取 → 信号生成 → 回测 → 评估”整条链路跑通,而且每个环节都看得见、改得动。本文用一只 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