投资理财

样本内外分割计算器

按比例或按日期把历史切成训练段与验证段,算出各段长度与覆盖区间,避免用同一段数据既调参又验证。

  • 免费免注册
  • 结果可分享链接
  • 浏览器本地计算
1000 期
总长度
686 期
训练段(样本内)
占 68.6%
294 期
验证段(样本外)
占 29.4%
20 期
间隔期合计
1 处分界各 20

切分时间轴

横条从左到右就是时间先后,宽度等于该段占总区间的比例。斜纹那段是间隔期,它不参与训练也不参与验证。

68.6%
29.4%
区段起止长度占比
训练段(样本内)第 1 ~ 686 期686 68.6%
间隔期第 687 ~ 706 期20 2%
验证段(样本外)第 707 ~ 1000 期294 29.4%
验证段占 29.4%,属于常见区间。训练段够长以支撑参数估计,验证段也留下了一段没被看过的数据。

间隔期在这里起什么作用

训练段与验证段之间空出 20 期不参与任何计算。这几期是隔离带,用来吸收滚动窗口指标的回看长度,让验证段开头第一个信号所依赖的数据完全落在训练段之外。

用之前先记住三件事

  • 时间序列不能随机打乱再切。打乱之后训练段里会混进验证段之后发生的行情,等于让模型提前看过答案。
  • 样本外只有第一次是真的样本外。用它反复调参、反复重切,它就悄悄变成了另一段样本内。
  • 切分只能降低自欺的概率,不能证明策略成立。样本外表现好,充其量是「这一次没被证伪」。

教育演示:本工具只做区间切分的算术,不读取任何行情数据,不评价策略优劣,也不发出任何买卖信号。 回测与样本外检验都基于历史数据,回测≠实盘,历史区间上的结论不构成对未来的承诺。本工具不构成投资建议。

链接带当前参数,发给别人打开就是同一份结果。

怎么用

5 步
  1. 先选口径:你手上是「多少根 K 线」就选按期数,是「从哪天到哪天」就选按日期。两种口径算出来的东西一样,只是日期口径会顺带把每段的起止日期标出来,对照行情软件更方便。
  2. 决定切两段还是三段:只想验证一次选两段:训练 + 验证。如果你打算在验证段上反复比较几套方案,那就选三段,多留一段最终测试——那一段留到最后只看一次。
  3. 定分割位置:按比例就拖动滑块,按日期就直接填训练段的最后一天。两种方式的结果是同一个东西,按日期的好处是能把切口对齐到某个你想避开的行情节点。
  4. 填间隔期:如果策略里有滚动窗口指标,把最长的那个回看长度填进间隔期。比如用到 60 期均线就填 60,让验证段第一个信号所依赖的数据完全落在训练段之外。
  5. 看时间轴和提示:横条的宽度就是占比,斜纹那段是隔离带。下方提示会告诉你验证段是不是太短、比例是不是失衡。复制结果链接发给别人,打开就是同一份切分。
深入讲解

这个工具只回答一个机械问题

一段历史,切在哪儿,前面归训练、后面归验证,各多长、各占多少。就这些。 它不读行情、不算收益、不评价策略好坏,纯粹是区间切分的算术。 之所以值得单独做成一个工具,是因为这道算术前面那个决定——到底要不要切—— 才是区分「一份能看的回测」和「一份自我安慰」的分水岭。

不切会发生什么?你在全部历史上把参数调到最优,回测曲线漂亮得不像话, 然后拿这套参数上实盘,表现和回测判若两人。原因不神秘:参数是照着这段历史的答案挑出来的, 它同时拟合了两样东西——真正会重复出现的规律,和只属于这段行情的偶然噪声。 前者能延续,后者不能,而回测结果不会告诉你自己吃到的是哪一份。 切分做的事情,就是硬生生留出一段「调参时看不到」的数据,让它替你回答这个问题。

三个参数怎么理解

分割位置决定训练段和验证段各多长。 按比例切简单直接,按日期切的好处是能把切口对齐到具体的行情节点上—— 比如你想让验证段完整覆盖某一轮牛熊,而不是从半山腰开始。 两种方式算出来是同一个东西,本工具在日期口径下会把每段的起止日期一并标出来,方便你回行情软件里对照。

间隔期是训练段末尾与验证段开头之间刻意空出来的一段,谁都不用。 它存在的唯一理由是堵住指标窗口造成的渗漏:验证段第一天的 60 期均线, 是由它前面 60 期数据算出来的,而那 60 期几乎全躺在训练段里。 不留间隔,训练段的信息就顺着指标窗口流进了验证段,而且这个流量在结果表格里完全看不出来。 填多少?取你所有回看窗口里最长的那一个;如果标签本身还要往后看若干期才兑现,再加上这个持有期。

