零基础用Python写你的第一个量化策略:从想法到回测,100行代码就够
**摘要**:别被「量化交易」四个字吓住。今天道道带你用Python,从零写一个能跑通的双均线策略,从取数据、算指标、模拟买卖到出收益曲线,全程100行左右代码。看完你也能动手搭一个属于自己的小回测。作者:道道。
很多朋友后台问我:道道,我也想做量化,但我不是程序员,数学也一般,是不是就彻底没戏了?
我的回答是:别慌,真的没你想的那么难。
量化这个东西,听着高大上,剥开来看就三层:「有个想法 → 写代码验证 → 看数据说话」。 你不会的是第二层,但第一层和第三层,其实你早就天天在做——你想过「跌了买、涨了卖」就是一个想法;你亏了钱心疼、赚了钱开心,就是在用感觉看结果。
今天这篇,我就把中间那道最厚的墙——「写代码」——帮你拆掉。用 Python,写一个最小可用的双均线策略,带完整回测。你不用成为程序员,跟着敲一遍,你就迈出了量化的第一步。
一、先把「量化」这事想明白
先说句大实话,免得你走弯路:量化不是印钞机,它是一套「把规则写死、让机器执行、用数据验证」的方法论。
它的价值不在「聪明」,而在「纪律」。
人最大的毛病是什么?是情绪。涨了贪、跌了怕、拿不住、追高杀跌。机器没有情绪,它只会老老实实执行你定好的规则,然后告诉你:这套规则,历史上到底赚不赚钱。
所以今天这个策略,我不指望它帮你暴富,我只希望它让你体会到一件事:「把想法变成能验证的东西」,这件事本身有多爽。
二、写代码前,先想清楚你的「想法」
好的量化,先有想法,后有代码。我今天给你讲个最简单也最经典的入门想法——双均线。
规则就三条,小学生都能懂:
- 算一个「短期均线」(比如过去5天的平均价,MA5)。
- 算一个「长期均线」(比如过去20天的平均价,MA20)。
- **短期均线上穿长期均线 → 买入;下穿 → 卖出。**
翻译成人话:短期趋势变强了,跟着买;短期趋势转弱了,赶紧撤。就这么简单。
你看,策略的「魂」从来不在于代码,而在于你脑子里的规则。 想清楚规则,代码只是把规则翻译成机器听得懂的话而已。
三、动手:把想法翻译成代码
环境假设你装好了 Python 和 pandas(没有的话 pip install pandas 装一下就行)。我们分四步走。
第1步:拿数据
做量化第一件事是拿到价格数据。这里我用最省事的方式——直接造一段模拟数据来演示流程(真实环境你可以用 tushare、akshare 这类免费库拉A股历史行情):
import pandas as pd # 扩展为 30 个模拟收盘价(包含原数据并新增后续走势) prices = [ 10.0, 10.2, 10.1, 10.5, 10.8, 10.6, 11.0, 11.4, 11.2, 10.9, 11.1, 10.7, 10.4, 10.6, 10.9, 11.3, 11.6, 11.8, 12.0, 12.3, 12.1, 11.9, 11.7, 11.5, 11.8, 12.2, 12.5, 12.7, 12.4, 12.6 ] df = pd.DataFrame({"close": prices})
第2步:算均线
均线就是「过去N天的平均值」,pandas 一行搞定:
# 计算均线(MA5 和 MA20) df["ma5"] = df["close"].rolling(5).mean() df["ma20"] = df["close"].rolling(20).mean()
注意:MA20需要至少20个数据点,所以前面的行是空的(NaN)。真实做策略时数据要足够长。
第3步:生成买卖信号
这就是把「上穿买入、下穿卖出」翻译成代码的地方。我习惯用「信号位移」来判断穿越——昨天短期均线在长期均线下面,今天跑到上面了,就是上穿:
# 生成信号:1=金叉买入,-1=死叉卖出,0=无操作 df["above"] = df["ma5"] > df["ma20"] df["signal"] = df["above"].astype(int).diff()
第4步:模拟资金曲线(最小回测)
这一步是整个量化的「灵魂」——把信号变成钱。逻辑:有信号就按收盘价成交,然后看账户里钱怎么变:
# 回测循环(按收盘价交易) cash = 10000.0 position = 0 equity = [] for i in range(len(df)): price = df["close"].iloc[i] sig = df["signal"].iloc[i] if sig == 1 and position == 0: # 金叉买入 position = 1 cash -= price * 100 elif sig == -1 and position == 1: # 死叉卖出 position = 0 cash += price * 100 equity.append(cash + position * price * 100) df["equity"] = equity print("最终资产:", round(equity[-1], 2))
跑完你会发现,策略有赚有亏,这是正常的。重点不是你这次赚了多少,而是你已经能把「一个想法」变成「一串看得见摸得着的数字」了。
四、回测通过 ≠ 就能赚钱,这三个坑你必须知道
代码跑通了,很多人就热血上头了,觉得「我找到财富密码了」。打住! 回测只是入门券,离赚钱还差十万八千里。我给你提三个必须警惕的坑:
坑1:过拟合。 你有没有为了「让回测曲线好看」而疯狂调参数?今天 MA5/MA20 亏,就改 MA10/MA30,改到看着顺眼为止?这叫过拟合,是量化新手第一大坑。参数是拿历史数据「试」出来的,不是「算」出来的,未来大概率不灵。
坑2:没算手续费和滑点。 真实交易不是免费的。每次买卖都有手续费,市价成交也有滑点(你想买的价,不一定买得到)。我上面这个极简回测完全没算成本,所以结果偏乐观。真实收益 = 回测收益 − 交易成本,成本越高,策略越难赚。
坑3:样本太少。 我上面就用了18个数据点,根本没统计意义。真实回测,至少要用几年、几千根K线。数据太短的回测,跟掷硬币没区别。
记住一句话:回测最大的作用,不是告诉你「能赚」,而是帮你在真金白银砸进去之前,先看看「会不会亏」。
五、接下来你该做什么?
今天这篇只是个「开胃菜」,让你尝尝量化的味道。如果你真被勾起了兴趣,建议按这个顺序往下走:
- **把上面的代码真正敲一遍、跑一遍**,哪怕只改一个参数,看看结果怎么变。
- 换一段**真实的历史数据**(用 akshare 拉个指数或ETF的行情),重跑一遍,感受真实数据的颗粒感。
- 加上**手续费和滑点**,让回测更真实。
- 学会看**最大回撤**——也就是最惨的时候亏了多少,这比「赚多少」更重要。
量化是一场马拉松,不是百米冲刺。别想着一个月暴富,先把「跑通、看得懂、说得出为什么」这三件事做好。
FAQ
Q1:我完全不会编程,真的能学量化吗?
能。Python 是公认对新手最友好的语言,今天这篇的代码你照着抄就能跑。你不需要懂底层原理,先「跑起来、看到结果」,信心就有了。之后再一点点补数学和编程基础。
Q2:量化策略一定能赚钱吗?
一定不能保证。任何策略都有失效的时候,回测赚钱不代表未来赚钱。量化给你的不是「保证」,而是「纪律」和「可验证」。把期望放低,把它当成一门手艺去学,反而更容易有收获。
Q3:我不会代码,用现成的量化平台可以吗?
可以,也是一种选择。现在有很多图形化、拖拽式的量化平台,不用写代码也能搭策略。但我的建议是:如果真想长期做,多少学点 Python,因为平台的限制终究比较多,会写代码你才真正自由。
Q4:做量化需要多少钱才能开始?
不需要很多。初期完全可以先用模拟盘和回测练手,一分钱不用花。等你对策略有信心了、理解了风险,再考虑用很小一笔资金去实盘验证。先学会不亏,再谈赚钱。
Q5:今天这个双均线策略靠谱吗?
它最大的价值是「教学」,不是「赚钱」。双均线是最经典、最基础的趋势策略,用来入门理解「规则→信号→回测」的完整流程非常合适,但别指望它长期稳定盈利。把它当成你量化的第一个台阶,而不是终点。
更多量化干货、策略复盘和实操资料,请搜索「道道量化」,或访问官网看看。
本文由「道道量化·1848」原创,作者:道道,仅供学习参考,不构成投资建议。市场有风险,投资需谨慎。欢迎转载,请保留原文并注明出处。
【全网发布】本文同步发布于:雪球、知乎、百家号、头条、公众号、东方财富等,品牌统一:道道量化·1848 | 官网 www.1848.cn


评论0