量化喵是独立第三方信息站,不是欧易(OKX)官方。注册按钮含邀请码 OK30001,我们可能因此获得推广服务费。 完整披露 →

欧易 · 量化实操

策略回测怎么做:新手用 ccxt 拉历史K线

很多人学完 API 下单,下一步要么直接把脚本接上真金,要么一头扎进模拟盘,一天天等着看结果。这两条路都绕开了中间最省时间的一步——回测。回测的意思很简单:拿过去已经发生的行情数据,把你的策略逻辑在这些数据上快进跑一遍,几分钟就能看完好几年的走势,而不是拿真实时间一天天耗。

这篇我们(量化喵编辑组)把回测这一步补上:回测和模拟盘到底差在哪、顺序该怎么走,用 ccxt 拉一段欧易(OKX)历史K线、配 pandas 写一个最小可行的双均线示例,再讲清回测里最容易踩的几个坑,以及回测报告该看哪几项、别只盯着最后那个收益数字。提前说清楚:文中的双均线示例只用来教流程,参数是示意值,不是调好能赚钱的策略,回测过了不等于实盘会赚。

回测和模拟盘不是一回事,顺序该怎么走

先把两个概念分开。回测(Backtest)用的是历史数据,把策略逻辑套进去从头跑到尾,优点是快——几年的行情几秒到几分钟就能跑完;缺点是它是「事后诸葛亮」,跑在一个已经知道结局的世界里。模拟盘(Demo Trading)用的是实时行情,策略按真实节奏一天天跟着走,优点是更贴近真实执行——挂单、成交、网络延迟都是真的;缺点是慢,验证一个思路可能要等上好几周。

两者不是二选一,是接力。先用回测快速筛掉明显不行的思路——如果一个策略连历史数据都跑不赢拿着不动,大概率也没必要往下走。回测过了,再去 模拟盘 按真实节奏走一遍,确认执行层面(挂单会不会卡、网络断了逻辑会不会乱)也没问题。两步都走完,才轮到用一笔亏了也不心疼的小钱试实盘。还没搞清楚量化到底是什么,可以先看 量化交易到底是什么 打个底。

最小可行回测:拉历史K线 + 双均线示例

回测不用多复杂的工具,两样东西就够上手:ccxt 负责拉交易所的历史数据,pandas 负责把数据整理成表格并计算。下面这段代码演示怎么从欧易拉一段 BTC/USDT 的日线历史行情——拉历史行情走的是公开数据接口,不需要 API Key:

import ccxt
import pandas as pd

# 拉历史行情是公开数据接口,不需要 API Key
okx = ccxt.okx()

# 拉 BTC/USDT 日线,最近 500 根(样本量仅为示意,自己按需调整)
ohlcv = okx.fetch_ohlcv('BTC/USDT', timeframe='1d', limit=500)

df = pd.DataFrame(ohlcv, columns=['ts', 'open', 'high', 'low', 'close', 'volume'])
df['ts'] = pd.to_datetime(df['ts'], unit='ms')
df.set_index('ts', inplace=True)

print(df.tail())

拿到数据后,用 pandas 算两条均线,写一个最基础的「双均线」信号:短期均线上穿长期均线,视为买入持有;下穿,视为空仓。这是教科书里最简单的一种思路,拿来演示回测的完整流程,参数(10、30)只是示意,没有经过任何认真调优,别直接拿去实盘:

# 双均线示意策略:短线上穿长线=持有,下穿=空仓
# 参数是示意值,不是"调好能赚钱"的参数,别直接抄去实盘
SHORT, LONG = 10, 30

df['ma_short'] = df['close'].rolling(SHORT).mean()
df['ma_long']  = df['close'].rolling(LONG).mean()

# 用"上一根"均线关系判断,避免未来函数
df['signal'] = 0
df.loc[df['ma_short'].shift(1) > df['ma_long'].shift(1), 'signal'] = 1   # 持有
df.loc[df['ma_short'].shift(1) <= df['ma_long'].shift(1), 'signal'] = 0  # 空仓

# 用"当根"涨跌幅乘以上一根定下的信号,粗略估算收益(未扣手续费/滑点,仅示意)
df['ret']      = df['close'].pct_change()
df['strategy'] = df['ret'] * df['signal'].shift(1)

