Stock_Analysis_For_Quant / 回测审计

一条收益曲线能不能信:先过 12 项检查,再看它属于哪一级

仓库里有大量结果图:组合 notebook 算净值、指标 notebook 画叠加图、预测 notebook 画拟合线。但没有一处说明这些图是怎么算出来的——没有成本假设、没有样本外、没有参数敏感性,也没有一行文字交代复权方式与信号成交时点。这不是这个仓库独有的问题,而是绝大多数示例代码的共同缺口。

所以这一页不给结论,只给尺子:12 项检查表告诉你每一项怎么查、查不到时该得出什么结论;四级分级告诉你这条曲线目前只到哪一档;最后一节列出 Stock_Analysis_For_Quant 里那些能直接查证的失败事实(失效链接、停更、无依赖清单、超大 notebook),它们本身就是「能不能复用」的判断依据。

12 项检查四级可信度核验提交 df4bd3c58d71本站未运行该仓库

先看这条曲线属于哪一级

仅能运行文件能跑出图,但环境、数据、口径都没记录
可复现锁定 commit + 记录版本与数据日期,别人能复算出同一张图
初步可信补齐成本、成交假设与样本外,结果不再依赖单次参数
尚未验证检查项有明确缺口且缺口会影响结论,不能当证据用
回测可信度四级(本站整理的研究口径,非官方标准);示意非官方图表。分级依据是本页的 12 项检查表与仓库可核验的维护事实。
Checklist

12 项检查:每一项都写清「怎么查」与「查不到时怎么判」

下表按「先查什么」的顺序排列。前四项在别的语言里也一样通用,与 Stock_Analysis_For_Quant 用哪种工具无关。

先说清楚这套检查表是干什么用的:它不负责判断「策略好不好」,只负责判断「这条曲线能不能作为证据被引用」。在 Stock_Analysis_For_Quant 这类示例集合里,曲线往往是顺手画出来的中间产物,作者并没有打算让它承担绩效证明的责任——所以你会看到大量漂亮的结果图,却没有一行成本或样本外说明。

