云端量化平台双均线策略实操:Python量化新手半小时跑通全流程

发布时间:2026/9/20 11:20:03
云端量化平台双均线策略实操:Python量化新手半小时跑通全流程 很多朋友学Python量化第一反应是先去装Python、配VSCode、学爬虫折腾一圈下来发现连“策略代码长什么样”都还没见过。其实像iQuant这类云端量化平台早就把环境搭建、行情数据、回测引擎这些脏活累活全包了你只需要打开浏览器注册一个账号直接在里面写Python策略就行。这篇文章就是写给那些“想学量化、但被环境搭建劝退”的人也写给已经会一点Python、却不知道策略代码该怎么组织的新手。目标很明确让你在半小时内在iQuant平台上跑通一个完整的双均线量化策略并且每一步都知道自己在干什么。我会把整个流程拆成“想明白概念—准备环境—写代码—跑回测—排坑—下一步进阶”六个环节每一步都按保姆级标准来代码直接可以照抄。1. 入门之前先把这三件事想明白1.1 量化策略到底在做什么很多人一听“量化策略”就觉得是高深莫测的数学工程其实本质特别朴素把你的交易想法变成一段可以自动执行的规则代码。我常用的一个生活化类比是“天气预报决定带不带伞”。如果你给自己定一条规矩明天降雨概率超过60%就带伞否则不带这其实就是一个最简单的策略。你决定“带伞”还是“不带伞”的依据是“降雨概率”这个指标是否超过某个阈值。量化交易也一样只不过把“降雨概率”换成“均线、MACD、成交量”这类行情指标把“带伞”换成“买入”把“不带伞”换成“卖出”。所以一个量化策略的核心就是三件事信号怎么产生、仓位怎么定、交易怎么执行。新手第一个策略不用搞复杂只需要一个信号加上一个最简单的仓位规则就够了。1.2 iQuant平台里代码到底在哪里跑这是新手问得最多的问题要不要在自己电脑上装Python答案是不用。iQuant这一类云端量化平台的逻辑是代码写在网页编辑器里真正执行代码的是平台的云端服务器你的电脑只需要一个浏览器。数据也是平台帮你准备好的沪深股票的日线、分钟线、财务报表数据调用一个API就能拿到不需要自己下载CSV文件去清洗。这个体验有点像“自己在家做菜”和“点外卖”的区别。本地装Python就像自己买菜、洗菜、切菜、炒菜每个环节都要你操心而iQuant这类平台等于把“菜市场”“中央厨房”都配好了你只管写清楚“今天想吃什么菜”。当然这不意味着本地Python完全没用如果你以后想做更复杂的数据分析、读研报、做机器学习模型那本地Python的pandas、numpy、sklearn生态还是绕不开的。但对于今天这篇教程而言你完全不碰本地Python也能跑通整个流程。1.3 一个策略从写到实盘要经过哪几步正规的量化工作流一般分四步研究、回测、模拟盘、实盘。研究阶段你用历史数据去验证想法回测阶段平台用你写的规则在历史K线上一根一根地模拟交易输出收益曲线模拟盘阶段策略接入实时行情但用虚拟资金下单检验它在实盘环境中的表现最后才轮到实盘。新手在iQuant上做前两步就够了。很多人一上来就想着实盘连回测都没跑明白这是最典型的坑。先把研究阶段做扎实把回测报告看明白再考虑后面的步骤。2. 保姆级环境准备注册、新建策略、认清楚界面2.1 注册并新建一个空白策略iQuant平台的环境准备比你想的简单得多不需要装任何软件所有步骤都在浏览器里完成。第一步打开浏览器进入iQuant官网用手机号注册。按平台提示完成身份验证这个流程和注册大多数金融服务类应用一样属于正常合规要求别觉得麻烦。第二步登录后进入“策略研究”或“我的策略”页面找到“新建策略”按钮。一般会弹出一个模板选择这里我的建议是选“空白模板”不要选那种自带几十行示例代码的模板。原因是示例模板对你理解代码逻辑没有帮助反而会在你后续修改时搞不清楚哪些代码是该留的、哪些是该删的。第三步给策略起一个有意义的名字比如my_first_ma_strategy这样以后策略多了才不会被一堆“未命名1”“未命名2”搞晕。点击确认后平台会自动生成一个空白策略文件里面可能自带initialize和handle_bar的框架这是好事说明你已经站在正确的起跑线上了。2.2 界面里这几个区域先认清楚新建完策略后你会看到类似IDE的网页界面。这里不需要认识每个按钮重点认清楚四个区域就行。中间最大的区域是代码编辑器你的Python代码就写在这里。左上角是文件列表你创建的所有策略文件都能在这里看到可以在这里新建、删除、重命名文件。右侧通常有数据浏览器或帮助文档新手一定要去翻API文档那是平台给你的“产品说明书”。顶部或侧边有一排运行按钮比如“回测”“运行”“编译”这是你验证策略的入口。有一点要提前说明不同版本的iQuant界面按钮叫法可能略有差异但核心布局基本都是“编辑器文件列表运行入口”这套模式找到容易理解的那几个按钮就不会迷路。2.3 写第一行代码前的三个习惯在开始写代码之前我想先给你灌三个观念这些观念来自我自己踩过的坑能帮你少走很多弯路。第一先跑通最小示例。不要第一次就贴一大段完整策略代码而是先随便写一行print(hello)跑一下看能不能输出确认整个流程是通的。流程通了后面再加代码才不慌。第二先做单标的。新手最容易犯的毛病是一上来就想全市场选股、做投资组合。这个思路本身没问题但它引入了太多变量选股逻辑、轮动频率、仓位分配、交易成本任何一个环节出错都很难排查。我的建议是先只交易一只股票把策略逻辑验证明白再考虑扩展。第三先跑默认参数。很多人拿到一套策略代码第一件事是去调均线参数从5日线试到30日线却发现结果越调越乱。正确的姿势是先用默认参数跑通理解每一个参数的含义后再去优化参数。3. 核心细节解析双均线策略的完整代码与逐行拆解3.1 为什么第一个策略选双均线市面上的策略五花八门动量策略、均值回归、MACD金叉、布林带突破、网格交易……但我给新手的建议永远是先写双均线策略。理由是它简单、直观、信息密度刚好合适能把“取数据—算指标—产生信号—下单”这条路完整走一遍又不会让代码量失控。双均线的逻辑用一句话就能说明白短期均线从下往上穿过长期均线买入短期均线从上往下跌破长期均线卖出。这个“金叉买、死叉卖”的逻辑是绝大多数趋势跟踪策略的基本盘。3.2 先贴完整代码再逐行拆解下面是完整的代码我加了一些注释和容错判断。你可以直接复制到iQuant的空白策略里使用。def initialize(context): # 选择交易的标的000001是平安银行.XSHE表示深交所 g.security 000001.XSHE # 短期均线窗口5天 g.short 5 # 长期均线窗口20天 g.long 20 # 目标仓位比例95%资金买入留5%应对手续费和滑点 g.position 0.95 def handle_bar(context, bar_dict): # 第一步获取历史收盘价 # history_bars会返回按时间排序的收盘价数组 # 这里多取1根g.long 1为了防止最新bar数据不完整 close_prices history_bars(g.security, g.long 1, 1d, close) if len(close_prices) g.long 1: return # 第二步计算短期和长期均线 # [-5:]表示取数组最后5个元素然后求平均值 short_ma close_prices[-g.short:].mean() long_ma close_prices[-g.long:].mean() # 第三步判断当前是否持仓 # context.portfolio.positions里存放当前持有的股票信息 has_position bool(context.portfolio.positions) # 第四步核心交易信号 # 短期均线上穿长期均线且目前没持仓就买入 if short_ma long_ma and not has_position: order_target_percent(g.security, g.position) # 短期均线下穿长期均线且目前有持仓就清仓 elif short_ma long_ma and has_position: order_target_percent(g.security, 0)3.3 initialize函数给策略设置初始状态策略最开始执行的是initialize函数。它的作用是做初始化也就是给整个策略“设定起点”。注意一个关键特点initialize在整个策略运行过程中只执行一次而handle_bar会持续执行。initialize里用的g这个词不是某个固定语法而是平台约定俗成的一个“全局数据对象”。你可以把g想象成一个策略笔记本所有写入g的变量比如g.security、g.short都能在其他函数里被读取和修改。这种用g统一管理全局变量的方式是为了避免直接在函数里用一堆全局变量导致代码混乱。在initialize里我做了三件事把交易标的设定为平安银行、设定均线窗口、设定仓位比例。把这三个参数都放到initialize里一个很大的好处是以后要调整策略参数只需要在这里改handle_bar里完全不用动。3.4 handle_bar函数策略的核心引擎handle_bar是整个策略最核心的部分每一根K线到来时它就会自动被调用一次。在日线策略里可以理解为每个交易日收盘时它都会执行一遍。第一件事情是获取历史收盘价。history_bars(g.security, g.long 1, 1d, close)这句话的意思是获取这个股票过去g.long加1根日线收盘价。这里有个细节我多取了1根K线这是为了确保长期均线计算时有足够的数据。如果你只取20根K线去算20日均线在数据顺序和边界判断上容易出问题。多取1根算是给自己加一道保险。接着用len(close_prices) g.long 1判断一下数据长度避免回测刚开始、历史数据不足时出现数组越界。第二件事情是计算均线。close_prices[-g.short:]的意思是取数组最后5个元素也就是最近5天的收盘价然后调用.mean()求平均值。你需要了解history_bars返回的是一个类似数组的结构支持Python切片语法也支持.mean()这类pandas风格的方法。只要把它理解为“按时间从旧到新排列的序列”切片逻辑就很好懂。第三件事情是判断持仓。context.portfolio.positions是一个字典记录了当前持有的股票。如果持有字典不为空如果没有持仓字典为空。我用bool()把它转换成True或False方便后面的逻辑判断。第四件事情是交易信号。这里用了if和elif的组合短期均线大于长期均线且未持仓就买入短期均线小于长期均线且有持仓就清仓。注意我用的是order_target_percent也就是“把某个股票调整到目标仓位比例”传入的0.95代表95%仓位传入0代表清仓。用这个函数的好处是你不需要自己计算要买多少股平台会根据当前账户总资产自动算出买入数量非常适合新手。3.5 代码里最容易写错的三个点第一股票代码格式。一定不要只写000001要写000001.XSHE或000001.XSHG。后缀代表交易所XSHE代表深交所XSHG代表上交所。平安银行是深市的所以要写000001.XSHE。如果你要换股票比如买招商银行对应代码是600036.XSHG因为它在上交所。这个代码格式是新手非常容易忽略的坑。第二均线计算边界。为什么我要用g.long 1去取历史数据而不是g.long核心原因是避免“刚好只有20个数据”时数据一旦出现轻微缺失或边界异常均线就算不出来。return的容错判断也是在回测开始时数据不足时的保护机制。没有这个判断回测前几根K线就可能直接报错。第三持仓判断。初学者常犯的错误是直接把buy和sell的条件写成if short_ma long_ma和if short_ma long_ma。由于均线在大多数情况下总有一条在上一条在下这种写法会导致每天都在反复买卖策略变成“抽风式交易”。加上持仓判断以后逻辑变成有仓位时只考虑卖、没仓位时只考虑买交易频率立刻正常。3.6 把策略逻辑翻译成人话如果用“带伞规则”来类比这个双均线策略现在的逻辑是过去5天的天气综合指标比过去20天的天气综合指标更糟糕了就带伞买入反过来一旦短期指标转好、长期指标还跟不上就把伞收起来清仓。这里面的投资直觉是短期均线代表近期价格趋势长期均线代表长期价格趋势。当短线上穿长线代表近期价格强于长期平均市场在上涨买入当短线下穿长线代表近期价格弱于长期平均市场在下跌卖出。这就是趋势跟踪的核心思想不预测未来只跟随当下。4. 实操过程回测并看懂结果4.1 回测之前把这些参数定好写完了代码接下来就是最激动人心的环节点回测按钮。但在点之前需要把回测设置改好。首先是回测区间。我建议第一次回测选择2019-01-01到2024-12-31。这几年的行情既包含结构性牛市也包含漫长的熊市和震荡市能够比较综合地检验策略的适应性。不要只看近3个月的数据那样只能看到一种行情策略表现好了会觉得天下无敌实际上换个市场环境就崩了。其次是初始资金。选100万就好这个数值不是实盘金额只是用来计算收益率的一个基准。设置成100万方便你一眼看出百分比对应多少金额。然后是基准。平台默认的基准通常是沪深300指数不用改。这个基准是用来做业绩对比的如果策略跑不赢基准那还不如直接买指数基金冒着更大的风险折腾什么呢。最后是手续费、滑点等交易成本参数。新手阶段先保持平台默认设置不需要动。4.2 点击回测后重点关注这几个指标点击回测按钮后平台会开始运行然后在几秒到几十秒内输出回测报告。报告里包含收益曲线、交易记录、多项统计指标。新手面对一堆指标容易眼花缭乱我的建议是重点看下面几个。第一是累计收益率也就是整个回测期间策略赚了多少钱。第二是年化收益率把累计收益折算成一年的收益率方便和其他策略横向对比。第三是最大回撤这是策略从净值最高点跌到最低点的最大幅度。最大回撤比收益率更重要因为一个回撤50%的策略理论上要涨100%才能回本这种心理压力绝大多数人都扛不住。第四是夏普比率它衡量的是“每承担一单位风险能换来多少收益”夏普比率大于1算不错大于2算优秀但新手阶段别太在意这个数字。第五是胜率也就是赚钱的交易次数占总交易次数的比例胜率不是越高越好趋势策略的典型特征是胜率低但单次盈利高。记一个关键原则回测报告是给策略“体检”用的不是用来发朋友圈炫耀的。不要只看收益曲线好看就得意一定要看它下跌的时候跌多深。4.3 回测结果“太漂亮”时要警惕很多人第一次写完策略跑回测看到收益曲线一路向上能高兴一整天。但我要给你泼一盆冷水回测收益越完美越要警惕。比较常见的坑有这么几类。一类是未来函数也就是策略代码里有意无意用到了未来数据比如在当天收盘之前就拿当天收盘价做决策这在真实交易里是不可能的但回测引擎无法自动识别出来。另一类是过拟合也就是你反复调整参数恰好找到一组参数在历史数据上表现极好可在看历史数据定参数的那一刻你其实已经“偷看”了未来。还有幸存者偏差历史股票池里选标的时如果不小心用到了现在还在上市的股票而忽略了那些已经退市的烂股票收益会被系统性高估。最后是交易成本不足高频策略在回测时如果手续费和滑点设置太低也会看起来很美实盘一跑就原形毕露。我的建议是第一次跑完双均线策略看到收益率和最大回撤之后先别急着调参数。多跑几个不同的时间区间比如2020到2021、2022到2023看看策略在单边下跌和震荡市里的表现是否正常。一个策略如果在所有区间都亏损得差不多那说明它逻辑稳定如果在某些区间暴赚、某些区间巨亏那就要小心里面可能暗藏了不切实际的假设。5. 常见报错与排查技巧实录5.1 新手高频报错速查表在带新人的过程中我发现以下这些报错出现频率最高给你做成了一个速查表。报错现象常见原因解决办法编译报错invalid syntax中英文标点混用、缩进不一致把全角括号、引号改成半角统一用4个空格缩进NameError: name xxx is not defined变量名拼写错误、未定义就使用检查变量名是否一致g.short写了g.shot肯定不行股票代码格式报错缺少.XSHG或.XSHE后缀补全交易所后缀深市用.XSHE沪市用.XSHG数组越界/数据为None历史数据不足、代码格式不对增加len判断检查数据获取API参数格式回测结束但没有交易交易条件始终不满足或下单参数错误用print输出中间变量查看是否执行了交易语句收益曲线笔直上升大概率用了未来函数或过拟合检查代码中是否把收盘价直接用于当日决策5.2 不报错但也没有交易怎么排查这是比报错更让人头疼的情况代码能编译回测能跑完但结果显示“0笔交易”。遇到这种问题第一反应别去猜直接在策略里加print把中间变量打出来。比如在handle_bar里加上这样两行print(short_ma, long_ma, has_position)回测时打开日志面板观察每次handle_bar打印出来的数值。如果short_ma长期小于long_ma那么策略买入条件始终不成立自然一笔交易都没有。这时候你需要检查的就不是代码逻辑而是股票价格趋势本身是不是刚好这些年这个股票一直在下跌双均线策略在下跌趋势中确实不会买入。如果打印结果显示short_ma和long_ma经常交叉说明信号产生了但依然没有交易那问题大概率出在下单函数上。检查order_target_percent的第一个参数是不是用了正确的股票代码检查第二个参数是不是在0到1之间。很多时候订单提交了但因为你设置的仓位比例是0结果当然是啥也没买。5.3 回测跑得再顺也要用模拟盘验证最后一条经验来自我自己的惨痛教训回测结果漂亮不代表实盘表现一致。所以当你把一个策略在回测阶段打磨得比较满意之后不要急着实盘先在iQuant平台把策略挂上模拟交易用虚拟资金跑几周。模拟盘和回测最大的差别在于回测是在已知的历史K线上逐根回放而模拟盘是订阅实时的行情数据信号产生时你并不知道下一秒会发生什么。滑点、成交速度、盘口变化这些在回测里很难完全模拟但在模拟盘里都会真实发生。挂模拟盘一方面验证策略在实时行情下的表现另一方面也能让你感受一下持仓过程中净值波动带来的心理压力。6. 下一步从“跑通教程”到“有自己的策略”6.1 先把平台API吃透再追求策略复杂度很多新手跑通双均线策略后马上就想去复制别人那种几十行甚至上百行的复杂策略。我的建议是千万别急先把你现在代码里用到的几个API彻底搞明白。initialize和handle_bar的执行流程、history_bars能取哪些数据、order_target_percent的各种参数这些都是平台的基础API就像盖房子的地基。地基没打牢后面策略越写越大排查问题的难度会指数级上升。6.2 掌握pandas是扩展策略的必修课你可能会发现策略代码中用到的切片、mean这些操作其实都是pandas的风格。当你想要给策略加入更多指标比如RSI、ATR、布林带没有pandas基础会非常吃力。所以我的建议是利用平台里的研究环境或读一些Python数据分析的教程把pandas的基本数据结构Series和DataFrame学熟。这个模块不复杂但它是你从“只会抄代码”进化到“能写自己策略”的关键阶梯。6.3 重视风控和仓位管理而不是只研究买卖信号最后想讲一个非常重要的观念转变。新手阶段你的注意力几乎全在“什么时候买、什么时候卖”上这很正常。但随着策略越写越多你会发现决定一个策略长期能不能活下来的更多在于风控和仓位管理。比如双均线策略里g.position0.95这个参数它决定了你每次买入用多少仓位。如果你改成0.5策略的波动会明显降低收益也会相应平滑。再比如设置止损条件当亏损达到一定比例就强制清仓这些都属于风控策略它们在实盘中的价值往往比一个完美的入场信号更高。我自己在实际操作中的一个经验是每写完一个策略都要习惯性地问三个问题如果它连续亏损10次我会不会扛不住如果它一年都不盈利我有没有其他应对方案我的仓位能不能承受30%的最大回撤这些问题想清楚了你才算真正学会做量化而不是只会写代码。最后再分享一个小技巧别急着把策略里的参数“调优”。你先跑通一个表现平平但逻辑健康的策略再慢慢去调整参数、增加过滤条件这样每一步改变都能看到明确的边际影响。如果你一上来就追求完美收益曲线大概率会在过拟合的泥潭里越陷越深。