股票因子怎么去极值:比较处理前后的排名和换仓
股票因子去极值会改变数字,却不一定改变持仓。先把变换推进到排名边界和数量规则,再解释分布更平滑是否带来实际交易。交付物应是一张分数变化表,连到成员、订单、费用和净权益;只展示截尾前后直方图,不能证明产生了经济改善。
本指南在同一虚构美股市场使用两组五股合成截面,价格与账户值均人为给定。CoTrading因子变换核对能力仍为规划或待核实。样例用标准库实现明确的顺序统计量上限,不宣称复刻某库未说明默认值,也不寻找最优阈值,更不把例子当历史成绩。
看收益前先写变换定义
原始分数保留,另生成处理后列。本例先对当前允许使用的截面排序,只把最大一个值替换成第二大值,其余不变。上限来自当前分数,不使用后续行情、未来分数或完整历史分位数。处理记录包括上限值、有效数量、被改证券和规则版本,不能只存最后清洗列。
SciPy官方winsorize说明介绍尾部替换,并提供比例和数量处理选项,可作定义参考。下载文件不导入SciPy,而是明确实现“只压最大一个”的规则,避免插值、计数截断或掩码行为不一致。不同实现名字相同,不意味着阈值和输出必然一致。
先确定有效股票池。缺失与非有限分数不能静默成为最小或最大。正式面板还需规定估计上限的最低样本数,以及不足时保留原值、跳过变换还是停止运行。不同股票池或未来样本计算的分位数,都会改变研究输入,不能因为公式名称没变就当同一实验。
数据错误与真实尾部事件分开
极端值可能来自单位错、分母接近零,也可能是真实经济事件。截尾不替代来源检查。若币种转换错误,应修复输入并保存原因,不能把它当普通尾部压下去就结束。否则变换表看起来更合理,错误血缘却被隐藏,下一次更新仍可能出现类似问题。
也不能因为后来收益不方便就删极值。截尾是预先规定的敏感度规则,不是允许改历史直到曲线稳定。保留原始和处理版,明确比较的问题是这条特定规则改变什么,不是认定所有离群观察都虚假。是否纠错与是否研究稳健性应分别做决定、分别留记录。
验收者应能从当天保存的截面重新得到上限。使用全历史、事后扩大股票池再反算过去上限,会形成新的信息路径。哪怕结果很平滑,也不能解释为当时已经可做的研究处理。先核上限来源,再看排名和账户,是避免这类偏差的必要顺序。
分数变了但成员可以不变
第一组A、B、C、D、E分数依次一、二、三、四、一百。上限四,E从一百变四。按分数降序、证券标识升序取两只,原顺序E、D,处理后D、E。排名位置变了,但持仓集合完全相同。两个列表顺序不同,不应自动算成两笔换仓。
本例选中股票使用固定相同数量,不因分数大小重新分配,所以变换本身不产生替换单。保存排名与目标数量两张表,能把这两件事区分。如果执行器每次看到名单顺序变化就先卖后买,会制造与策略无关费用,甚至让研究误判截尾有额外成本。
若按分数比例分配,结论可能不同。一百变四会改变相对幅度,即使成员没变,也可能调整数量。那需要另算明确仓位,本例固定数量就是为了隔离成员机制,不能把它推广成“所有同成员组合都无交易”。数量方法变化后,要重新定义并验收目标。
相同上限规则也能改变边界
第二组X一百分,A四分,B三分,C二分,D一分。同样只把最大值压到第二大值四。组合只留一个名额:原始选X,截尾后A与X同为四,按事先固定证券标识升序选A。新入选不是分数严格更高,而是同分决胜胜出。
截尾并未把两个不等处理值的相对次序颠倒,它制造了跨容量边界的并列。Python官方排序文档支持样例多键排序。解释时应把变换和决胜分开,否则会错误宣称A的处理后经济评分优于X,忽略真正决定成员的是标识规则。
两组样例都在看估值前确定,用同一“压最大一个”规则,容量分别两只和一只。它们是机制验收,不是从多个阈值里找收益最好的一版。真实研究固定实际容量,另外的容量仅作测试;不能看到哪组赚钱就改变名额,之后仍称只是去极值处理。
成员替换怎样落到现金
第二组账户开始有八十股X,参考十,现金二百,起始权益一千。原始规则继续X,没有订单,后续给定X十点二,权益一千零一十六。早期买入成本不属于这次单一调仓比较,不补造佣金,也不把这个结果说成完整生命周期净收益。
处理后规则以十卖八十股X,费一;再以十买八十股A,再费一,现金一百九十八。A后续给定十点一,持仓值八百零八,权益一千零六。相差十,其中八来自后续持仓估值差,两来自替换费。每个差额均能回到成员与实际现金动作。
处理版较低不证明去极值不好,原始版较高也不允许事后挑规则。人为估值只是让后果可检查。订单账比一张更顺滑分布图更能说明机制,但仍不是现实收益证据。真实研究还需要持仓区间、公司行动、执行限制和覆盖,不能从这个小例推断稳定收益方向。
运行独立变换样例
下载完整示例,保存为R565.py,用Python 3.12及以上执行python R565.py。只用标准库与合成数据,源文件为docs/growth/research/round-5/examples/R565.py,不会抓取行情或连接其他服务。
断言检查上限四、第一组两只成员不变、第二组X换A、精确替换订单,以及一千零一十六与一千零六的期末值。上限和同分键要一起核对。只检查最终权益可能让错误成员和错误价格互相抵消,所以成员、数量、费用与现金分别断言,不能只留汇总数。
账户断言还要求原版订单为空,处理版精确为卖X买A、各八十股、价十、各费一;现金分别二百与一百九十八,费用合计零与二。即使权益算术不变,删除返回的订单字段也会被检出。费用总额直接由订单记录复核,不能只有期末值正确、交易工件丢失仍算通过。
把结果整理成影响表
影响表列原分数、处理值、上限血缘、入选状态、目标数量、实际订单与费用。将每个变化分成无目标影响、数量影响、成员影响;大篮子三类可以同时出现,不能用“改了多少值”代替经济后果。价格估值变化也应另列,不倒写成变换改变了因子预测力。
股票池、分母修订、变换规则和数量方法变化后重新验收。保留一个成员不变样例和一个边界并列样例,让后续重构不能把数值平滑误作执行换手。完成条件是每项经济后果能追到允许的当前截面处理和明确组合决策,不是证明截尾提高预期收益。
对于真极端事件,报告原值仍很重要。处理版可用于规则敏感度,原始版帮助读者理解事件规模。两列并存能避免把有意义尾部从资料中抹去,也使后续研究者有机会改变假设而不重新下载全部历史。审阅时先问变换为了什么,再问是否按声明执行,最后才讨论结果;这个顺序能减少事后叙事替代实验设计。
按证券数量映射比较,不按排序位置配对
订单差异应从证券到数量的映射生成。成员不变例里E与D交换列表位置,但各自目标数量相同。若把旧第一行和新第一行直接配对,会制造本来不存在的卖出买入。实际持仓映射避免虚假换手,也让列表展示顺序变化与账户动作分开。比较器应保存排序结果,同时以标识连接数量,不能只用数组位置。
单名额边界同时记录X与A的原分数、处理值和最终决胜键。读者才能确认X没有被当坏观察删除,而是保持资格、按上限变值后输掉明确同分。如果真实纠错使X被排除,应另列排除原因。两种路径可以得到同样A持仓,却有不同解释和下一期更新行为,不能都归入“去极值换股”。
重跑时还要先比较上限与有效样本,之后才比较成员。供应商补了一只旧缺失股票,可能改变当天第二大值;那是覆盖修订带来阈值变化,不等于算法版本修改。保存两版截面和变换版本,解释首个差异到底在哪里发生。没有这些输入时,不能只凭最终成员对齐就声称完全复现。
对外展示保留原值列有一个实际好处:即使日后更换尾部政策,也能从原观察重新计算,而不用从已截尾数反推无法恢复的极值。处理列应看作派生工件,不能覆盖原始资料。这样方法敏感度与数据历史保持独立,研究不会因为一次平滑操作而丢失后续复核所需信息。
常见问题
分数被截尾一定需要交易吗?
不一定。固定数量组合的成员可以完全不变。
能按回测收益选择上限吗?
那属于看过结果后的另一个实验,不是本例冻结的敏感度规则。