因子与技术分析
基础策略写熟后,进阶方向有两条路:一是多因子选股,用因子表达式挖掘有效的选股指标;二是技术指标信号,用类通达信公式在策略内生成买卖信号。米筐对这两条路都提供了完整的工具链。
一、因子表达式基础
米筐因子系统用 Python 表达式定义因子,核心是 Factor() 引用基础因子,再用算子组合变换:
from rqfactor import *
# 收盘价与开盘价之差,除以最高价与最低价之差
f = (Factor('close') - Factor('open')) / (Factor('high') - Factor('low'))
因子分两类:
- 基础因子:直接来源于行情或财报,如
Factor('close')、Factor('pe_ratio')。 - 复合因子:基础因子经算子变换组合而成,上面例子就是一个复合因子。
复合因子又分横截面因子(用到 RANK、CS_ZSCORE 等横截面算子,因子值依赖整个股票池)和非横截面因子(只依赖个股自身时间序列)。
二、可引用的因子与算子
行情因子:open / close / high / low / volume / total_turnover / num_trades。
财务因子:pe_ratio(市盈率)、pb_ratio(市净率)、revenue(营收)、return_on_equity(ROE)等,可通过 get_factor 的因子名查询。
alpha101 因子:直接用 Factor('alpha001') 等引用。
技术指标:用 Factor('macd') 引用,或导入后带参数调用:
from rqfactor.indicators import KDJ
def compute():
return KDJ(9, 3, 3).K
工具函数(算子)
时间序列算子(TS_ 前缀或无前缀)作用于个股自身序列:
| 算子 | 含义 |
|---|---|
MA(X, N) / EMA(X, N) | 简单/指数移动平均 |
REF(X, N) | N 个交易日前的值 |
HHV(X, N) / LLV(X, N) | N 日内最高/最低 |
STD(X, N) / VAR(X, N) | 标准差/方差 |
DELTA(X, N) / PCT_CHANGE(X, N) | 差分/变化率 |
CORR(X, Y, N) / COV(X, Y, N) | 相关系数/协方差 |
TS_ZSCORE(X, N) | 时间序列标准化 |
CROSS(A, B) | A 上穿 B(金叉) |
IF(X, A, B) | 条件取值 |
横截面算子(CS_ 前缀)作用于整个股票池:
| 算子 | 含义 |
|---|---|
RANK(X) | 横截面排序占比 |
CS_ZSCORE(X) | 横截面标准化 |
DEMEAN(X) | 减去股票池均值 |
INDUSTRY_NEUTRALIZE(X) | 行业中性化 |
TOP(X, threshold=N) | 取最大的 N 个为 1 |
QUANTILE(X, bins=5) | 分组 |
因子表达式中逻辑与用
&、逻辑或用|,且条件需加括号:(CLOSE > 10) & (VOLUME > 100)。
三、因子检验
写好因子后,用 factor_analysis 做多维度检验,评估其选股能力:
from rqfactor import *
from rqfactor.notebook import *
f = Factor('close')
df = execute_factor(f, index_components('000300.XSHG', '20170101'), '20170101', '20170601')
result = factor_analysis(df, 5) # 调仓周期 5 个交易日
result.show() # 图形化展示
可设置的检验参数:股票池、基准、起止日期、调仓周期、因子方向(升序/降序)、分组数、离群值处理(MAD/3σ/百分位)、行业中性化、是否含 ST/新股。
检验结果
- IC 分析:信息系数反映因子对下期收益的预测能力。关键看 IR(IC 均值/标准差)、显著比例、IC 衰减率(预测周期长短)。
- 收益率分析:因子分组累积收益率(多空分化度)、分组换手率。
NormalIC用因子值算相关系数,RankIC用排名算,对离群值更稳健。一般 RankIC 更常用。
四、自定义算子与基础因子
内置算子不够用时,可自定义。以指数加权均线为例:
import numpy as np
from rqfactor.utils import rolling_window
from rqfactor.rolling import RollingWindowFactor
def my_ema(series, window):
q = 0.5 ** (1 / 22) # 半衰期 22 个交易日
weight = np.array(list(reversed([q ** i for i in range(window)])))
r = rolling_window(series, window)
return np.dot(r, weight) / window
def MY_EMA(f, window):
return RollingWindowFactor(my_ema, window, f)
横截面算子用 UnaryCrossSectionalFactor,自定义基础因子(如日内波动率)用 UserDefinedLeafFactor——后者让你接入任意外部数据作为因子材料。
五、策略内技术指标信号
除了因子研究模块,策略代码内也能用类通达信公式做技术分析。核心三步:定义指标函数 → reg_indicator 注册 → get_indicator 取值。
def MA_SIGNAL():
# 5 周期均线上穿 10 周期均线
return CROSS(MA(CLOSE, 5), MA(CLOSE, 10))
def init(context):
context.s1 = '000001.XSHE'
# 注册指标:名称、函数、周期、回溯窗口
reg_indicator('ma_cross', MA_SIGNAL, '1d', win_size=20)
def handle_bar(context, bar_dict):
signal = get_indicator(context.s1, 'ma_cross')
if signal:
order_percent(context.s1, 0.1)
系统预定义了 MACD、KDJ、RSI、BOLL、WR、DMI、BIAS、ASI、VR、ARBR、DPO、TRIX 等指标,行情变量 CLOSE/OPEN/HIGH/LOW/VOLUME 直接可用,工具函数 MA/EMA/HHV/LLV/CROSS/EVERY/COUNT/IF 与通达信高度一致。
技术指标计算不含当前「不完整」分钟线。例如 09:48 计算 5 分钟线指标时,不含 09:45~09:48 这段未合成完的 bar。
小结
- 因子用
Factor()+ 算子表达式定义,分横截面和非横截面两类。 - 时间序列算子(
MA/REF/HHV/CORR)作用于个股,横截面算子(RANK/CS_ZSCORE/INDUSTRY_NEUTRALIZE)作用于股票池。 factor_analysis做 IC 分析和收益率分析,RankIC 比NormalIC 更稳健。- 自定义算子用
RollingWindowFactor/UnaryCrossSectionalFactor,自定义基础因子用UserDefinedLeafFactor。 - 策略内技术指标用
reg_indicator+get_indicator,预定义指标与通达信函数风格一致。
至此,米筐从平台入门、策略 API、数据与交易、回测模拟到因子技术分析形成完整闭环——左侧导航可随时回查任一章节。