资讯动态

Python量化交易入门:从双均线策略到回测闭环

发布时间:2026/10/14 12:01:46 来源:尧图企业网站定制
量化交易这个说法被聊得很多但大多数人真正动手时卡住的位置其实高度一致不知道怎么把“一个想法”变成“一段能跑的代码”更不知道怎么验证这段代码到底行不行。我最早接触Python量化也是从手动盯盘太痛苦开始的后来才慢慢搞清楚所谓量化核心不过是把交易逻辑变成明确规则再用程序去执行和验证规则。这篇文章就是基于我自己的踩坑过程整理出来的入门路径适合完全没写过策略的小白也适合懂一点Python但不知道怎么切入金融场景的开发者。你会得到一个能直接运行的最小闭环数据获取、策略信号、回测评估以及一套避开常见坑的检查清单。1. 量化交易到底在做什么先想清楚再动手很多人把量化想得很玄张口就是机器学习、高频交易、多因子模型实际上一开始就搞这些东西大概率被劝退。量化交易的本质是把交易决策从人的直觉和情绪里剥离出来变成一套可重复、可检验的规则系统。比如你手动交易时看到均线金叉就买入这叫一个想法把“短期均线上穿长期均线时买入下穿时卖出”写成代码再用历史数据验证这个规则能不能赚钱这就是量化交易的雏形。1.1 量化的核心规则化而非自动化我见过不少新手混淆“自动化”和“量化”。你写一个脚本每天自动下单那只是自动化执行如果下单逻辑还是凭感觉定的本质上跟手动交易没区别。量化的关键是规则本身是那个“凭什么买、凭什么卖、买多少、错了怎么办”的决策逻辑。这个逻辑必须清晰到能写进代码里否则程序不知道该怎么执行。所以入门第一件事不是装环境、不是写代码而是先把自己的策略想法写成人话。举个例子你想做趋势跟踪那就要定义什么叫趋势是均线多头排列还是价格突破N日高点突破多少算数止损设在哪里每一个“模糊的感觉”都要变成“具体的数字和条件”。这一步想不清楚后面代码写得再漂亮也是白搭。1.2 为什么是Python而不是其他选择做量化可选的工具不少传统上有人用Matlab有人用R也有人用C做高频但对入门来说Python几乎是唯一解。原因很实际语法简单接近自然语言新手写起来不容易被语言细节劝返数据分析和科学计算生态太成熟了pandas处理表格数据、numpy算矩阵、matplotlib画图全是量化日常要用到的东西社区资料极其丰富你踩过的坑基本都有人踩过搜一下就有答案回测迭代快写一个策略原型可能只需要几十行代码日级别回测几分钟就能出结果对比一下C性能强但开发效率低写个双均线可能半天起步Matlab贵且生态封闭R在统计上有优势但做金融数据处理反而不如pandas顺手。对绝大多数人来说Python是“效率”和“能力”平衡得最好的那个选择。1.3 入门完整的路径一步也不要跳如果把量化入门画成一张地图我认为应该走这样的路线先花一周巩固Python基础重点不是语法大全而是列表、字典、循环、函数、面向对象这几个概念能写简单脚本就行。然后花一到两周吃透pandas这是量化里最核心的库你得会读取数据、筛选数据、按日期分组、缺失值处理、滚动计算——这些都是策略开发的基本动作。接着找一个免费数据源把A股日线数据从获取到清洗跑通存成本地文件。再写一个最简单的策略——比如双均线——并亲手实现回测逻辑计算收益曲线、最大回撤、胜率这些指标。最后用历史数据反复验证、调整参数搞清楚“策略有效”到底是怎么一回事。整个路线走完快的话一个月慢的话两个月取决于每天投入多少时间。我强烈建议不要跳步尤其是数据清洗和回测逻辑这两块很多人就是在这里偷了懒后面用错误数据回测出惊艳结果实盘却被锤得很惨。2. 环境准备与数据获取整个系统的地基有了整体概念接下来就要动手了。这个阶段的目标很简单把你的电脑变成一台能处理行情数据的机器并拿到干净整齐的历史数据。数据显示不对、不干净后面所有分析和回测全是空中楼阁。2.1 开发环境的搭建与依赖库环境搭建这件事我建议直接用Anaconda它不是必须的但对新手最省心。Anaconda自带Python解释器和一大堆常用库能避免很多在Windows上装库时遇到的编译问题。Python版本选3.10或者3.11都行太老的版本可能有些新库不支持太新的版本偶尔会有兼容性波动稳定优先。装好之后在终端里确认一下基础依赖。量化学常用的核心组件就这么几个pandas处理表格数据是量化里用量最大的库选股、计算指标、处理持仓全是靠它numpy数值计算底层库pandas的很多操作是基于它的一般不直接调用但必须装matplotlib画K线图、净值曲线的工具回测结果可视化全靠它这几样Anaconda里通常已经带好了如果用的是纯Python环境没有装的话跑一下pip install pandas numpy matplotlib就行。我个人的建议是先别急着装一堆高级库什么机器学习、深度学习、因子库统统往后放先把最小闭环跑起来才是真的。2.2 行情数据从哪里来免费与付费的选择数据是量化的粮食没有数据什么都干不了。目前国内常用的数据获取方式我体验下来主要两类一类是开源社区维护的数据接口库比如tushare、akshare这类它们的好处是免费、上手快、覆盖面广几行代码就能拿到A股的历史日线数据。tushare的老版接口是免费的但额度有限制新版pro版需要积分积分靠注册、完善资料、捐助等方式获取akshare则大多直接抓公开网页数据不需要注册token用起来更干脆。另一类是商业数据源比如某某量化平台、某某金融终端提供的API质量和稳定性更好数据字段更丰富但价格不菲入门阶段完全没必要破费。我入门时用的是免费接口铺了大概十年的日线数据跑策略完全够用。这里提醒一句免费接口的数据偶尔会有缺失值和异常值拿到数据后一定要自己校验一遍别拿到手就直接喂给策略。2.3 数据预处理90%的人输在这第一步数据拿到手之后不能直接用。A股的数据有几个特有的坑处理不好会让回测结果完全失真。第一个坑是复权。股票的股价受分红、送股、拆股影响比如一只股票10块钱每10股送10股后价格会变成5块左右但你的真实资产并没有变少。如果直接用不复权的价格做回测会发现股价莫名其妙跳空下跌均线、突破位这些指标全被干扰信号全是错的。所以做历史回测一定要用前复权或后复权数据让价格序列是连续的、真实反映资产变动的。tushare和akshare接口里有复权因子字段直接取复权后的价格即可。第二个坑是缺失值。停牌日的价格为NaN、数据源偶尔漏数据这些都要先处理掉。最简单的方式是向前填充比如停牌期间沿用最后一天的收盘价更稳妥的方式是直接把停牌日的数据删掉因为回测时根本无法交易保留反而容易产生错误信号。第三个坑是数据类型。接口返回的价格可能是字符串格式必须先转成float日期列要解析成datetime类型否则后续排序、切片、画图都会出问题。我给你写一段标准的预处理逻辑参考import pandas as pd # 假设 df 是从接口拿到的原始数据 # 列名至少包含ts_code, trade_date, open, high, low, close, vol df[trade_date] pd.to_datetime(df[trade_date]) df df.sort_values(trade_date).reset_index(dropTrue) # 价格列转数值出错的数据直接变成 NaN for col in [open, high, low, close]: df[col] pd.to_numeric(df[col], errorscoerce) # 删除没有收盘价的无效记录 df df.dropna(subset[close]) # 按日期排序并去掉重复日期 df df.drop_duplicates(subset[trade_date], keeplast) # 如果要做历史回测使用前复权价格列 price_col close # 这里替换成接口返回的复权后收盘价列名这段代码的逻辑是先处理日期、再处理数值类型、去空去重最后得到一个干净的日线DataFrame。无论数据源是哪一家这一套流程基本通吃。3. 策略编写与回测实现从想法到能跑通的代码数据和环境都就绪了接下来就是最激动人心的部分把策略想法变成代码并验证它到底行不行。这一节我会从策略选型、信号生成、回测引擎实现到结果解读完整走一遍。3.1 第一个策略双均线策略的思路拆解第一个策略我建议做双均线不是因为它能赚钱而是因为它足够简单逻辑足够透明适合把整套框架跑通。双均线的规则就是两句话当短期均线上穿长期均线时金叉第二天买入当短期均线下穿长期均线时死叉第二天卖出这个策略背后的逻辑是趋势跟踪短期均线反映近期价格动向长期均线代表长期成本短期均线从下方穿越长期均线意味着市场短期动能转强趋势可能要启动。选择双均线还有一层好处它的信号是明确的二元判断没有主观空间特别好写进代码里。参数方面常见的组合是5日均线和20日均线也有用10和60的。到底哪个好后面可以通过参数扫描来验证入门阶段先用5和20把流程跑通最重要。这里有一个重要细节信号产生的当天不要立即交易而是等下一个交易日开盘再执行。为什么因为均线是用收盘价算出来的金叉信号要到收盘后才能确认当天盘中已经没机会按收盘价成交了。这一点新手最容易忽略结果回测里用了当天收盘价成交产生了未来函数收益虚高得离谱。3.2 手写回测引擎完整代码与逐步解释很多教程一开始就让你用现成的回测框架比如backtrader、vnpy这类我的建议恰恰相反第一个回测一定要手写。手写一遍你才能理解回测的本质——逐日模拟账户里有多少钱、持有什么股票、什么时候买卖、花了多少手续费每一步你都看得清清楚楚。用现成框架虽然省事但里面的默认逻辑和潜在坑你看不见出错了都不知道错在哪。手写回测的核心思路是向量化操作用pandas批量计算每天应持有的仓位不要用for循环逐日判断。逐日循环在日线级别回测里速度其实还行但代码啰嗦、容易出错向量化的写法更简洁、更贴近pandas的设计思路。下面是完整的双均线回测代码我加了解释可以直接复制运行import pandas as pd import numpy as np import matplotlib.pyplot as plt # 假设 df 已经经过数据处理并按日期升序排列 # 包含列trade_date, close df df.set_index(trade_date) # 1. 计算均线 df[ma_short] df[close].rolling(window5).mean() df[ma_long] df[close].rolling(window20).mean() # 2. 生成信号短均线在上方为1持仓否则为0空仓 df[signal] np.where(df[ma_short] df[ma_long], 1, 0) # 3. 持仓状态用 shift(1) 实现信号次日生效 df[position] df[signal].shift(1).fillna(0) # 4. 计算每日收益率 df[daily_return] df[close].pct_change().fillna(0) # 5. 策略每日收益 当日收益率 * 昨日持仓状态 df[strategy_return] df[daily_return] * df[position] # 6. 累计净值 df[strategy_nav] (1 df[strategy_return]).cumprod() df[benchmark_nav] (1 df[daily_return]).cumprod() # 7. 输出关键指标 total_return df[strategy_nav].iloc[-1] - 1 sharp_ratio df[strategy_return].mean() / df[strategy_return].std() * np.sqrt(252) print(f策略累计收益{total_return:.2%}) print(f基准累计收益{df[benchmark_nav].iloc[-1] - 1:.2%}) print(f策略年化夏普比率{sharp_ratio:.2f})这段代码看着很短但信息量不小。第3步的shift(1)是精髓它让得到信号后的第一个交易日才建仓严格避免未来函数。第5步的position要在乘收益率之前先取昨日值因为今天的仓位是昨天信号决定的。如果你把这两步的顺序搞反回测收益会明显虚高这是自欺欺人的经典错误。模型跑完建议把净值曲线画出来看看plt.figure(figsize(10, 6)) plt.plot(df[strategy_nav], labelStrategy) plt.plot(df[benchmark_nav], labelBenchmark) plt.legend() plt.title(Dual Moving Average Strategy Backtest) plt.show()看到净值曲线的那一刻你的量化入门就完成了一半。曲线向上说明策略在样本期内赚钱跑赢基准说明策略有超额收益来源。但注意这只是历史结果的展示离“策略有效”还差得远。3.3 回测结果解读别只盯着收益率新手看回测最容易犯的毛病是只看累计收益。一个收益300%的策略可能中途回撤了80%这种策略实盘谁也拿不住。评估一个策略必须要看几个维度第一个是最大回撤也就是从任何一个高点跌到后面最低点的最大跌幅。这个指标直接反映策略的风险程度感受一下账户从100万跌到60万再涨回来期间的心理压力是巨大的。回撤越大策略实盘存活概率越低。第二个是夏普比率它衡量的是每承担一单位风险能换来多少超额回报。年化夏普在1以上算及格2以上算不错。注意我代码里用的是简化算法把日收益率均值除标准差再乘以根号252严格来说夏普还要减去无风险利率但入门阶段先这样算问题不大。第三个是交易频率和胜率。双均线在震荡行情会被反复打脸频繁小亏这个信息就在胜率里。胜率低于40%不一定是坏策略因为趋势策略往往是“小亏大赚”重要的是盈亏比。把这些指标整体看才能判断一个策略的盈利逻辑到底是什么。还要特别提醒一点样本期外的验证。你在某一时间段回测效果好不代表策略一直有效。一个合格的验证流程是把数据分成两段一段叫样本内用来调参另一段叫样本外用来检验。如果样本外表现还过得去说明策略抓住的可能是一个真实规律如果样本外表现一塌糊涂那你之前看到的繁荣大概率是过拟合的结果。4. 常见问题与排查技巧实录把坑提前填上这个环节是我最想写的。量化交易的资料很多但大多数都不会告诉你实际运行中会遇到哪些让人抓狂的问题。我把这些年踩过、也看别人踩过的坑整理成了一份排查清单每一个都标了表现和解决方案方便你对照自查。4.1 数据相关的问题错得最隐蔽数据问题之所以可怕是因为它通常不会让你报错而是让你得出一个貌似合理的错误结果。第一个高频问题是除权除息导致的价格跳空。表现是某天股价莫名其妙跌了20%但并不是真实下跌而是分红除权。如果不用复权价你的均线会被这个跳空打出一个假死叉继而触发错误的卖出信号。排查方法很简单看看股价序列里有没有单日跌幅超过15%但当日大盘平稳的情况如果有八成是没复权。解决方案是直接改用复权价格列。第二个问题是前视偏差。表现为回测收益高得离谱夏普超过3甚至5这时候要高度警惕自己是不是用了未来数据。常见的前视包括用当天收盘价在场内交易、用未来财报数据选股但未考虑发布时点。排查方法是从信号到交易的每一步都问一句“我当时真的知道这个信息吗”。解决的办法就是严格遵守signal当天确认、次日开盘买入的规矩。第三个问题是幸存者偏差。表现是回测里选出来的股票池全是现在还活着的股票退市的、暴跌的股票根本没进样本。这会让回测收益系统性偏高因为你天然拒绝了那些破产退市的股票。解决的办法是使用带历史快照的数据集或者在获取股票列表时追加当天是否上市状态字段来做筛选。第四个问题是数据缺失和停牌。表现是某一只股票的K线中间断了几天导致pct_change计算出奇大的收益率。处理方式是先看数据源是否标记停牌再决定是填充还是删除。我倾向于删除停牌日因为停牌期间无法交易保留反而干扰信号。4.2 回测逻辑的细节问题问题不大但要命回测框架看着简单细节里全是魔鬼。我把最容易出问题的几个点列出来手续费和滑点设置不当是最常见的问题。很多新手把手续费设成0或者设成万分之一回测结果漂亮得很但实盘根本没有这个费率。A股目前的佣金通常万分之几加上卖出印花税千分之一单边成本大概在千分之一点五到千分之二左右。回测里一定要把这个成本算进交易里哪怕用一个固定值也行否则你赚的钱本来就是假的。最小交易单位的问题也容易被忽略。A股买入必须是一手的整数倍100股如果你的资金量给小买入持仓为50股回测里可以实盘里根本买不了。处理办法是在生成信号时根据账户资金算好能买几手再把不能成交的零头去掉。还有进出场价格的选择。我用的是当日收盘确认信号、次日开盘价成交。但开仓用真正开盘价做回测需要处理开盘就涨停买不进的情况。入门阶段可以用次日开盘价近似但要意识到这仍然是理想化假设。真要严谨还得额外标记涨跌停日不可交易。下表是我整理的快速对照表问题类别典型表现排查思路解决方案数据未复权股价偶发大幅跳空策略频繁误交易看序列中是否存在异常单日跌幅使用前复权价格列前视偏差回测收益远超常理夏普惊人逐步骤检查信息时点信号产生次日再交易幸存者偏差股票池全是当前未退市的股票检查股票列表是否包含退市股使用含历史快照的股票池手续费忽略策略收益对费率极敏感交易成本参数设为0验证加入佣金、印花税、滑点估算最小手数未处理回测持仓出现不整手数检查持仓明细按100股整数成交4.3 策略评估与调优的陷阱别把运气当能力回测初见成效之后很多人会进入一个疯狂的调参阶段把均线周期从5日调到3日、4日、6日、7日找到一组数字让历史回测收益最高然后觉得自己找到了圣杯。这其实是个巨大的陷阱叫过拟合。怎么判断自己是不是过拟合了简单粗暴的方法是做参数敏感性测试。你把短均线参数从3扫到30画出收益随参数变化的曲线如果收益像过山车一样某个参数组合突然冲到极高、旁边参数惨不忍睹那这个策略大概率是在用噪声拟合历史。真正有效的策略它的参数附近应该是一个较平稳的高原哪怕参数偏离一些收益也不会太差。我常用的方法是把一个策略放在完全不同的时间段里测试。比如2022年到2024年的市场环境跟2019年到2021年的差别很大一个策略如果在这两个阶段都能活下来说明它的盈利逻辑不是依赖某一波特定行情。另外一个思路是尽可能增加交易样本数量。均线策略一年才交易几十次统计意义太弱这也是为什么很多专业量化人更偏好分钟级数据或者多品种交易样本量上去了策略评估的可信度才会上去。最后永远不要对自己的回测结果过度自信。历史数据里的规律有很大一部分是市场当时的特定环境造成的环境变了策略就失效了。我个人的体感是回测赚钱的策略上实盘大概率会打折回测亏钱的策略上实盘大概率还是亏钱所以回测的目标不是找圣杯而是过滤掉明显不靠谱的坏点子。5. 跑通闭环之后从模拟到实盘的边界扩展当你把一个策略从数据到回测完整跑通并且能读懂各项指标量化入门的核心目标就算达成了。接下来你可能会面临一个新的冲动上实盘。这一步我必须泼点冷水也要给一些实际建议。5.1 程序化实盘的门槛没有想象中简单很多新手以为实盘就是找个交易接口一接就完事实际门槛不低。目前国内券商的程序化交易接口基本上都有资金门槛和资质要求一般要求账户资产达到一定规模还要通过相关的程序化交易知识测试。即使拿到了接口权限程序化交易还需要满足监管对程序化报备的要求策略风控不合格的账户会被限制交易。更现实的问题是你辛辛苦苦写好的回测系统距离一个实盘系统还缺了很多工程上的东西行情服务的稳定接收、报单和撤单的异常处理、断线重连、意外断电后的恢复、交易状态的同步。这些任何一个环节出问题都可能让账户产生不可预期的风险。所以我的建议是如果真的想体验实盘先用模拟盘跑一两个月。模拟盘虽然成交逻辑不如真实盘那么严苛但能帮你把所有流程都跑一遍把系统稳定性问题暴露出来。5.2 资金管理与风险控制量化活得久的前提策略是赚多赚少的问题风控是生和死的问题。入门阶段最容易忽视的恰恰是风控。很多新手把回测收益当成一种必然一上来就满仓干结果一次小概率的极端行情就带走了全年利润。资金管理最基础的原则是单笔交易的风险控制在总资金的一个固定比例之内。简单说你的买入量要根据止损位来确定而不是根据“你觉得能赚多少”来确定。比如总资金10万你规定单笔最多亏损总资金的2%也就是2000元那么股票止损位如果距离买入价有10%那最多只能买2万市值剩下的资金不参与。除了单笔止损还有仓位管理。一个回测再好的策略也不该全仓押注一个品种。分散的意义不是为了多赚而是为了在不确知哪个策略会失效的情况下不让某一个策略的失效毁掉你整个账户。如果资金量本来就小分散不现实那就更应该降低总体的仓位先让策略在真金白银的市场上活下来再谈扩大规模。5.3 后续可以深入的方向从双均线到多因子甚至机器学习当你把双均线这套最小闭环吃透了这个框架就是你的“地基”可以往多个方向扩展。第一个方向是把策略做得更丰富。双均线只是趋势跟踪里最简单的一个变体你还可以加上成交量过滤比如均线金叉同时成交量放大才买入可以加上价格位置过滤比如只在股价站上年线时才开仓还可以用ATR动态设置止损位让止损幅度跟着波动率走。这些都是在同一套框架里做增量代码结构不需要推翻重来。第二个方向是多标的和组合层面。一个策略在一只股票上表现不稳不代表它在几十只股票的组合里不能创造稳定超额。你可以在全市场做股票池筛选比如每天选均线刚金叉的前10只股票等权买入定期调仓。从单标的到股票池对很多人来说是量化认知的一个跳跃因为你开始研究的是组合层面而非单标的的运气。第三个方向是因子研究和机器学习。XGBoost、随机森林、神经网络这类模型可以用来挖掘因子与收益率的非线性关系但这需要足够多的数据、足够深的统计学功底而且样本外失效是常态。我的建议是至少在你用手写方法做过几百组策略测试后再考虑引入这些高级工具否则很容易只是把过拟合从参数级扩大到了模型级得到的依然是一个精致的巧合。我在这个领域的真实感受是量化交易入门最关键的不是技术而是扎实的心态和严谨的验证习惯。每一组惊艳的回测数字背后都可能藏着一个你没有看见的数据裂缝或者逻辑漏洞。老老实实从双均线开始把数据、信号、回测、评估这条链路完整跑通再把资金管理和风险控制的意识刻进骨子里就已经领先绝大多数人了。最后分享一个小技巧给你的每个策略起一个能说清楚的生意逻辑名字。比如“5日20日趋势跟踪只做多ATR止损”而不是“策略v13最优版”。当你被过拟合吸引时这个名字能提醒你当初它到底在赚什么钱。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