第 08 篇
因子分析
从「写策略」跨到「做因子研究」:介绍聚宽 jqfactor 模块——自定义一个继承 Factor 的类、声明依赖与窗口、写 calc 计算逻辑,然后可在回测里用 calcfactors 批量算因子值。素材见 raw/collections/jq-getting-started/08-31因子分析md.md。本篇是量化课堂「因子研究」系列的 API 入口。
这是什么
聚宽因子分析 API 的使用手册:怎么定义一个自定义因子(Factor 类 + calc 方法)、可以依赖哪些基础因子、以及怎么用 calc_factors 一次算出多只股票在时间区间内的因子值。概念上它是从「单因子选股」走向「因子库/多因子研究」的脚手架。
核心要点
自定义因子的写法与类属性
- 自定义因子 = 继承
Factor的类,实现calc(self, data)方法。 - 三个类属性决定框架行为:
name:因子名称,不能与基础因子重名冲突。max_window:获取数据的最长窗口(日级)。dependencies:依赖的基础因子名称列表。
- 最小示例 MA5:
class MA5(Factor): name = 'ma5' max_window = 5 dependencies = ['close'] def calc(self, data): return data['close'][-5].mean() calc里data是 dict:key = dependencies 里的因子名,value = pandas.DataFrame(对应多只股票/多个日期)。
可用的基础因子(dependencies 能写什么)
- 价量信息(get_price 能取到的):open、close、high、low、volume、money。
- 财务指标因子:当日能看到的最新单季财务指标(fundamentals 的全部指标)。
- 前 N 季度财务数据:因子名后加
_1取前一报告期(如operation_revenue_1),N 取 1–7;operation_revenue是最新报告期数据。 - 行业因子:证监会行业分类、聚宽一/二级行业、申万一/二/三级行业——返回 bool(属于该行业 = 1,否则 0)。
- 概念因子:类似行业,bool。
- 指数因子:类似行业,bool(是否属于某指数)。
- 资金流因子:get_money_flow API 能查到的数据。
示例:TTM 财务因子
- 定义营业收入 TTM(滚动四季度)因子:dependencies =
['operating_revenue', 'operating_revenue_1', 'operating_revenue_2', 'operating_revenue_3'];calc 里把四期相加ttm = 四季度 revenue 之和后转 series 返回。 - 意义:单季营收波动大,TTM 用最近四报告期加总平滑,是财务类因子常用构造。
在回测中算因子:calc_factors
- 调用:
calc_factors(securities, factors, start_data, end_data)。securities:股票代码列表。factors:因子对象列表(如[ALPHA013(), GROSSPROFITABILITY()])。start_data/end_data:起止日期(如 '2017-01-01' / '2017-02-01')。
- 返回:dict,key = 因子
name,value = pandas.DataFrame(可按日期/股票查因子值)。 - 完整示例里的两个因子:
- ALPHA013(量价因子):dependencies = high/low/volume/money;
vwap = money/volume;因子值 =(sqrt(high*low) - vwap).mean()(根号最高最低价与 VWAP 之差)。 - GROSSPROFITABILITY(毛利资产比因子):dependencies = total_operating_revenue / total_operating_cost / total_assets;因子值 =
(营业收入 - 营业成本) / 总资产的均值——即毛利润占总资产比例。
- ALPHA013(量价因子):dependencies = high/low/volume/money;
- 用
factors['alpha013_name'].head()查看结果(注意:因子实例的类名 ALPHA013,但 name 是 'alpha013_name',结果 dict 的 key 用 name)。
机制 / 论证
- Factor 类把「因子」标准化:声明式(name/window/dependencies)+ 一个 calc 钩子。框架负责「按 dependencies 取好数据喂给你」,你只写「把数据变成因子值」——这样任何自定义因子都能进同一套回测/筛选管线,为多因子研究铺路。
- 窗口与依赖分离:max_window 决定喂多少历史,dependencies 决定喂哪些序列;MA5 要 5 天 close,TTM 因子只要当期(max_window=1)但依赖 4 个季度的财务字段——财务字段的
_N后缀让「历史报告期」成为一等依赖,这是做财务因子的关键机制。 - 因子与「策略里的指标」不同:策略在 handle_data 里手算 ma5 再下单;因子研究把 ma5 之类封装成可复算、可批量、可评价的因子对象——为后续「因子有效性检验」提供输入。
可操作
- 自定义因子模板(参数与逻辑):
from jqfactor import Factor, calc_factors(raw 示例还需 numpy 做 power/sqrt)。- 类属性:
name(自定义且不与基础因子冲突)、max_window(日级窗口)、dependencies(价量/财务/行业/概念/指数/资金流)。 calc(self, data):从data[依赖名](DataFrame)算出因子值并返回。
- 财务因子常用技巧:单季字段后加
_1/_2/_3取前三报告期,做 TTM(四期求和);N 最大 7。 - 计算调用:
factors = calc_factors(股票列表, [因子对象...], start_data=起, end_data=止);用factors[因子.name]取 DataFrame,.head()预览。 - 示例参数:ALPHA013 = (√(high×low) − vwap) 均值;GROSSPROFITABILITY = (营业总收入−营业总成本)/总资产 均值。
- 用途方向:把因子值当排序/筛选依据,即可做单因子选股回测(承接第 5 章市值轮动的「按因子排序取前 N」模式)。
术语
- Factor / calc:因子基类与计算钩子。
- name / max_window / dependencies:因子名 / 窗口 / 依赖。
- TTM:滚动四季度(trailing twelve months)。
- calc_factors:批量算因子函数。
- 行业/概念/指数因子(bool)、资金流因子。
- VWAP:成交量加权均价(此处 money/volume 近似)。
不确定 / 待验证
- raw 示例
securities = ['600000.SXHG', '600016.XSHG']中 600000.SXHG 是笔误(应为 .XSHG)→ 落地修正。 - raw 里
calc_factors(... GROSSPROFITABILIT() ...)与返回 key 用'alpha013_name'、示例结尾 print 的是factors['alpha013_name'],但两个因子类的 name 分别为 'alpha013_name' 与 'gross_profitability';start_data/end_data拼写来自 raw(官方签名可能为 start_date/end_date)→ [需要验证] 以官方 jqfactor 文档为准。 - OR_TT 示例把
ttm.mean()写在返回处,但变量是 Series 语义上应直接返回序列;「财务指标」与 get_fundamentals 的对应关系本篇未展开。
相关
- 简单市值轮动策略 — 「按因子排序取前 N」的选股模式
- 使用 JoinQuant 编写一个策略 — get_fundamentals 财务字段基础
- 聚宽因子分析 API(Factor 与 calc_factors) — 本篇 API 的 concept 化
- 聚宽行情与财务数据获取 API — 价量/财务数据依赖
- 聚宽新手入门教程(JoinQuant 平台实操) — 本教程总览
更新 2026-09-06