因子与技术分析

基础策略写熟后,进阶方向有两条路:一是多因子选股,用因子表达式挖掘有效的选股指标;二是技术指标信号,用类通达信公式在策略内生成买卖信号。米筐对这两条路都提供了完整的工具链。

一、因子表达式基础

米筐因子系统用 Python 表达式定义因子,核心是 Factor() 引用基础因子,再用算子组合变换:

from rqfactor import *

# 收盘价与开盘价之差,除以最高价与最低价之差
f = (Factor('close') - Factor('open')) / (Factor('high') - Factor('low'))

因子分两类:

  • 基础因子:直接来源于行情或财报,如 Factor('close')Factor('pe_ratio')
  • 复合因子:基础因子经算子变换组合而成,上面例子就是一个复合因子。

复合因子又分横截面因子(用到 RANKCS_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、数据与交易、回测模拟到因子技术分析形成完整闭环——左侧导航可随时回查任一章节。