AI助手—将传统主观交易的部分条件进行因子化和回测的过程(股票)
作者:了不起的阿斗
本文记录从主观条件选股→量化因子思维转变的完整过程,包括对平台AI助手使用的心得,以及第一个因子分析实验与股票回测的结果与反思。
一、背景:一个主观交易选手为什么想试试量化
我本人做A股短线交易很久,主要方向是主观交易的题材热点驱动的主升这类。
交易体系其实早就有一套自己的,其中有一个复盘环节就是,每天盘后扫一遍全市场,先用若干自己整理的条件选股条件把几千只股票压缩到几十只候选,然后结合市场和一些额外条件,手动计划定下次日的操作(这里不展开具体)。
胜率还算可以,但是这个过程是否有统计意义,自己其实说不清楚。
早之前,我在JoinQuant上尝试过把这些条件用代码实现,做程序化回测。写的东西本质上就是:
IF 条件A AND 条件B AND 条件C → 买入
IF 持有N天 OR 跌破某位置 → 卖出
其实就是基于程序化规则的选股。跑出来的净值曲线有时候挺好看,但更大的问题是,比如我加了10个条件,到底哪几个是真正在起作用的,哪几个纯属噪声,甚至是在帮倒忙——完全不知道。
后来偶然接触到PandaAI这个平台,看到它有一套完整的因子分析框架,可以对每一个单独的选股条件做统计检验——而且有AI助手辅助搭建工作流、生成代码。这让我觉得也许可以用一种更系统的方式,回答那个一直悬着的问题:我用来筛股票的那些条件,到底有没有真实的预测价值?
不过在动手之前,我意识到自己对"量化"这件事的理解其实停留在很浅的层面。曾经我以为量化就是"把选股条件写成代码自动执行",但和平台AI助手深入交流之后才发现,这两件事之间有一道真正的思维鸿沟需要跨越。
二、理解量化因子:思维上经历的几次转变
第一次转变:从"时间轴"到"横截面"
一开始我完全不理解"横截面"是什么意思。听到"截面因子"这个词,脑子里是空白的。
后来用一个具体的画面才理解:
我以前的思路,是沿着时间轴看某些股票——这只股票今天该不该买、什么情况后该不该卖,视线是纵向的,盯着一只股票的历史走势。
因子量化的思路,是在某一天的横截面上扫描全市场——今天这个时刻,给全市场5000多只股票每人算一个分数,然后按分数排队,视线是横向的,一次性扫描所有股票的相对强弱。
这个视角的转变让我想明白了一件事:我每天盘后扫股、筛候选的动作,其实本质上就是在做横截面分析——我只是没意识到这一点。我在某一天的截面上,对全市场股票做筛选和排序,只不过我的"排序方式"是粗糙的0/1:满足条件的进池,不满足的直接忽略。
第二次转变:条件选股是粗粒度的因子
这个领悟来得比较自然,但让我觉得很爽。
既然因子本质上是给每只股票打一个分数,然后排序——那我原来的"满足所有条件才买",其实就是一个特殊的因子:满足 = 因子值1,不满足 = 因子值0。所有1的排在前面,所有0的排在后面。
区别只是精度太粗。原来的0/1因子丢掉了大量信息,例如"8日涨幅28%刚过门槛"和"8日涨幅45%强势飙升",在我的条件里都是同样的1,但它们代表的强度完全不同。
把条件变成连续数值,就是在把这个信息找回来:
原来:8日涨幅 > 27% → 是/否
现在:8日涨幅 / 27% → 1.04 or 1.67,强度差距被保留
这个认知让我对"因子化"这件事不再陌生——它不是什么神秘的新东西,就是把我原来已经在做的事情,做得更精细、更可测量。
第三次转变:IC/IR不是抽象数学,是"对答案"
一开始看IC的定义(Spearman相关系数、横截面相关性……)完全懵,感觉像在看考研数学。
后来换了一个理解方式:IC就是"对答案"的过程。
你今天按因子给5000只股票排了序,预测排名靠前的下周涨得多。下周收盘后,你把你的排名和真实涨幅的排名对比——吻合程度就是这期的IC。IC = 1代表你完全猜对了,IC = 0代表你的排名和真实结果毫无关系,相当于瞎猜。
实际上IC能到0.03-0.05就算有价值了——不需要每次都猜对,只需要长期平均来看,你排名靠前的比排名靠后的多涨那么一点点,用几百只股票分散风险,长期就能积累出超额收益。
IR的理解也类似——它回答的是"这个IC稳不稳"的问题。一个因子平均IC是0.04但每期波动很大(时而0.15时而-0.12),和另一个因子平均IC也是0.04但每期都稳定在0.03-0.05,哪个更好用?显然是稳定的那个——因为不稳定意味着某个月可能给你带来大亏损,你不敢持续重仓押注。
第四次转变:因子反向,不一定是坏事,是信息
第一轮测试完,看到IC_mean是负数、分组收益从组1到组5单调递减,当时感觉是我的因子其实效果不大、策略没用。
后来才意识到:负向因子也是有价值的因子,只是使用方向反过来——做多低因子值的股票,或者用它来过滤掉高因子值的股票。
更有意思的是第二轮测试出现了倒U型分布——不是单调递减,而是中间组最好、两端都差。这让我想起来,我测试的主升浪因子高分的股票对应的其实是"已经涨了很多、主升浪特征非常明显"的状态,放在全市场5000只股票的截面里,这恰恰是高位股的信号,自然跑不赢中等位置的股票。
这个倒U型其实和我主观交易的直觉高度一致——我从来不去接已经涨了一大截、特征过于明显的股票,因为那往往是末升浪。因子分析只是用数据证实了这个直觉。
量化思维真正的价值,不是给你一个"对"或"错"的答案,而是帮你把模糊的直觉转化成可以测量、可以迭代的信号。
一些基本概念梳理:
因子量化的本质差异
因子量化的逻辑完全不同,核心的范式转变只有一句话:
不再问"这只股票满不满足条件",而是问"在全市场所有股票里,这只股票的排名是多少"。
"横截面"是什么意思?
横截面就是时间的一个切片——某一天,全市场5000只股票的快照。
我以前的思路是沿着时间轴看一只股票:这只股票在第1天该不该买、第3天该不该卖。
因子量化的思路是在某一天的截面上横向扫描所有股票:今天,按这个指标,谁排第一、谁排最后。
"因子值"是什么?
就是给每只股票打的一个分数。以动量因子为例——过去20天的涨幅,这只股票算出来是多少,就是它的因子值(暴露值)。所有股票都能算,然后按大小排序,买分数排在最前面的那批。
IC(Information Coefficient)——这个排名有多准?
每一期,你按因子给全市场排了顺序,预测"排名越高的股票下期涨越多"。
下期收盘后对答案:你排名第1的股票,下期真的涨了第1名吗?
IC就是衡量"你排的顺序"和"真实涨幅顺序"之间的吻合程度。
| IC值 | 含义 |
|---|---|
| IC = 1 | 排名和真实结果完全一致,神预测 |
| IC = 0 | 排名和真实结果毫无关系,瞎猜 |
| IC = 0.05 | 有一点微弱的正向预测力 |
实际上IC能到0.03-0.05就算有用,不需要每次都对——长期来看排名靠前的比排名靠后的平均多涨一点点,用大量股票分散后就能持续盈利。
IR(Information Ratio)——这个IC稳不稳?
假设因子X的IC序列:0.08, -0.06, 0.12, 0.09, -0.07… 均值0.045,但波动极大。
因子Y的IC序列:0.04, 0.05, 0.03, 0.06, 0.04… 均值0.045,非常稳定。
两个因子均值一样,显然选Y——每个月都稳定贡献一点正收益,而X时好时坏,某个月可能给你带来大亏损。
IR = 平均IC / IC的波动性,衡量的就是这种稳定性。IR越高,说明因子信号可靠、可以持续押注。
四、从条件选股到因子——转化过程
原始的条件
这里简单展示了我之前个人交易中作为初选股池的一个条件选股。
每个条件的经济含义:
| 条件 | 描述的现象 |
|---|---|
| 8日涨幅>25% | 强势上涨,排除弱势股 |
| 均价贴5日线 | 股价在5日线上方运行,不破线 |
| 最高价触5日线 | 5日线是支撑而非压力 |
| 最高价触10日线 | 10日线也是强支撑 |
| 7日内有涨停 | 有主力资金参与的强度确认 |
这五个条件组合在一起,描述的是趋势强度 + 均线支撑结构 + 主力参与度的复合形态。
当然这只是曾经我最基础做股池初筛的一个方式,并非交易策略!
因子化的核心思路
每个"是/否判断"变成"程度数值":
| 原条件 | 转化后的因子 |
|---|---|
| 8日涨幅>25%(是/否) | 实际涨幅/0.25,过了门槛得1分,越超越高,上限2 |
| 均价贴5日线≥7/8天 | 8天内均价在5MA上方的比例(0~1连续值) |
| 触5日线≥6/7天 | 与上合并,计算"均线贴合综合强度" |
| 触10日线(是/否) | 扩展为三均线多头排列打分(0/1/2/3) |
| 7日内有涨停(是/否) | 7日内涨停次数,打分上限3 |
在PandaAI上搭建工作流
平台的可视化工作流节点非常清晰,搭建流程如下:
Python代码输入节点
↓
线性因子构建节点(编码方式选Python,设置时间区间和股票池)
↓
因子权重调整节点(归一化,权重设1.000)
↓
因子分析节点(设置调仓周期、分组数量、股票池)
使用AI助手的过程:
平台的AI助手在这里帮了大忙。我把原来的条件公式和转化思路贴给AI助手,它直接帮我生成了可以在平台上运行的Python代码,并且自动处理了几个关键问题:
- 涨停阈值的板块差异:主板10%、创业板/科创20%、北交所30%,AI助手自动用股票代码前缀做了区分
- CLIP函数的平台适配:平台不支持CLIP,AI助手改成了
MIN(MAX(...))的形式 - 前视偏差检查:确认所有计算只用历史数据
首先,是创建一个空白工作流,然后使用AI助手创建一个基本的框架
然后我将我的策略因子化后让AI助手写入,并进行修改。针对单独的python代码节点,亦可以点开节点进行代码修改,这是封装好的,节点有属于节点的自己的AI助手可以进行修改,并且在后续运行时报错的时候可以让节点的AI助手检查错误并提供修改~
例如我对python代码这个因子节点进行细化
运行的时候,当出现报错,可以在左边日志上看到错误节点,右边AI修复报错,可以调用这个节点的AI进行检查
最终运行完成
五、测试的结果与分析
先看因子分析部分:
结果:
| 指标 | 结果 |
|---|---|
| IC_mean | -0.0178 |
| Rank_IC | -0.0472 |
| IC_IR | -0.1895 |
| IR | -1.2804 |
分组收益出现了一个有意思的现象——不是单调递减,而是倒U型:
| 分组 | 年化收益率 | 超额年化 |
|---|---|---|
| 组1(最低分) | 46.33% | -3.52% |
| 组2 | 56.23% | +6.37% |
| 组3(中间) | 61.69% | +11.83% |
| 组4 | 53.81% | +3.95% |
| 组5(最高分) | 32.76% | -17.09% |
结果图解读——几个图的含义
分组收益图(最核心的图)
每一天按因子值把全市场分成5组,各组持仓,看累计收益曲线。
理想情况下应该是彩虹状——组5在最上面,组1在最下面,单调递增。
我的结果出现了倒U型,这不是简单的"因子反向"问题,而是有更深的含义:
- 组1(因子极低):这些股票根本没有主升浪特征,收益平平
- 组3(因子中等):刚刚形成主升浪形态、处于上升初中期的股票,收益最好
- 组5(因子极高):主升浪特征过于明显,说明已经涨了很多了,处于末期,容易回调
这个倒U型和我主观交易的直觉完全吻合——我不会去接一个刚刚开始启动的股票(太早),也不会去接一个已经连涨8天、涨幅超过30%还有大量涨停的股票(太晚风险高),我找的是那个"刚好进入主升浪节奏"的股票,对应的恰好是因子分处于中等偏上区间的股票。
IC衰减图(时间维度的预测力)
这张图展示因子值对未来第N天收益的预测力随时间的衰减。
我的结果里,第1-4天出现了几根正向的IC柱,第5天之后全部是负的。
含义:主升浪因子高分的股票,买入后1-3天可能还有一点点继续上涨,5天后开始跑输市场。
这和我的实际交易逻辑高度吻合——主升浪股票本来就是短线逻辑,不是拿来做长线的,2-5天的持有期是合适的窗口。
IC分布图和IC时间序列图
IC分布图显示我的IC分布很宽散(IC_std=0.0945),中心在0附近,说明每期预测力非常不稳定。
IC时间序列的累积IC曲线向下,代表整个测试区间内这个因子累计是负贡献的。
七、股票回测
直接继续运行,看AI助手默认的交易策略下的股票回测结果
运行自动的AI分析
经过测试,得到几个重要结论:
1. 主升浪不适合作为全市场横截面选股因子
主升浪条件高分的股票,在全市场比较中是"已经涨了很多的那批",截面预测力自然偏弱甚至反向。这不代表选股条件没用,而是它的使用场景不是在5000只股票中做排名。
2. 它的真实价值是作为"股池过滤器"而非"截面排名因子"
我在主观交易里本来也是这么用的——主升浪条件筛出的20-50只股票作为候选池,然后在这个池子里再做进一步的选择。这两件事的逻辑层次是不同的:
第一层(股池过滤):主升浪条件 → 筛出候选池(20-50只)
第二层(个股决策):情绪判断 + 位置 + 板块强度 → 最终选出2-3只
因子分析测试的是第一层,但我更真实的alpha可能在第二层。
3. 倒U型分布提示了一个改进方向
既然中间组最好,一个更合适的使用方式是:用因子作为"区间门控"而不是线性排名——设定一个合理的分数区间(比如raw_score在0.3~1.2之间),只关注在这个区间内、且因子分还在上升趋势中的股票,这才是真正对应"刚进入主升浪、还没到末期"的状态。
在结果详情页面,右上角的AI分析还可以调用AI助手直接对图标进行详细ai解读,对新人友好:
**因此,我对回测的交易策略部分,让AI助手修改来了一下买卖细节,结合了一些自己个人的交易思路和策略、仓位配比。这些都可以让节点的AI助手帮忙写成代码。
最后,回测了2025年一年
因子分析:
变化不大
八、关于PandaAI平台使用体验的一些感受
这是我在PandaAI上完整跑一个因子分析+回测工作流,几点体验:
可视化工作流的优势: 节点连接的方式让整个因子研究的逻辑链条非常清晰——代码输入 → 因子构建 → 权重调整 → 因子分析,每个环节一目了然,不容易出现"逻辑接错了都不知道"的情况。
AI助手的实际价值: 我把条件的公式语法直接贴给AI助手,它能理解每个函数的含义并翻译成平台支持的Python算子,省去了大量查文档的时间。尤其是涨停阈值因板块不同这类细节处理,AI助手自动帮我考虑到了。
因子分析节点的输出非常完整: 分组收益、IC时间序列、IC衰减图、IC分布图、IC自相关图一站式给全,不需要自己写可视化代码,对于快速验证因子有效性非常高效。
一个Suggestion:有一些报错代码希望可以针对性给出解决方案,尤其是常见的,内存超限、字段为空等等问题
九、下一步思考
基于这次实验的结论,继续:
情绪择时因子
我在主观交易中还有一套市场情绪判断体系(炸板率、昨日连板平均收益率、板块热度等),这类因子和主升浪因子属于完全不同的层次——它们是市场级别的择时信号,不是个股横截面因子。计划用策略回测的方式单独验证这些情绪因子的有效性,看看它们对"特定行情下出击的成功率"是否有统计意义上的提升。
本文是第一次系统性尝试量化研究的过程记录,很多认知还在持续修正中。欢迎有经验的朋友交流指正。