请按【四步】完整跑完一个因子从加工、落库、检验到出图文报告的全流程。每步结束用一两句话说明做了什么和耗时;遇到数据缺失/异常的标的,记录后跳过,不要中断整体流程。
【输入参数】(可覆盖)
- 因子:扣非净利润率大于等于30%,收盘价相对过去 250日最高价的回撤幅度 ≥ 30%, 近 5 日平均成交量 / 过去 60 日平均成交量 ≥ 2(即 5 日量比 > 2)
- 股票池:全 A,剔除 ST、停牌、上市不足 250 个交易日。
- 区间:2019-01-01 至最新交易日。
- 检验频率:月度。信号日收盘后生成,T+1 开盘价买入,持有到下一个月末信号日的次日开盘。
- 落库表名:value_roe_neutral;报告路径:./value_roe_bottomvol.html
【技术约束】(动手前先读,能显著提速)
1. 因子加工必须用 DAI SQL 在引擎内一次完成,不要用 pandas 逐日循环。用平台截面算子,先在 dai-functions.md 里 grep 确认签名:
- 行业中位数填充:COALESCE(x, c_group_quantile_cont(ind, x, 0.5))。注意 c_fillna 填的是均值,不是中位数。
- 缩尾:c_winsorize(x, 0.01, 0.99)
- 标准化:c_zscore(x)
- 中性化:c_neutralize_resid(x, 行业列, LN(总市值)),取残差。不要用 c_neutralize / c_indneutralize,它们内部自带缩尾和标准化,会和前面的步骤重复加工。
- 分组:c_ntile(因子, 10)
2. 数据表:
- cn_stock_prefactors:pe_ttm、roe_avg_ttm、total_market_cap、sw2021_level1。财务字段已按公告日对齐。
- cn_stock_status:st_status、suspended。
- cn_stock_factors_base:trading_days。该表缺北交所老代码(430/83x/87x 开头),必须 LEFT JOIN,缺失时用 list_days*245/365 折算兜底,否则会丢约 12 万行。
3. 股票池过滤(WHERE)放在不含 c_* 的 CTE 里,让横截面算子只在股票池内计算。
4. 用 filters 一次取全区间,不要按年循环;大查询用 engine="aistudio"。
5. 用到 scipy 等库的脚本,用 bq aistudio exec -- python x.py 运行;直接 python 会落到没有 scipy 的本机。
6. 报告里的所有数字都从结果文件(json)读取,不要手填;结论里没验证过的原因解释,必须标注为「猜测」。
【第一步 · 因子加工】 按上面的算子写成一条 SQL:股票池过滤 → 行业中位数填充 → EP、ROE 各自缩尾 + z-score → 等权合成再 z-score → 对「行业哑变量 + 对数市值」取残差 → 再 z-score。输出诊断:各步剔除/填充条数、中性化前后与对数市值的相关系数、每日均值≈0 且标准差=1、无重复 (date, instrument)。
【第二步 · 保存】 write_bdb 写入 value_roe_neutral:overwrite=True,unique_together=[date, instrument],带 docs 和元数据(因子名、加工日期、加工引擎、中性化方式、股票池、区间)。回读核对行数,打印表名 + 行数 + 路径。
【第三步 · 检验】(从落库表读取因子;先尝试用 SQL 的 c_ntile / c_rank / m_lead 算分组和 IC,对不上小样本核对结果时再回退 numpy)
1. RankIC:逐日对下期收益,输出均值、标准差、IR、t 值、IC>0 胜率。t 值必须用 Newey-West 校正(20 日收益窗口重叠,朴素 t 会虚高好几倍),同时给出中性化前后对比。另输出累计 RankIC 序列。
2. 分组:10 组(G1 最小 → G10 最大)的下期平均收益、G10−G1、组序相关;同时输出 10 组各自的累计净值。
3. 多空:多 G10 空 G1,月度调仓,给出扣费/不扣费的净值、年化、夏普、最大回撤、单边换手;成本假设写明(单边 0.15%)。另给分年度收益,并与全市场等权基准对比。
4. 自检:财报更新日是否紧跟公告日(统计滞后分布与异常笔数)、因子额外滞后后的 IC、随机因子对照、与过去收益的关系、退市标的是否在样本内。
【第四步 · HTML 报告】 自包含 HTML,内联 CSS/JS,离线可用(内联 SVG 或 ECharts 均可),红涨绿跌,全中文。板块:
1. 概览卡 + 一句话总评(有效 / 存疑 / 无效)。
2. 加工说明:步骤清单 + 大白话解释「为什么要中性化」,并用本次中性化前后的 IC 对比佐证。
3. 图表(至少 7 张):RankIC 时间序列(0 轴 + 60 日均线)、累计 RankIC、十组下期收益柱状图、十组累计净值(G1 绿 → G10 红渐变,G1/G10/等权基准线尾直接标注,悬停按净值排序)、多空累计净值(扣费/不扣费 + 基准)、IC 直方图、分年度 IC。
4. 指标表,按课程口径标注:|IC|≥0.03「可用」、≥0.05「强」、>0.1「可疑(警惕未来函数)」;单调性用「台阶状=规律 / 乱跳=巧合」;另附分年度收益表。
5. 结论(大白话):IC 是否显著为正、分组是否单调、多空是否稳定,给「要不要继续研究」的建议。
6. 风险与备注:样本区间、过拟合提示、空头不可实现、交易细节未建模、自检结果(通过 / 有未解释尾部要如实写)。
最后返回报告文件路径,并停止 AIStudio。