检查项怎么查查不到时的结论适用场景
1 未来函数在 notebook 里搜 shift(-、iloc[-1]、.max() 与 .min() 在时间轴上的用法,看信号是否用到了当日或未来的收盘价无法排除未来函数 → 这条曲线的收益不可采信,只能当绘图练习所有含信号与回测的 notebook
2 幸存者偏差看标的清单是「今天还在上市的股票」还是「当时存在的股票」;主题组合 notebook 尤其要查清单来自当前成分股 → 收益偏高,且无法事后修正主题组合、行业组合、指数成分类示例
3 复权方式搜 Adj Close 与 auto_adjust,或看是否显式调用了复权参数;R 侧看 Ad() 与 adjustOHLC复权口径不明 → 分红与拆股会污染收益与均线信号跨年度、含分红的标的
4 信号日与成交日看信号生成后是否 shift(1) 再计算收益;没有这一行通常意味着当日收盘信号当日成交同日成交 = 隐性未来函数,尤其在使用收盘价信号时所有均线、动量、突破类示例
5 T+1看是否存在「当日买当日卖」的路径;A 股场景下这是硬约束未建模 T+1 → 换手率与收益都被高估A 股改造后的策略(见 A 股适配页)
6 涨跌停不可成交看是否只在「当日可交易」的样本上下单;涨停买入、跌停卖出的成交假设必须显式排除未过滤 → 收益曲线里含着永远无法成交的订单A 股与流动性差的小市值标的
7 交易成本搜 commission、fee、slippage、cost;找不到就是零成本假设零成本 → 高换手策略的收益几乎全部由成本假设贡献所有含调仓的示例
8 流动性看成交额与持仓规模是否可比;主题组合里的小盘股尤其要查未考虑流动性 → 大资金无法按曲线上的价格成交组合类、小市值类示例
9 样本外看是否把数据切成训练段与留出段;只有一条全样本曲线的就是没有无样本外 → 参数是在同一段数据上挑出来的,过拟合无法排除含参数寻优、机器学习、预测类示例
10 walk-forward看是否有滚动窗口重估参数;一次性在全样本上调参得到的参数不算无滚动 → 无法判断策略在参数漂移下的稳定性时间序列预测、GARCH 家族、滚动回归
11 参数敏感性把均线周期、阈值各改一档再跑,看结论是否翻转未做敏感性 → 结论可能只对一组特定参数成立所有带可调参数的示例
12 基准比较看是否与买入持有或指数对比;只看绝对收益的图无法判断是否有超额缺基准 → 牛市里的正收益没有信息量组合与策略类示例
用法:不必 12 项全做。真实场景里更有效的做法是「先挑 3 项最可能出问题的」——对 Stock_Analysis_For_Quant 的示例,优先查第 1、4、7 项(未来函数、信号与成交日、交易成本),因为这三项在仓库里系统性地缺失。查完再决定这条曲线能不能引用。以官方仓库当前代码为准。
Method

Notebook 审计四步:不用跑代码也能查出大部分问题

审计的要点是「读」而不是「跑」。下面四条命令在 Windows 下可直接在仓库目录里执行,用来把可疑文件筛出来。

  1. 先筛数据结构,确认时间轴方向

    命令:findstr /s /i /n "sort_values" *.ipynb。怎么做:确认所有计算前样本都按日期升序排好。预期输出:命中若干行;若某个文件算完了才排序,或根本没出现排序,把它标为待查。

  2. 搜未来函数特征串

    命令:findstr /s /i /n "shift(-" *.ipynb 与 findstr /s /i /n "iloc[-1]" *.ipynb。预期输出:每命中一处都要人工确认它取的是「上一根」还是「下一根」K 线。命中的文件优先审。

  3. 搜训练与验证的切分方式

    命令:findstr /s /i /n "train_test_split" *.ipynb。怎么做:看到这个函数就要看它有没有传 shuffle=False;时间序列上的随机打乱等于把未来数据混进训练集。预期输出:命中行加上下一行参数,逐个记录。

  4. 搜成本与成交假设

    命令:findstr /s /i /n "commission slippage fee cost" *.ipynb。预期输出:如果命中为 0,说明这批示例基本都是零成本假设——把「零成本」写进你的审计记录,而不是默认它已经考虑过。

未来函数特征出现形式为什么危险怎么确认
负向 shiftdf['close'].shift(-1)把下一期价格当成当期已知信息看它是否被用于生成信号或收益
全样本统计用整段数据的均值与标准差做标准化训练段用到了训练段之后的信息看标准化是在切分前还是切分后做的
随机切分train_test_split 未关闭 shuffle时间序列被随机打乱,训练集含未来样本看函数参数
当日收盘成交信号与成交共用同一根 K 线实盘无法在收盘价上同时看到信号并成交找信号后是否有 shift(1)
用未来做填充bfill 或插值回填缺失值缺失值被未来数据填补搜 bfill、interpolate
参数在测试段挑多次调参后只报告挑中的那一次测试段事实上变成了训练段看是否有独立的样本外段落
为什么这四步用「搜」而不是「跑」:Stock_Analysis_For_Quant 没有依赖清单,逐个把 575 个 notebook 跑起来本身就是一个项目;而上面这些问题全部可以在文本层面查出来。判断顺序建议是「先搜特征串定范围 → 再精读命中文件 → 最后才动手跑」,这样一次审计能覆盖几十个文件,而不是卡在第一个跑不通的 notebook 上。命令中的 *.ipynb 可按需换成 *.R,R 侧的同类特征串是 lead(、lag( 的符号方向与 fill(..., .direction = "up")。以官方仓库当前代码为准。
Levels

四级可信度:你现在拿到的这条曲线属于哪一级

分级的目的不是评判谁,而是统一口径:同一份研究记录,三个人读出来的结论应该一致。这套分级是本站整理的研究口径,不是官方标准。

仅能运行

文件能在你的环境里跑出图,但环境版本、数据日期、复权方式、成本假设全部没有记录。仓库里的多数示例默认处于这一级——它证明了「这段代码可执行」,没有证明任何与收益有关的事。

可复现

锁定 commit、写明库版本与数据日期,别人按你的记录能复算出同一张图。这一步靠记录就能达到,不需要额外建模,是性价比高的一级:先把「结果可重放」做出来。

初步可信

在可复现的基础上补齐成交假设、交易成本、样本外与基准比较。做到这一级,结论才有资格被引用;缺任何一项,收益数字都可能是建模方式带来的。

尚未验证

检查项存在明确缺口,且缺口会影响结论方向(例如用全样本挑参数)。这一级不是「结果可疑」,而是「当前状态不支持任何结论」——补上缺口就能升级。

四级的顺序是刻意设计的:先解决「能不能重放」,再解决「结论站不站得住」。很多人在第一级就急着判断策略好坏,结果把所有缺口都留给读者去猜。先补齐记录,再补样本外与成本,判断自然就有依据了。

落地项具体做法要记录什么注意点
时间切分按时间顺序切成训练段与留出段,绝不随机打乱两段的起止日期与样本量切分点一旦确定就不能因为结果不好而改
单次样本外训练段定参数,留出段只跑一次留出段的结果与置信区间留出段只能用一次,否则它就变成了训练段
walk-forward滚动窗口:用前 N 期定参数,后 M 期做检验,窗口逐步前移窗口长度、步长、每一折的结果分布看结果分布而不是平均值;方差大说明参数不稳
参数敏感性把关键参数各调 2–3 档,绘制参数-绩效曲面参数网格与对应的评价指标只报告参数网格里的单点结果属于选择性披露
成本压力测试把成本按 1×、2×、3× 三档重跑成本倍数与结果变化成本敏感的策略在实盘上会被吃掉
基准对照同期买入持有 + 一个公开指数基准的收益与风险指标没有基准的绝对收益不构成证据
关于「未实测」:本站没有在本机运行 Stock_Analysis_For_Quant 的任何 notebook(仓库不含依赖清单,体积约 306 MiB)。因此上面这些检查项都以「怎么查、要记什么」的形式给出,凡涉及具体数值的结论,都需要你在自己的环境里跑过之后才能下。同理,本页也不会给出任何示例的历史绩效数字——不是不便展示,而是缺少成本与样本外记录时,那些数字本身不构成证据。
Verifiable failures

Stock_Analysis_For_Quant 里那些能直接查证的失败事实

下面每一条读数都来自固定提交 df4bd3c58d71 与 2026-09-30 的仓库元数据或实测 HTTP 状态,不是评价,是事实。它们决定了这份资源「能抄多少、能信多少」。

事实读数意味着什么你怎么复核
没有版本发布无 Release、无 Tag,只有 master 分支无法锁版本复现,只能锁 commit;也无法判断「我用的这个版本」仓库 Releases 页与 Tags 页均为空
没有依赖清单全树检索无 requirements.txt、pyproject.toml、setup.py、Pipfile环境要靠自己反推;同一 notebook 在不同时间可能装到不同版本的库在仓库根目录搜这些文件名
没有 CI无 .github/、无 Makefile、无 Dockerfile没有任何自动检查,文件改动不会被测试拦住看仓库根目录与 Actions 页
续篇式文件74 个文件名带 _Part(如 R_Forecast_SMA_Part2.R、Stock_Linear_Regression_2.xlsx)同一主题可能有两三个版本,且没有说明哪个取代哪个按文件名过滤 _Part
超大 notebook9 个文件超过 5 MiB,最大 Gold_Portfolio.ipynb 约 24.3 MiB输出图被嵌进文件,打开慢、diff 无意义、审计时很难逐格核对看文件大小列
README 里的失效链接Power BI 目录 README 唯一的烛台插件链接(Office 商店旧地址)实测返回 HTTP 400官方文档给出的唯一 Power BI 烛台安装路径已不可用直接点该链接
上游文档站失效技术指标 notebook 引用的 ta-lib Python 封装文档站实测返回 HTTP 404指标参数语义需要改查项目自身的 GitHub 仓库直接打开该地址
承诺未兑现目录 README 写着 “Will Add more indicators”,自 2025-05-04 起无新提交不要把清单当成「即将补全」的计划表看 README 与提交时间线
单点维护贡献者 1 人(2,668 次提交),末次提交 2025-05-04,提交信息多为 “Add files via upload”issue 响应不保证;文件是网页上传的,缺少正常的代码评审痕迹看 contributors 页与提交列表
另外两类要区分清楚,别误判成失败:① Power BI、Tableau、Mathworks 官网对本机抓取返回 HTTP 403,这是反爬拦截而不是链接失效,浏览器可正常打开;② 官方 README 的 Description 段把 Tableau 列了两次(Excel、Tableau、Power BI、Matlab、Python、R、and Tableau),属于文案顺手写错,不影响文件本身。分清「失效」与「拦爬」,是为了避免把可用资源误判为不可用。
Report structure

一次「有说服力的失败」应该记录什么

本站不提供任何收益数字,也建议你不要只贴一条向上的曲线。真正能建立可信度的是记录结构:把下面这些字段写全,失败结论同样有信息量,别人也能接着往下查。

字段要写成什么不写会怎样适用场景
来源与版本文件路径 + 固定 commit + 你在哪个工具里打开(Python / R / Excel / Power BI / Tableau)别人无法定位到你看到的那个版本所有复现记录
数据口径数据源、标的清单、时间区间、频率、复权方式同一个指标会因口径不同而出现差异所有含收益计算的记录
环境语言/软件版本与关键库版本(本仓库要求自己装,这一步无法省略)「我这跑得通」无法被复现Notebook 与 R 脚本
执行命令实际敲的那一行,而不是「运行该文件」路径、参数、工作目录的差异无法排除所有可执行文件
原始输出报错原文或图表文件,不要把输出改写成结论报错被转述后特征消失,无法搜索失败案例
失败点与假设在第几步失败、你当时假设了什么、后来证实是什么别人会重复踩同一个坑失败案例
结论边界明确写「本次未通过哪几项检查」,并对应上面的 12 项编号读者会默认这条曲线已经过审计所有结果记录
改动记录你为了跑通改动了哪些单元格、加了哪些库、跳过了哪些段落「能跑通」与「原样能跑通」是两件事,混在一起会让别人误判仓库可用性Stock_Analysis_For_Quant 缺少依赖清单,改代码几乎是必然的
文件清单看过哪些文件、跳过了哪些、跳过的原因(依赖太重、体量太大、主题不相关)读者会以为你覆盖了全部示例,从而高估结论的代表性仓库有 1,221 个文件,任何一次审计都只能是抽样
为什么强调结构而不是数字:Stock_Analysis_For_Quant 的示例本身没有提供成本与样本外信息,你照抄它的输出等于继承了同样的缺口。把记录结构写全,即使结论是「这条曲线暂不可用」,这份记录也仍然可以被引用;反过来,只贴一张向上的曲线,没有任何审计字段,它就无法进入任何严肃的讨论。以上判断是本站在官方资料之外补的实践口径。
两条容易忽略的记录习惯:① 记下你为了跑通改了哪几行——在缺少依赖清单的仓库里,改动是常态,但「我改了什么」往往比「我跑了什么」更能说明结论适用范围;② 记下你跳过了哪些文件以及跳过的理由,因为一次审计通常只覆盖少量文件,如果不写清楚抽样范围,读者会把个别结论当成整仓结论。这两条都不需要额外工具,只需要在写作时多写三行。
Route

想跳过环境搭建直接做审计,可以怎么走

审计本身不需要跑仓库原文件——很多时候换个环境把同一口径重算一遍,反而更容易发现问题。这一节说明技能侧能覆盖到什么程度。

审计动作本仓库里的做法本机技能侧的做法边界
取数并核对口径Python 走 yfinance,R 走 quantmod,标的是美股 ticker用中文数据源技能取同一段数据(如 akshare-finance),口径与数据源都换了一套两套数据的复权与节假日处理不同,数字不会完全相同
重算风险指标Excel 侧 41 个比率工作簿、R 侧 33 个比率脚本、Python 侧 45 个绘图 notebook用 quant-analyst 重算 VaR、Sharpe、最大回撤与组合权重该技能文档面向研究用途,使用前会先确认执行环境、数据源、目标市场与用途
补样本外与 walk-forward仓库里没有现成实现由 quant-analyst 给出切分与滚动窗口的实现骨架骨架仍需你自己在真实数据上跑,技能不替你下结论
做参数敏感性仓库里没有同上,可以生成参数网格与结果表计算量取决于网格大小,注意你自己的机器开销
图表复核图表是各 notebook 内嵌输出用 chart-image 输出同一指标的静态图做并排比对静态图不能替代交互式仪表板(见仪表板与许可页)
结论口径仓库 README 的免责声明写明「不是投资建议、不要用于实盘」技能侧同样标注为研究用途、不构成投资建议两边都不提供实盘执行能力

先查口径,再查代码

同一指标在不同工具里算出的差异,八成来自口径而不是代码错误。遇到数字对不上时,先按跨语言对照页把复权、年化因子、无风险利率、样本起止四项对齐,再回头怀疑实现。

先查成本,再查收益

零成本假设是高换手策略收益的主要来源。把成本按 1×、2×、3× 三档各跑一次,比反复微调信号参数更能判断策略是否站得住。

先写记录,再下结论

把来源、版本、口径、命令、原始输出先记全,结论自然会被约束在证据范围内。这也是本站所有页面只给检查项、不给收益数字的原因。

FAQ

关于回测审计的常见问题

本页的检查项与分级是本站整理的研究口径;仓库事实按固定提交 df4bd3c58d71 与 2026-09-30 的实测结果核验,请以官方仓库当前状态为准。

未来函数到底怎么判定?有没有一键检查的办法?

没有一键办法,因为「是不是未来函数」取决于语义而不是语法:shift(-1) 用在生成信号上就是未来函数,用在构造标签上则是有意为之。可行的做法是先按特征串把候选文件筛出来(负向 shift、全样本标准化、随机切分、bfill 回填),再逐个人工确认它取用的是不是「当时还不可能知道」的信息。本站给出的是筛选清单与判定口径,不是自动判定器。

为什么我按示例跑出来的收益和 README 里的图不一样?

先别怀疑代码,先核对四项:复权方式(是否用了调整后收盘价)、样本区间与频率(日频还是月频)、年化因子(252 还是 365)、无风险利率从哪来。这四项在 Stock_Analysis_For_Quant 里没有统一约定,不同目录的写法并不一致。前三项对齐之后数字仍差很多,再去查信号与成交时点的处理。以官方仓库当前代码为准,本站未在本机运行过该仓库。

样本内和样本外应该怎么切?

按时间顺序切,不要随机打乱。常见做法是前 70%–80% 做训练段、剩余做留出段,并且留出段只用一次——反复用留出段调参,它就事实上变成了训练段。如果数据量允许,用 walk-forward 滚动窗口比单次切分更能暴露参数漂移。具体比例取决于你的样本长度与调参空间,没有通用数值,以你的研究设计为准。

参数敏感性要做到什么程度才够?

至少要能回答「把关键参数各调 2–3 档,结论的方向会不会翻转」。只报告参数网格里的单点结果属于选择性披露;把参数网格与对应指标一起给出来,读者才能判断策略是稳健还是恰好踩中点。如果参数稍有偏移就由正转负,那么这条曲线即使样本外表现不错,也不足以作为证据。

Power BI 的烛台图链接打不开,是仓库坏了还是我网络问题?

两者都不是。Power BI 目录 README 提供的那个烛台插件地址实测返回 HTTP 400,属于官方文档里的失效链接。替代路径有两条:用当前版本 Power BI 内置的 K 线视觉对象自行搭图,或者先用 Python 出图再把静态图片嵌进报表。相关边界见仪表板与许可页。

我可以直接引用仓库里某条曲线的收益数字吗?

不建议。按本页 12 项检查,这个仓库的示例在「交易成本、样本外、参数敏感性、基准比较」这几项上系统性缺失,因此多数结果停留在「仅能运行」这一级。引用前至少要补齐成交假设、成本与样本外;如果这几项无法补齐,正确做法是把它当作绘图与计算流程的参考,而不是当作绩效证据。本站不给任何收益数字,也不构成投资建议。

Excel 工作簿里没有代码,也能做同样的审计吗?

能做,而且更直观:把公式栏打开,逐个看关键单元格引用的是当期数据还是下一期数据、区间是写死的还是可调的、有没有把整段样本的均值与标准差算进同一列。Excel 侧的 41 个绩效比率工作簿与 26 个时间序列工作簿都属于这类结构;其中时间序列部分最容易出现「用整段历史校准再回看历史」的问题。审计 Excel 的额外难点是公式与结果混在一起,建议先只读公式不读结论,把口径确认完再看数字。

这个仓库还有维护吗?会不会影响审计结论?

按 2026-09-30 的仓库元数据:默认分支 master 的最后一次提交是 2025-05-04,贡献者只有一人,开放 issue 为 1 个,也就是已约 17 个月没有新提交;同时没有任何版本发布与依赖清单。对审计的影响是双重的:你无法锁定版本复现,也无法确认上游是否会修复已知问题。因此建议锁定 commit 并把你自己的环境与数据口径完整记录下来。

下一步:把口径换成 A 股再跑一遍审计

美股口径的示例里没有 T+1、涨跌停与印花税这些约束,直接照搬到 A 股会系统性高估可成交性。A 股适配页给出了复权、可成交性过滤、成本建模与交易日历对齐的六步改造清单。