动手之前:环境和数据从哪来
- 说得出起步需要的三样东西各自解决什么问题,以及为什么真正会拖垮你的是数据那一格而不是框架那一格
- 用「覆盖范围、复权口径、公司行为、退市样本」四条维度去判断一个行情数据源够不够你用,并知道免费与付费之间差的到底是什么
- 知道挑回测框架时第一件该看的事是它有没有把「替你做的假设」写出来,而不是比谁功能多
你搜了一圈「量化入门」,收藏夹里躺了七八篇教程。打开第一篇,前四十行是安装命令;打开第二篇,安装命令不一样;打开第三篇,作者用的是另一个框架,前四十行还是安装命令。
你照着敲了一遍,报错。换一篇,又报错。折腾到第三个晚上,环境总算起来了,你打开编辑器,准备写第一行策略——然后发现自己手上没有数据。
这一篇要做的事,是把你从「照着教程敲命令」的模式里拽出来。你缺的不是安装步骤,是一张插槽表:搞清楚这套东西一共有几个格子、每个格子是干什么用的、每个格子里的东西按什么标准挑。有了这张表,你看任何一篇教程都能立刻分辨出「他在填哪一格」,也就不会再被不同教程之间的差异搞晕——他们只是在同一个格子里放了不同的东西。
先说清楚这篇不做什么。我不给具体的安装步骤。 不是偷懒,是因为安装步骤是这套知识里保质期最短的部分:命令会变、依赖会变、你的操作系统和别人的也不一样,我在这儿写死的东西下个月就可能把你带沟里。所以这一篇只讲结构——哪几类东西、各自解决什么问题、选的时候看什么。具体怎么装,永远以你要用的那个项目的官方文档、你手上那个版本为准。
还有一层边界。数据里那些会让回测结果整个作废的坑,归 行情数据里那些会让你回测结果全错的坑;拿到一份数据之后该跑哪几项体检,归 拿到一份数据,先跑哪几项自查。本篇只管「从哪来、怎么选」,不管「坑在哪、怎么查」。
一共就三个插槽
先打个比方
你要在家开火做饭,需要的东西可以分成三堆。
第一堆是厨房本身:灶、锅、水电。它不参与做菜,但它决定了你能不能开始,以及三个月后你回来还能不能原样开始——如果这期间燃气改了接口、锅烧穿了,你得重新折腾一遍。
第二堆是食材。这一堆最容易被当成「随便买点就行」,但真正决定这顿饭是什么水平的就是它。同样一句「买排骨」,不同摊位给你的东西差别很大,而且有些差别你炒完才尝得出来。
第三堆是菜谱和火候的规矩:这道菜先下什么后下什么、多少度、几分钟。你可能觉得这堆最难,因为它看起来最专业。
三堆里,新手最怕第三堆,实际最容易翻车的是第二堆。买错食材,菜谱再对也救不回来;而食材的问题往往在最后一口才暴露。
这三堆对应到你手上是什么
搬到量化上,三个插槽是:
- 一个能跑起来、并且以后还能原样跑起来的 Python 环境——对应厨房
- 一份历史行情数据——对应食材
- 一个回测框架——对应菜谱和火候的规矩
回测这个词如果你还不太熟:它指的是拿历史行情把一套交易规则重放一遍,算出「如果当初真按这套规则做,账户会变成什么样」。它不是预测未来,是复盘过去。这件事本身在算什么、替你做了哪些主观决定,回测到底在算什么 拆得很细,这里只把它当成插槽三的名字用。
你会写代码,所以第一格对你来说是熟悉的活儿,第三格看起来最唬人。但真正会让你白干几个月的,是第二格。 原因很实在:环境不对,程序会报错,你立刻就知道了;框架不对,你换一个就是了;而数据不对,程序一声不吭,照样跑出一条曲线给你看,还挺好看。
这就是我要把数据那一节写得最长的理由。
插槽一:环境——目标不是「装上」,是「一年后还能原样起来」
先打个比方
想象一个被三个人共用的厨房。你放了一瓶生抽在台面上,室友觉得占地方,换成了他那瓶。第二天你按自己的量放调料,咸淡全变了——你什么都没改,但你的「参照系」被人动了。
一台机器上的 Python 环境就是这么个台面。你装完 A 项目,过两个月装 B 项目,B 需要某个库的新版本,一装,A 就跑不起来了。你根本不会意识到发生了什么,因为 A 的代码你一个字没动。
所以隔离不是洁癖,是让每个项目有自己的台面。虚拟环境、conda 环境、容器,解决的都是同一件事,只是隔离的粒度不同:前两个隔的是 Python 包,后一个连操作系统层面的依赖一起隔了。
这一格要满足的三个条件
第一,版本对得上下限。 每个项目都会声明自己能跑在什么版本以上。以我读的这份 freqtrade 文档快照为例,它的安装页把要求写得很明确:需要 Python 3.11 或更高、需要 pip 和 git、推荐用虚拟环境,而且特意提醒要用 64 位版本的 Python,理由是 32 位版本有严重的内存限制,会拖累回测和参数搜索。这些是文档写下的门槛,你手上那个版本要求多少,以它自己的说明为准。
第二,隔离方式选一个,然后一直用它。 虚拟环境、conda、Docker 都能达成隔离,你不需要在这上面纠结哪个更优雅。判断标准很土:哪种方式你三个月后还愿意用。这里有个具体线索——同一份 freqtrade 文档对 Windows 用户的建议是强烈推荐用 Docker,或者退一步用 WSL 走 Linux 那套步骤;对 ARM64 机器(比如某些 Mac 和一些云主机)的建议也是用 Docker,因为原生安装虽然做得到但当时不在支持范围内。而 qlib 的安装文档则直接写着推荐在 Linux 下使用,并建议用 conda 系的工具来搭环境。
这两条建议放在一起看,你能读出一个更通用的规律:当一个项目的文档专门为某个平台写了「建议绕道」的话,那通常是踩过的坑的结晶,别硬扛。 你在自己不熟的平台上原生安装省下来的那点时间,会在后面某个依赖编译失败的凌晨还回去。
第三,能复现。 这一条最容易被跳过,也是最后最疼的。你需要有个东西能回答「我当时到底装了哪些包、什么版本」——不管是锁文件、导出的依赖清单,还是一个镜像。为什么重要,看下一节你就明白了:回测结果是环境、数据、代码三者的函数,任何一项说不清,结果就没法解释。
顺带说一件容易被忽略的事:环境不只是软件包。同一份文档里有一条警告是关于系统时钟的——运行机器人的机器时钟必须准确、要定期和时间服务器同步,否则和交易所通信会出问题。这条提醒的价值不在于时钟本身,而在于它告诉你:「环境」这个词涵盖的范围,比你以为的宽。
一句话收尾这一格
这一格的成功标准不是「装上了」,是**「我能说清我装了什么,而且能再装一遍」**。做到这一条,这一格就算过了,别在上面耗超过一天。
插槽二:数据——决定你结论对不对的,是这一格
先打个比方
回到菜市场。你要买排骨,两个摊位都写着排骨,价格差一倍。
便宜那家的排骨看着也没什么问题。你买回去炖了,味道确实差点,但你说不上来差在哪。真正的差别在你看不见的地方:贵的那家每天进货、卖不完的当天处理掉;便宜那家把前几天没卖完的和今天新到的混在一起摆。你在摊位上看到的,是一堆长得一样的东西;你买到的,是两种完全不同的东西。
还有更隐蔽的一层。便宜那家有个习惯:卖相不好的品类干脆不摆。于是你在他的摊位上环视一圈,得出结论「这个市场的东西质量都不错」——你是在一个被筛选过的样本里做统计。
这对你意味着什么:先把三个投资概念说清楚
你会写代码,但下面这三个词是投资侧的,绕不过去,我一个个说明白。
第一个词:K 线和 OHLCV。 一根 K 线就是把一段时间内的价格压成的一条记录,通常包含五个数:开盘价、最高价、最低价、收盘价、成交量。它们的英文首字母连起来就是 OHLCV,你在几乎所有行情接口的文档里都会看到这个词。一根日线代表一天,一根分钟线代表一分钟。你要下载的历史数据,绝大多数时候就是一大堆这样的记录。
第二个词:除权除息。 公司分红派现或者送股拆股的时候,股价会在某一天出现一个跳变——比如每股分了一块钱现金,那天的价格就会相应往下调一块。这个下调不是跌,是账面上的重新计价,你手上的钱一分没少(现金到了你账户里)。但如果你的数据只是一串没处理过的价格,程序看到的就是「这天暴跌了」。一个按跌幅触发的规则,会在这里凭空产生一堆假信号。
第三个词:复权。 把上面这些人为的跳变抹平,让价格序列变得连续可比,这个处理就叫复权。它有不同的做法:可以把历史价格往下调、让最新价保持真实(前复权),也可以把最新价往上调、让最早的价格保持真实(后复权),还有别的口径。关键不在于哪种更好,而在于你必须知道你手上这份数据是哪一种,因为它们算出来的收益率不一样。
这一层在真实系统里长什么样,qlib 的文档说得非常直白。它明确写着:这份数据里的量价看起来和实际成交价格不一样,因为它们是复权过的;而且你会发现不同数据源复权出来的结果还不一样,因为各家复权的方式本来就不同。它自己的做法是把每只股票上市首个交易日的价格归一化成 1,同时额外保存一列还原因子,你用收盘价除以这个因子就能拿回原始价格。文档里还提到,关于复权口径这件事本身,项目里有过公开讨论。
我要你注意的不是这个具体做法,而是这段文字暴露的一个事实:一个认真的数据集,会告诉你它对价格做了什么手脚,并且给你一条路把手脚撤回去。 一份只甩给你一列「收盘价」、什么都不说明的数据,不是更干净,是更不可用——因为你连它做没做复权都不知道。
同一份文档里还有一条约定值得记住:在它的数据处理惯例里,股票停牌期间,开高低收、成交量、成交额和还原因子会被全部置为空值。这是个负责任的处理——停牌那天根本没有交易,硬填一个数进去反而是造假。但它同时意味着你的代码必须能处理空值,否则一路算下去会得到一堆莫名其妙的结果。
免费和付费,差的到底是哪四条
这是这一节的核心。很多人以为付费数据买的是「更准」,其实不完全是。更准确的说法是:付费买的是覆盖范围的确定性、口径的一致性,以及出问题时有人对你负责。 具体拆成四条,你拿这四条去问任何一个数据源,都能问出真东西。
第一条:覆盖范围。 包括三个子问题——覆盖哪些市场和品种、往前能取到哪一年、最细能到什么频率。免费源在这三项上往往是「够用但有天花板」:日线通常没问题,分钟线可能受限,早年的数据可能缺失,冷门品种可能压根没有。
第二条:复权口径。 有没有做复权、做的是哪一种、给不给你还原因子。这一条前面已经讲透了,只补一句判断技巧:能把还原因子单独给你一列的,比只给你一列复权价的更可信,因为前者意味着它自己心里有账。
第三条:公司行为处理得怎么样。 分红、送转、拆股是一类;更麻烦的是改名、换代码、合并、分立这类事件。一家公司换了代码之后,你的数据里到底是同一条连续的序列,还是断成了两截、前半截挂在一个再也搜不到的代码上?这类问题免费源处理得往往比较粗糙。
第四条:退市的样本还在不在。 这一条杀伤力最大,也最容易被完全忽略。如果你的数据只包含今天还在交易的标的,那么你做的任何一个「历史上买这一批会怎样」的统计,都自动排除了那些中途死掉的。这就是幸存者偏差,幸存者偏差:你的股票池里,输掉的那些早就不见了 专门讲了它在 A 股的具体形态。
这一条在真实项目里有非常明确的证据。qlib 仓库里有一个众包数据的子项目,它的说明开门见山地写着建立这件事的动因:像雅虎这样的公开数据源是有缺陷的,它可能缺少已退市股票的数据,也可能包含错误的数据,而这会把幸存者偏差引入训练过程。所以他们的做法是把多个数据源合并、互相交叉验证,一来补全历史记录,二来把异常数据识别出来做修正。
同一个仓库里雅虎数据采集器的说明写得更不客气。它在最开头用加粗的「注意」提醒:数据是从雅虎财经采集的,可能并不完美,如果你手上有高质量的数据集,建议用你自己的。它还专门列了两个异常数据的例子,并且承认:我们已经考虑了股价复权,但有些价格序列看起来仍然很不正常。
我特别想让你留意最后这半句的语气。这不是在推销,是在自曝。 一个项目愿意在自己的数据采集说明里写「我们处理过了,但还是有问题」,这份说明的可信度反而比那些什么都不提的高得多。所以我给你的第五条判断标准是:先读这个数据源承认了什么。承认得越具体,越值得用;一句问题都不提的,你要么是运气好,要么是还没发现。
还有一个开关,藏在下载命令里
前面说的退市样本问题,在数字货币这边有个特别干净的例子,因为它就是一个命令行开关。
freqtrade 的数据下载文档里提到,你可以用通配的方式一次性下载某个计价货币下的全部交易对。但紧接着有一句:如果你还想下载那些已经不再活跃(也就是已下架)的交易对,需要额外加上一个包含非活跃交易对的参数。
把这句话翻译成人话就是:默认情况下,你下到的是「今天还活着的那批」。 你不加那个开关,就已经在数据采集这一步给自己埋下了幸存者偏差,而整个过程没有任何警告。
这份文档还提到,如果不指定额外参数,下载命令默认会取最近一段时间的两个较短周期的数据——这个默认值是文档里写的,你手上那个版本取的是多少天、哪几个周期,以你自己跑出来的帮助信息为准。我要说的重点不是这个数字,而是:默认值是给你快速试跑用的,不是给你做正经研究用的。 拿默认下载的那点数据跑出来的成绩单,样本量根本不够说话。
顺带一提,这份文档还讲了它支持的几种存储格式,以及默认用哪一种。这件事听起来无聊,但当你的数据量涨到一定程度,读取速度会变成你迭代速度的瓶颈——你每改一次规则要等几分钟还是几秒,长期下来差别巨大。这一格值得你在起步时多花十分钟了解一下,而不是等到烦了才回头改。
数据源不止一个,这本身就是一种设计
还有一种思路值得你知道:不押注单一数据源。
Vibe-Trading 这个项目的说明里有一节专门讲它的数据源策略。它把二十多个行情源注册在一起(具体数量随版本变化,以你手上那版为准),你可以让它自动选源:先按标的所属市场挑一个合适的,如果这个源不可用,就沿着一条预先排好的链往下走。最有意思的是这条链的排序依据——按被封 IP 的风险排序,那些几乎不会封禁的公开源排在前面,需要密钥或者有速率限制的排在后面。它还按市场分别列出了各自的回退顺序,链条的末端统一是本地文件。
这个设计能给你两个启发。一是可用性和数据质量是两件事。 排在前面的不是「最准」的源,是「最不容易断」的源。你自己搭环境的时候也该分清:我这个源是拿来保证跑得起来的,还是拿来保证算得对的。二是接口要可换。 如果你的代码里到处硬编码着某一个数据源的调用方式,那么等它哪天限流、改接口、或者你发现它的复权有问题,你面临的就不是换个数据源,而是重写。
同一份说明的更新记录里还有一个细节我很喜欢:他们给数据加了个可选的本地缓存,默认关闭,而缓存有一条硬规则——绝不缓存截止到当天的区间,因为最后一根 K 线还在形成中。
这条规则背后是一个你迟早会撞上的坑:今天这根日线,在收盘之前是个会变的数。你上午十点把它存下来,那是个半成品;下午你的程序拿这个半成品去算指标,算出来的东西既不是历史也不是现在。「这根 K 线走完了吗」这个问题,值得你在写下第一行取数代码之前就想清楚。
这一格的落地动作
选数据源的时候,按顺序问这五句:覆盖到哪、复权是什么口径、公司行为怎么处理、退市的还在不在、它自己承认有什么问题。前四句问的是数据,第五句问的是给你数据的那个人。
然后做一件事:把你用的数据的来源和版本记下来,和结果放在一起。 现成数据集是有版本的——qlib 那份雅虎来源的现成数据就分了两个版本,截止时间不同,而它的公开基准示例绑定在其中一个版本上,文档还特意说明两个版本之间存在差异。这意味着什么?意味着「同一套代码、同一份仓库,换个数据版本,你复现不出别人的成绩单」,而且你会以为是自己写错了。
插槽三:回测框架——你要的是它的账本,不是它的循环
先打个比方
你和朋友一起吃饭 AA。谁掏的钱、各点了什么,这是记账;最后谁该给谁多少、零头怎么处理、有人中途走了那杯饮料算谁的,这是算账。
记账谁都会。算账难在规矩:那些说不清的边角情况,得有个一致的处理方式,而且大家都认。
回测框架的价值在算账那一半。「按 K 线循环、遇到信号就买卖」的那个循环,你半天就能写出来。真正难的是那些说不清的地方,程序必须给出一个答案,而这个答案会实打实地影响最终那条曲线。
说不清的地方到底有哪些
举几个你写完循环立刻就会遇到的问题:
信号是在这根 K 线上出现的,那我按什么价成交?开盘价?收盘价?中间某个价?
我想按某个价格买,可这个价格在这根 K 线的最高价和最低价之间——就算它在区间里,凭什么认为我一定能成交?成交多少?
止损价被击穿了,实际最低价比我的止损价还低,那我到底按止损价成交,还是按那个更低的价?
这根 K 线上,止损、止盈、离场信号同时满足了,先执行哪个?
这三件事听起来像抠细节,但它们决定的是同一套规则能跑出天差地别的两条曲线。手续费这类固定成本还算好办;难的是这些顺序和成交假设,你不明写,程序也会替你定一个。
滑点这个词你可能听过:你想按某个价成交,真成交时价格已经跑偏了那么一点,中间的差额就是滑点。它是这类假设里最出名的一个,但远不是唯一一个。
成熟框架长什么样:它把假设写出来了
我读的这份 freqtrade 文档里有一整节,标题直译过来就是**「回测所做的假设」**。它逐条列出了程序替你定下的规矩,我挑几条你能直接感受到分量的:
入场在开盘价发生,除非你自己写了定价逻辑;只要请求的价格落在这根 K 线的最高最低区间内,所有订单都按请求价成交——也就是不计滑点;离场信号触发的卖出,发生在下一根 K 线的开盘价上;止损恰好在止损价成交,哪怕最低价比它更低,但亏损会比止损价本身多出两倍手续费;同一根 K 线内,止损先于止盈被评估;判断止损时假定最低价先于最高价出现,也就是先保本金;如果同一根 K 线上多个信号同时触发,评估顺序是离场信号、止损、止盈、追踪止损。
这一节的最后,文档自己写了一句话,我认为是整节里最重要的一句:尽管有这些假设,回测试图尽可能地贴近真实交易,但回测永远不能替代先用模拟模式跑一遍;另外请记住,过去的结果不保证未来的成功。
同一份文档还有一节讲交易所的下单限额——每个品种都有最小下单量之类的规矩,回测会遵守这些限额,但它坦白承认:框架拿不到历史上的限额数据,只能用当前的限额去套历史价格,这在某些情况下会让最小可交易金额被算得虚高。
请你把注意力放在这两处的姿态上,而不是具体条款上。一个框架肯把「我替你做了什么假设」和「我这里有个已知的不准」白纸黑字写出来,这本身就是最强的质量信号。 反过来,一个只展示漂亮曲线、从不讨论自己边界的工具,你不知道它做了哪些假设,不代表它没做——只代表你不知道。
顺带说一句,这些假设也正是回测和实盘对不上的一大来源,回测好看实盘亏,差的到底是哪三件事 把其中三处机制级的差异拆得更细。
选框架看哪几条
第一条,也是最重要的一条:它有没有公开自己的假设,写得够不够细。 前面已经说透了。
第二条:账算得细不细。 手续费怎么扣、有没有考虑最小下单量、有没有区分挂单和吃单、能不能配置不同的成本结构。具体费率和参数默认值我一个都不给你,因为它们随交易所、随券商、随版本变,一律以你自己的账户和你手上那个版本为准,你要看的是框架支不支持你把真实成本填进去。
第三条:数据接口能不能换。 这一条和上一节呼应。框架和数据源绑得越死,你后面越被动。
第四条:它面向的市场和你的市场对不对口。 这一条最容易被忽略,而它可能直接决定你选错。拿本文用到的两个项目举例:freqtrade 是面向数字货币交易所的自动交易框架,围绕交易对、下单、实盘循环组织;qlib 则是一套面向量化研究的工具,重心在多标的的因子计算、机器学习流水线和实验管理上。这两个不是「哪个更强」的关系,是两类不同的东西。 你要做的事情长什么样,决定了你该往哪边看。
第五条:文档和社区。 你会遇到问题,遇到问题时能不能搜到别人踩过的坑,是个实打实的效率变量。
那自己写一个行不行
行,但你要清楚代价。
自己写回测循环最大的风险不是写错,是你会在毫无察觉的情况下做出一大堆没写下来的假设。上面列的那七八条,成熟框架用一整节文档交代清楚;你自己写的时候,每一条都会被你随手定掉——按收盘价成交吧、手续费先不管吧、止损就按止损价算吧——每一个「先这样吧」都在往对你有利的方向偏,因为人在图省事的时候,本能会选那个不用处理麻烦情况的分支。
如果你还是想自己写(这其实是理解这套东西最快的路),我建议至少做一件事:开一个文件,把你定下的每一条假设明写出来。 就照着上面那份清单的格式写。这个文件的价值,会在你半年后回头看自己那条漂亮曲线时体现出来。
还有半格:把「这次跑的是什么」记下来
三个插槽之外,还有半格东西,起步阶段几乎所有人都跳过,然后在一两个月后付出代价。
场景是这样的:你手上有五条回测曲线,其中一条明显比别的好。你想知道它是怎么来的——用的哪份数据?数据是哪天下的、哪个版本?代码是哪一版?参数填的什么?
答不上来。于是这条曲线对你毫无价值,因为你没法重跑它,也没法在它基础上继续改。
这件事在成熟的研究工具里是被当成一个正经组件来做的,qlib 的文档里就单独有一块讲实验记录与工作流。你起步时不需要上这么重的东西,一个文本文件就够,但必须有。每次跑完记四样:数据来源和取数日期、代码的版本、这次改了什么、结果的关键几个数。
顺便说,这也是前面反复强调「环境要能复现、数据版本要记下来」的最终落点:回测结果是环境、数据、代码三者共同的产物,其中任何一个说不清,那条曲线就只是一张图片。
一张选型对照卡
| 插槽 | 它解决什么问题 | 选的时候看什么 | 做到什么程度就够了 |
|---|---|---|---|
| 环境 | 让这套东西跑得起来,且以后还能原样起来 | 版本下限、隔离方式、能不能复现;文档对你的平台有没有「建议绕道」的提示 | 能说清装了什么,并且能再装一遍 |
| 数据 | 决定你算出来的东西对不对 | 覆盖范围、复权口径、公司行为、退市样本是否保留,以及它自己承认了什么问题 | 知道自己这份数据的四条各是什么状态,并把来源和版本记了下来 |
| 框架 | 把说不清的地方按一套一致的规矩算清楚 | 有没有公开假设、账算得细不细、数据接口能不能换、面向的市场对不对口 | 能读懂它替你做的假设,并且接受它们 |
| 半格:记录 | 让每一条曲线可以被解释和重跑 | 一个文本文件就够 | 每次跑完记:数据来源与日期、代码版本、改了什么、关键结果 |
一个反直觉的起步顺序
多数人的顺序是:挑框架 → 装环境 → 找数据 → 写规则。
我建议你倒过来一半:先弄到数据,先把数据看明白,再去挑框架。
理由有三层。其一,数据是唯一一个你换起来最贵的东西——框架可以换,环境可以重建,但你对数据口径的误判会污染你之前所有的结论。其二,你手上有什么数据,会反过来限定你能做什么类型的策略;先挑好框架再发现拿不到需要的数据,是很常见的返工。其三,最实际的一条:亲手把一份数据从下载到看懂走一遍,是理解这整套东西最快的路径,比读十篇框架教程都管用。
至于「先弄到数据之后该看哪几项」,那正是 拿到一份数据,先跑哪几项自查 的内容,我这里不越界。
最后提醒一句和技术无关但更重要的事:把环境和数据搭起来,离「能赚钱」还隔着十万八千里。 这套东西起步的技术门槛其实不高,真实的门槛在别的地方,散户做量化,真实门槛在哪几道 讲的四道门槛,没有一道是技术门槛。会写代码在这件事上是个不错的起点,但它带来的最大风险恰恰是:你会因为工程那部分做得顺,而误以为自己在投资那部分也做得顺。
本文讲的是搭建学习环境与选择数据来源的方法,不构成任何投资建议、买卖信号或收益承诺,也不推荐任何具体的数据服务商、交易平台、券商或工具;文中提到的开源项目仅作为「这个概念在真实系统里长什么样」的例子引用。所有关于项目行为、默认值、参数与文档措辞的描述,均来自我对指定本地源码与文档快照的阅读,不是我运行程序得到的实测结果,具体行为以你手上那个版本为准,且这类默认值随版本变动,请以你自己跑出的帮助信息与官方文档为准。回测结果不等于实盘结果,任何历史业绩都不预示未来收益。环境和数据搭得再规范,也只是让你的计算过程可信,不代表计算出来的结论是对的。完整风险提示见 免责声明。
小结
- 起步一共三个插槽:环境(让它跑起来且以后还能起来)、数据(决定算得对不对)、框架(把说不清的地方按一致的规矩算清楚),外加半格记录。
- 环境那一格的成功标准不是「装上了」,是「我能说清装了什么,并且能再装一遍」。 遇到文档专门为你的平台写了「建议绕道」的提示,别硬扛。别在这一格耗超过一天。
- 数据那一格最贵。 免费和付费的真实差别是四条:覆盖范围、复权口径、公司行为处理、退市样本是否保留。付费买的不是「更准」,是覆盖的确定性、口径的一致性和有人负责。
- 加第五条判断标准:先读这个数据源承认了什么。 肯写「我们处理过了但还是有异常」的,比什么都不提的可信得多。
- 注意那些藏在默认值里的偏差:默认下载的样本量通常只够快速试跑;默认下到的往往是「今天还活着的那批」,要拿到已下架的标的常常得显式加参数。
- 框架先看它有没有把假设写出来。 入场按什么价、订单算不算滑点、止损击穿了按哪个价、多个信号同时触发按什么顺序——成熟项目会用一整节文档交代,并坦白自己已知的不准。自己写不是不行,但你必须把每一条假设明写在一个文件里。
- 顺序建议倒过来一半:先弄到数据、先把数据看明白,再挑框架。 数据是唯一一个换起来最贵的东西。
一句话说完这篇:动手之前你要凑齐的是三样东西——一个自己说得清的干净台面、一份你知道它经过了什么处理的历史行情、一套愿意告诉你「我替你做了哪些决定」的算账工具;其中前后两样一两天就能搞定,中间那一样值得你花上十倍的时间,因为它出问题的时候,程序不会报错,只会给你一条好看的曲线。
本文为投资教育整理,关键数据与结论请结合下列权威来源验证。
- freqtrade 源码快照 b3404c9(2026-08-18):docs/installation.md 的 Requirements 与 Windows / ARM64 说明 ↗
- freqtrade 源码快照 b3404c9(2026-08-18):docs/data-download.md(默认下载范围、`--include-inactive-pairs`、数据格式一节) ↗
- freqtrade 源码快照 b3404c9(2026-08-18):docs/backtesting.md 的 Assumptions made by backtesting 与 Trading limits in backtesting 两节 ↗
- qlib 源码快照 79633dd(2026-07-23):docs/start/installation.rst、docs/component/data.rst(复权与 factor 列、停牌置 NaN 的约定) ↗
- qlib 源码快照 79633dd(2026-07-23):scripts/data_collector/yahoo/README.md、scripts/data_collector/crowd_source/README.md ↗
- Vibe-Trading 源码快照 3a752d5(2026-08-04):README_zh.md 的「数据源与智能 Fallback」一节及本地缓存相关更新记录 ↗