print('示意累计收益(未扣费,仅供理解流程):', (1 + df['strategy'].fillna(0)).cumprod().iloc[-1])

跑完这段代码,你会得到一个粗糙的「示意收益率」——注意这里还没扣手续费和滑点,也没考虑资金费率、下单排队这些真实成本,数字只用来理解回测的计算流程,不能当成这个策略「能赚多少」的答案。如果你还没建过 API Key、不熟悉 ccxt 的基本用法,先看 API 量化入门 补一遍连接和下单的基础,回测阶段虽然不需要 Key,但后面接实盘迟早用得上。

风险提示:上面两段代码只用来教流程,不构成投资建议,回测结果不保证未来能赚钱,别照抄参数直接上实盘。拉历史行情用的是公开接口,不需要 API Key;之后要接自己账户做实时验证或实盘,建 Key 时也只勾「读取」权限,交易和提现权限留到真正准备下单那一步再开。

回测最容易踩的四个坑

回测能跑出漂亮的收益曲线,不代表策略真的可靠。以下四个坑,新手几乎都会踩一遍,提前知道能少走弯路。

过拟合:把参数调到历史完美,恰恰最危险

过拟合(overfitting)指反复调整参数,直到回测结果和这段历史数据严丝合缝。这时候的高收益曲线,很可能只是「记住」了这一段历史里的巧合,而不是找到了什么真实规律。这类参数换到没见过的新行情,通常最先失效——回测跑得越「完美」,反而越该多问一句:是不是调过头了。防它的办法是别把参数网格调得太细,跑完回测后再拿一段没参与调参的数据单独验证一遍(样本外测试),两段都过得去才算数。

手续费和滑点没算进去

很多新手写的回测只算价格差,没扣手续费,也没算滑点(挂单价和实际成交价之间的落差)。这两项对交易频率高的策略影响特别大——哪怕单笔手续费只有万分之几,交易上百次累积下来也会啃掉一大块收益。写回测时,至少按欧易实际的手续费率把每笔交易的成本扣进去,再保守估一个滑点值,算出来的数字才靠谱。

只测牛市段

选一段单边上涨的历史数据去回测,几乎任何「买了拿着」的策略都好看。但行情不会永远单边,回测的数据窗口至少要覆盖涨、跌、震荡这几种不同阶段,策略在震荡市和下跌市里的表现,往往比牛市里的数字更能说明问题。

未来函数:用了当时还不该知道的数据

未来函数(look-ahead bias)是最隐蔽也最容易犯的错——最常见的写法是用当根K线的收盘价,去决定这根K线开盘时该不该买卖。现实中收盘价要等这根K线走完才知道,回测代码却提前「看」到了它,算出来的收益率会被明显高估。前面那段示例代码里用 shift(1) 把信号往后错一格,只用「上一根走完的数据」做判断,就是在避开这个问题——判断只能用已经确定的历史数据,不能用当下这根还没走完的K线。

回测和模拟盘都走完,真准备好上小额实盘了?如果你还没有一个专门跑策略的账户,不妨单独开一个,和日常资金分开。用我们的邀请码 OK30001 注册欧易,手续费有减免,API 下的单同样适用。点这里注册欧易并开 API →

回测报告怎么看:别只盯终点

回测跑完,大部分人第一反应是看最后那个总收益率——这是最没用的一种看法。同样是「赚了 30%」,过程可能是一路平稳向上,也可能是先亏掉一半再拉回来,这两种策略你能不能拿得住,是完全不同的问题。看回测报告,至少要过这三项:

  • 收益曲线的形状。别只看终点,看整段走势是平滑上升,还是大起大落、中间坐了几次过山车才勉强打平。曲线的形状比终点数字更能说明这策略实际拿着是什么体验。
  • 最大回撤(Max Drawdown)。从曲线的最高点到之后的最低点,跌了多少。这是回测报告里最该重视的一项——它约等于「你在最惨的时候要扛住多少浮亏」。回撤太大,就算终点收益好看,大概率也拿不住。这块和 仓位、止损怎么写进代码 直接相关,值得一起看。
  • 胜率 × 盈亏比。胜率高不代表赚钱,还要看赢的时候平均赚多少、输的时候平均亏多少(盈亏比)。胜率 70% 但每次赢一点、亏很多,照样长期亏钱;胜率 40% 但赢的时候赚得多、亏的时候亏得少,反而可能是笔好账。两个数字要一起看,单看任何一个都会被误导。