切两段还是三段取决于你打算在验证段上做几次决策。 只跑一次、跑完就接受结果,两段够了;只要涉及在多套方案之间挑选,就该切三段, 把最终测试段锁到全部定稿之后再打开。第三段的价值全在「锁」这个字上, 跑完不满意又回去改,这一段也就跟着作废了。

几个把切分做废的典型错误

随机打乱再切。 教材里的标准做法在这里是错的。行情数据前后高度相关,一旦打散, 训练段里就混进了验证段之后发生的行情,模型等于提前看了答案,样本外成绩会好得不真实。 时间序列切分只有一条底线:训练段的每一个点,时间上都必须早于验证段的第一个点。

用全段数据做预处理。 拿整段历史算出的均值和标准差去做标准化、或者用全期分位数去分档, 那个均值里已经包含了验证段的信息。归一化、缺失值填充、异常值裁剪,凡是需要统计量的步骤, 统计量都只能从训练段里算,再原样套到验证段上。

股票池用今天的名单。 把已退市、已被剔除的标的从池子里抹掉,等于用现在才知道的信息去做过去的选择。 切分再规范也救不回来——这类问题出在数据准备阶段,比切在哪儿更靠前。

反复重切。 七三分不理想就试八二分,还不行就换个切点,直到某个切法结果好看为止。 这时被挑选的已经不是策略,而是切分方式本身;换来的漂亮结果, 和在同一段数据上反复调参没有本质区别。切法应当在看结果之前就定下来。

一次切分和滚动验证的关系

这里做的是一刀切:整段历史只切一次,验证段固定在最后。它的短板是结论依赖那一刀切在哪儿—— 如果验证段恰好只覆盖了一段单边行情,你测到的其实只是策略在一种市场状态下的表现。 滚动验证换了个思路:训练窗和验证窗一起往前挪,排出很多轮,让历史上不同阶段轮流当验证段。 代价是复杂度和计算量都上去了,而且轮次一多,「在多轮里挑一轮好看的」这种新的自欺方式又会冒出来。 先用一次切分把最基本的问题问清楚,再考虑要不要上滚动,通常是更省力的顺序。

口径与边界

本工具的期数是抽象单位,一期可以是一根日线、一个交易日,也可以是一周或一个月,取决于你自己的数据频率。 日期口径按自然日计算,不扣除周末与休市日——如果你要的是交易日口径,请先自行换算成期数再填。 各段长度按四舍五入取整,间隔期从总长度里先扣除;参数极端时工具会把每段至少保留一期并给出提示, 而不是切出一个长度为零的段。总期数、起止日期填不出有效数字时,工具直接告诉你参数不成立, 不会用一份看似合理的默认切分把问题掩盖过去。

验证段短于 30 期会触发样本不足提示。这个数不是什么统计定理,只是一条方便自查的粗线: 样本少到这个量级,一两笔交易的运气就能决定整段成绩。真正需要多少,取决于你的策略 在这段时间里能产生多少笔独立交易——8 笔和 800 笔是完全不同的证据强度。

风险提示:样本内外分割只是降低自欺概率的工程手段,不能证明任何策略有效。 回测≠实盘,样本外检验同样基于历史数据,历史区间上的结论不构成对未来的承诺, 实盘还会遇到滑点、冲击成本、流动性与规则变化等回测里不存在的问题。 本工具仅为回测方法教学演示,不发出任何买卖信号,不构成投资建议。

常见问题

