跳到正文

研究指南

股票因子研究

股票因子需要VWAP但数据没有:近似值会怎样改变回测

股票公式要求VWAP时,一份OHLC文件并不自动提供完整输入。先核对原字段、成交额与成交量单位,再给替代值独立实现名,之后比较因子、成员与两套账户账。代码成功运行不能证明原公式已经复现,更不能把一个代理版收益贴上论文业绩标签。

本指南从原始论文选择Alpha41,使用两条极小合成成交带,对比真实数量加权价格和作者自定典型价格代理。CoTrading公式工具仍为规划或待核实,没有测试真实供应商、模型或账户。所有成交与结果均用于机制验证,不提供现实收益证据。

先读公式再选替代字段

《101 Formulaic Alphas》原论文列出的Alpha41为高价乘低价再开平方,减VWAP。这里只采用该表达式。目录收录公式,不表示某次股票研究拥有所需字段,更不表示已经恢复作者全部组合构造和交易过程。数据可算性应逐字段确认,不能由名字推断。

高、低与VWAP要对应同一证券、交易区间、币种和价格调整基础。两价格乘积开平方仍是价格单位,只有VWAP同单位相减才有定义意义。复权高低与未复权加权价混用,可以得到数值,却成为另一种对象,不能只因程序没报错就接受为原公式。

本例代理定义为高、低、收盘之和除三,命名alpha41_typical_price_proxy;合成成交带版叫alpha41_tape_vwap。两个名字区分字段语义,不声称任一版本已经复现论文投资回报。下面高分优先选择一只,也明确是作者设定,不从公式编号自动推出交易方向。

VWAP血缘从数量与金额开始

完整且兼容的成交集合中,VWAP等于价格乘股数总和除总股数。核对供应商包括哪些交易:正常时段、全日或其他窗口,高低收盘必须对应同区间。成交额与成交量都非空,不证明覆盖一致;若一个包含某类交易另一个不含,比值也不再是声明的加权价。

记录成交额以元、千元还是百万元报告,量以股、手还是其他单位报告,除法前应用明确倍率。两者缩放不同,可能差几个数量级。单位检查先于排序,不能等回测亏损或产生夸张分数后才怀疑数据。若倍率不明,状态应未确认,不从价格看起来合理反猜单位。

成交量零在这个定义下没有加权均价,应保留不可用,不自动以收盘替代。同窗口一致数据的比值跑出最高最低区间,是有用警报;通过区间检查却不证明所有单位和覆盖正确,因为两种错误可能互相抵消。元数据与范围检查共同使用,不能把一条断言夸成完整数据审计。

两条合成成交带逐项复算

A先在十二成交九十股,再在八成交十股;B先在八成交九十股,再在十二成交十股。两者高十二、低八、总量一百,A收八、B收十二。成交带在本小例中故意给全,不表示外部数据源已经提供所有交易,也不模拟交易所撮合或订单队列。

A成交额一千一百六十,VWAP十一点六;B成交额八百四十,VWAP八点四。共同几何价格为九十六开平方,约九点七九七九五九。真实带版因子A约负一点八零二零四一、B约正一点三九七九五九,因此高分规则选择B。每个数都可由两笔价格数量独立算出。

典型价代理A约九点三三三三三三,B约十点六六六六六七;相减后A约正零点四六四六二六,B约负零点八六八七零八,改选A。成员反转来自成交数量在不同价格的分布。最高、最低和最后价格不保留这个分布,所以不能一般性从它们精确恢复VWAP。

字段替代与执行价格分开

因子在合成交易区间完成后形成,这段VWAP是输入测量,不是后续策略保证可成交的价格。两套账户另给下一执行开盘十,不能因为公式里有历史加权价,就允许后来下单回到该价买入。信息形成时间和执行时间分别记录,才能看清是否使用了过去不能取得的成交条件。

初始资金一千,选中股票买四十股,虚构费一,买后现金五百九十九。真VWAP账户买B,代理买A,数量、成本和持有区间相同,让成员变化成为可见区别。这里没有按因子幅度调仓,避免把字段替代与仓位大小同时改变后,无法知道差异来自哪一层。