回测过了不等于能赚,下一步去哪

回测再漂亮,也是在一个理想化的环境里跑出来的——没有真实的下单排队、没有网络延迟,也算不出你自己实际操作时会不会手抖、会不会临时改主意。回测过了,只说明这个思路值得往下走一步,不是终点。

下一步是去 模拟盘,把同一套逻辑按真实节奏跑一遍,看执行层面还有没有问题。模拟盘也顺了,再用一笔亏了也不心疼的小钱去实盘试水,而不是直接上大仓位。真上场之前,仓位上限、止损怎么写进代码 这些风控措施也得配齐——回测和模拟盘验证的是策略逻辑,风控守住的是你就算逻辑判断错了也不至于伤筋动骨。

最后一句话值得反复提醒自己:历史不代表未来。回测用的所有数据都已经发生过,它能告诉你的是「如果过去这样做会怎样」,没法告诉你「未来也会这样」。把回测当筛选工具,而不是预测未来的水晶球,这条路你会走得更稳。

常见问题

回测和模拟盘有什么区别,该先做哪个?

回测是拿历史行情数据快进跑策略逻辑,几分钟就能看完几年的数据,用来快速筛掉明显不行的思路;模拟盘是实时跟着当前盘口走,速度和真实交易一样、但用的是虚拟资金,更能反映真实的挂单和延迟。正常顺序是先回测筛选思路,思路过了再去模拟盘按真实节奏走一遍,最后才考虑小资金实盘。

什么是过拟合,为什么说它是回测最大的陷阱?

过拟合是指把参数反复调整,调到刚好和历史数据完美贴合的状态。这时候的高收益曲线,很可能只是「记住」了这段历史的巧合,而不是找到了真实规律。这类参数一旦换到没见过的新行情,通常最先失效,是回测里最危险也最容易被新手当成好消息的坑。

回测里的未来函数是什么意思?

未来函数指策略在做决策时,偷偷用到了当时还不可能拿到的数据——最常见的写法错误是用当根K线的收盘价,去决定这根K线开盘时该不该买卖。现实中收盘价要等这根K线走完才知道,回测代码却提前用上了它,结果收益率会被明显高估。避免的办法是决策只能用已经走完的、更早的K线数据。

回测收益曲线很好看,是不是就能直接上实盘了?

不建议。回测是理想化环境,没有真实的滑点、下单排队、网络延迟,也算不出你实际操作时的犹豫和手抖。回测过了只说明这个思路值得往下走,下一步应该去模拟盘按真实节奏跑一遍,确认执行层面也没问题,再考虑用一笔亏了也不心疼的小钱试水实盘。历史数据测出来的结果,不代表未来一定会重复。

手续费和滑点对回测结果影响有多大?

影响很大,尤其是交易频率高的策略。很多新手写的回测只算了买卖价差,没有扣手续费,也没有模拟滑点(下单价和成交价之间的差距),这样算出来的收益率往往比实际能拿到的高不少。哪怕只是按欧易实际的手续费率把每笔交易的成本扣进去,某些看着不错的高频策略,利润可能就被磨没了。

把回测补上,量化流程就完整了:先搞懂概念,再回测筛思路,去模拟盘验证执行,最后带着风控小资金上场。每一步都不跳,能少踩很多本可提前发现的坑。想挑一个不用写代码的策略类型,也可以打开 量化策略类型对照表 看看网格、DCA、跟单和自写脚本怎么选。

思路回测顺了,该准备账户了?

先把账户开好,回测和模拟盘都走完,再考虑小资金实盘。用邀请码注册的新账户,手续费有减免,API 下的单一样适用。

OK30001 用 OK30001 注册欧易 →

加密资产价格波动剧烈,合约与杠杆可能导致本金全部亏损。量化与自动化交易不保证盈利,回测结果不代表实盘表现,请只用你能承受损失的资金。