6 条
为什么调参和验证必须用不同的数据?
因为在同一段数据上调出来的参数,一定会同时拟合两样东西:这段行情里真正重复出现的规律,以及只属于这段行情的偶然噪声。前者能延续到未来,后者不能。问题在于回测结果不会告诉你自己吃到的是哪一份——你在一段数据上调参数,再拿同一段数据看结果,看到的必然是好成绩,因为参数本来就是照着这段数据的答案挑出来的。这就像老师把考卷提前给你看,你考满分说明不了任何事。把历史切成两段之后,参数只在训练段里定,定完之后一次性拿到验证段上跑。验证段的数据在调参过程中从没被看到过,所以它的结果才有资格被当成一次真正的检验。要提醒的是,切分只能降低自欺的概率,它无法证明策略成立——验证段表现好,充其量是「这一次没被证伪」。
样本外为什么只能用一次?用它反复调参会怎样?
这是最常见、也最隐蔽的一种作弊。流程通常是这样:切好训练段和验证段,在训练段上调出参数 A,拿到验证段一跑不理想;回头改成参数 B,再到验证段跑一次;如此往复十几轮,终于挑出一套在验证段上很漂亮的参数。到这一步,验证段已经不是样本外了。因为你挑选参数的依据里,已经包含了验证段的表现——它实质上参与了调参,只是绕了一圈。这种泄漏之所以危险,是因为它全程不违反任何显式规则,你甚至会觉得自己很严谨。判断标准很简单:你看过这段数据的结果几次,就等于在它上面做了几次筛选。想避免,办法有两个:一是把每次在验证段上的试验都记下来,试了多少轮心里有数,轮数越多这段的成绩要打的折扣越大;二是干脆切出第三段,最终测试段锁起来,全部方案定稿之后只跑一次。
间隔期该留多久?不留会怎么样?
一个够用的经验做法是:取你策略里所有回看窗口中最长的那一个,把它填进间隔期。用到 60 期均线就留 60 期,用到 250 期波动率就留 250 期。如果还带了未来若干期才能兑现的标签(比如持有 20 期后的收益),那就再加上这个持有期。不留间隔期会发生什么?训练段的最后一天和验证段的第一天紧挨着,而验证段第一天的均线值,是由前面 60 期算出来的——这 60 期几乎全都躺在训练段里。于是训练段的信息顺着指标窗口渗进了验证段,验证段开头那一小段的成绩里混着已经被调过参的数据。这个泄漏量在长周期指标上相当可观,而在结果表格里完全看不出来。代价是间隔期这几期数据谁都不用,白白扔掉,所以窗口越长、总样本越短,这个取舍越难受——但扔掉一小段,好过让整份验证不可信。
验证段该占多大比例?七三分还是八二分?
没有标准答案,只有取舍。验证段留得多,样本外结论更稳,但训练段变短,参数估计的噪声变大,你可能因为训练数据不足而错杀一套本来可用的方法;验证段留得少,参数估计更扎实,可代价是检验的样本太薄,一两笔交易的运气就能把结论翻过来。比起纠结七三还是八二,更该问的是绝对量:验证段里能产生多少笔独立交易?一个日频策略在 300 天验证段里可能只交易 8 次,这 8 次的成绩说明不了什么;而一个高频策略在同样区间里能有几千笔,结论就扎实得多。本工具在验证段短于 30 期时会提示样本不足,那只是一条方便自查的粗线,真正的门槛取决于你的交易频率。区间跨度也要看:如果验证段恰好只覆盖了一段单边行情,比例再合理也只测到了一种市场状态。
什么时候需要切三段?两段不够用吗?
判断标准是你打算在验证段上做几次决策。如果整个流程里你只会看验证段一次——参数在训练段定死,拿过去跑完就接受结果,好就是好、不好就放弃——那两段完全够用。但只要你要在多个方案之间挑选,比如比较三套指标组合、或者试两种止损方式,情况就变了:挑选这个动作本身要消耗一段数据,你用验证段做了挑选,验证段就变成了广义的训练数据。这时正确的做法是三段:训练段定参数,验证段挑方案,最终测试段留到全部定稿后跑一次,作为最后一道验收。第三段有个隐含要求:它必须被真正锁住。如果最终测试段跑出来不理想,你回头再改方案、再跑一次,那这一段也就作废了,整套流程回到原点。实践中很多人栽在这一步——不是不懂,是舍不得。
时间序列为什么不能随机打乱再切?
因为随机打乱会把未来的数据混进训练段。机器学习教材里常见的做法是把样本随机打散再按比例分,那套做法的前提是样本之间相互独立;而行情数据是有先后顺序的,今天的价格和昨天高度相关,明天的波动率和今天也不独立。一旦打乱,训练段里就会出现验证段之后发生的行情,模型等于提前看过答案,样本外成绩会好得离谱,实盘立刻打回原形。同样的道理也解释了另外两个常见错误:一是用整段历史算出来的均值、标准差去做标准化,那个均值里包含了验证段的信息;二是把已经退市或被剔除的标的从股票池里抹掉,等于用今天才知道的名单去做过去的选择。时间序列的切分只有一条底线:训练段的每一个数据点,在时间上都必须早于验证段的第一个数据点。

本工具仅为测算演示,不构成投资建议。计算结果受输入假设影响,实际情况请以官方规定与金融机构公布为准。

回到计算器