给定退出价B十点二、A九点八,各卖四十股,再费一。真实带版最终现金一千零六,代理九百九十,均无持仓、共费二。它们是合成会计结果,不证明真实VWAP会盈利,也不证明典型价格在市场中普遍较差。真实业绩要另有历史数据、覆盖和成本证据。

单位错误与代理是不同反例

把成交额错传为一点一六、量一百,声明价格区间仍八至十二,比值零点零一一六跑出区间,程序拒绝为单位或窗口不一致,不继续生成看似极大的Alpha41。另一个负例传零成交量,同样拒绝,不填零VWAP后继续排名。

合法代理与错误比值不同。代理是已明确命名、可单独研究的新测量;错误缩放在本元数据契约下无效。不能看到异常结果后临时改叫代理以绕过拒绝。先根据来源修复或排除,之后才谈因子表现。故意给两种独立负例,确保验证器不仅会处理正常表格。

运行实现差异包

下载完整示例,保存R568.py,用Python 3.12及以上执行python R568.py。仅标准库和合成数据,源文件为docs/growth/research/round-5/examples/R568.py。Python数学模块说明提供独立计算所用开平方和近似相等工具。

断言核真实带加权价、公式分数、B/A成员分歧、精确期末现金,以及错误缩放和零量拒绝。输出两份完整评分,不只输出最终差额。读者无需账户与隐藏笔记本状态,便可从原成交带重建每一步;但这仍仅是小样例方法,不是外部系统可用性测试。

明确可复现范围与后续更新

字段血缘表列原要求、实际来源、单位、窗口、复权及所用实现。缺少真实兼容VWAP,就把原字段版标为不可用,代理按自己的名称、固定选择和费用账研究。不能因为使用相同公式编号,就把代理运行叫成论文复现。公式算术正确与论文投资过程一致,是不同层次。

扩展历史前,抽若干时段与原成交额定义核对,再加载大面板。保存排除项和每段资料何时可用。供应商改变覆盖、单位或复权时,更新实现标签和工件,保留旧版对照。完成条件是替代字段及经济后果透明;原论文完整收益复现仍是独立且更广的任务,需要更多数据与规则,不能由本例自动完成。

在交接说明中把“原字段不可用”与“代理可运行”分成两个状态。前者是依赖缺口,后者是受限实验成果,两者可以同时成立。这样接手者知道下一步应补数据定义,而不是继续调代理参数直到看起来像论文收益。每个版本的命名都应跟随输出与图表,避免只在方法段承认近似,结果页又省略限定。

字段血缘表需要能指导下一步

每版保留原成交额、原成交量、声明倍率和归一后的价格。已知千元字段可按资料乘回基本单位;缩放未知则继续未解决,不能从哪种结果排名最好反猜。区间断言只针对本次错缩放,不是通用自动单位识别器。缺证据时停止原字段计算,本身就是可靠输出,不能为了保证所有股票都有分数而换个名字绕过。

公式表达式与组合选择也分别存。兼容VWAP只解决一个输入,即使公式值正确,仍没有自动定义容量、方向、持有期或费用。它们是本实验明确选择,后续来源给出不同规则时另建版本,比较新持仓,不覆盖代理研究原含义。输入更忠实与策略同时变化,必须分开解释,不能统称复现质量提高。

真实样本检查可以先选一个成交分布明显偏向高价、另一个偏向低价的时段,确认聚合定义再做全量计算;但没有完整成交带时,不声称自己已经知道真实分布。本例恰好把带给全,所以能够证明代理为何分歧,外部数据不足时只能保留字段假设与限制。不要把可解释的合成现象写成供应商实际错误。

交付中列出下一步缺的是数据覆盖、单位说明还是原投资规则,三者对应不同动作。前两者可能通过文档与数据核对修复,第三者需要来源方法或明确自定。把这些依赖写实,研究者才能知道补什么,而不是继续对一个命名不清的因子调参数,最终无法判断到底研究了哪一种实现。

常见问题

高低收盘能精确恢复VWAP吗?

通常不能,它们没有说明不同价格成交了多少量。

缺VWAP还能研究代理吗?

可以,明确新名称、输入假设和独立结果,不冒称原复现。

相关阅读