策略流程
如果我们想要构建一个多因子策略, 那么因子的挖掘与选择就至关重要. 让我们再来看一下策略的流程图:
多因子策略流程
因子挖掘
因子数据的处理:
- 去极值
- 标准化
- 中性化
单因子的有效性检测:
- 因子 IC 分析
- 因子收益率分析
- 因子的方向
多因子相关性和组合分析:
- 因子相关性
- 因子合成
回测
- 多因子选股的权重
- 调仓周期
平台介绍
我们将使用 RiceQuant 提供的投资研究平台进行接下来的讲解.
投资研究平台是基于 IPython NoteBook 搭建的 Ricequant 研究平台, 为策略研究提供了丰富的工具.
网址:
https://www.ricequant.com/quant/notebook
获取函数
获取合约历史数据
get_price - 获取合约历史数据
get_price(order_book_ids, start_date, end_date=None, frequency='1d', fields=None, adjust_type='pre', skip_suspended=False,expect_df=False
获取指定合约或合约列表的历史数据(包含起止日期,日线或分钟线).目前仅支持中国市场。在编写策略的时候推荐使用history_bars.
参数:
参数 | 类型 | 说明 |
---|---|---|
order_book_id | str OR str list | 合约代码,可传入order_book_id, order_book_id list |
start_date | str, datetime.date, datetime.datetime, pandasTimestamp | 开始日期,默认为’2013-01-04’。交易使用时,用户必须指定 |
end_date | str, datetime.date, datetime.datetime, pandasTimestamp | 结束日期,默认为’2014-01-04’。交易使用时,默认为策略当前日期前一天 |
frequency | str | 历史数据的频率。 现在支持日/分钟级别的历史数据,默认为’1d’。使用者可自由选取不同频率,例如’5m’代表5分钟线 |
fields | str OR str list | 返回字段名称 |
adjust_type | str | 前复权处理。前复权 - pre,后复权 - post,不复权 - none,回测使用 - internal需要注意,internal数据与回测所使用数据保持一致,仅就拆分事件对价格以及成交量进行了前复权处理,并未考虑分红派息对于股价的影响。所以在分红前后,价格会出现跳跃。 |
skip_suspended | bool | 是否跳过停牌数据。默认为False,不跳过,用停牌前数据进行补齐。True则为跳过停牌期。注意,当设置为True时,函数order_book_id只支持单个合约传入 |
country | str | 默认是中国市场(‘cn’),目前仅支持中国市场10 |
返回:
- 传入一个order_book_id,多个fields,函数会返回pandas DataFrame
- 传入一个order_book_id,一个field,函数会返回pandas Series
- 传入多个order_book_id,一个field,函数会返回pandas DataFrame
- 传入多个order_book_id,函数会返回pandas Panel
案例:
获取单一股票历史日线行情(返回pandas DataFrame):
[In]get_price('000001.XSHE', start_date='2015-04-01', end_date='2015-04-12')
[Out]
open close high low total_turnover volume limit_up limit_down
2015-04-01 10.7300 10.8249 10.9470 10.5469 2.608977e+09 236637563.0 11.7542 9.6177
2015-04-02 10.9131 10.7164 10.9470 10.5943 2.222671e+09 202440588.0 11.9102 9.7397
2015-04-03 10.6486 10.7503 10.8114 10.5876 2.262844e+09 206631550.0 11.7881 9.6448
2015-04-07 10.9538 11.4015 11.5032 10.9538 4.898119e+09 426308008.0 11.8288 9.6787
2015-04-08 11.4829 12.1543 12.2628 11.2929 5.784459e+09 485517069.0 12.5409 10.2620
2015-04-09 12.1747 12.2086 12.9208 12.0255 5.794632e+09 456921108.0 13.3684 10.9403
2015-04-10 12.2086 13.4294 13.4294 12.1069 6.339649e+09 480990210.0 13.4294 10.9877
获取股票列表历史日线收盘价(返回pandas DataFrame):
[In]get_price(['000024.XSHE', '000001.XSHE', '000002.XSHE'], start_date='2015-04-01', end_date='2015-04-12', fields='close')
[Out]
000024.XSHE 000001.XSHE 000002.XSHE
2015-04-01 32.1251 10.8249 12.7398
2015-04-02 31.6400 10.7164 12.6191
2015-04-03 31.6400 10.7503 12.4891
2015-04-07 31.6400 11.4015 12.7398
2015-04-08 31.6400 12.1543 12.8327``
2015-04-09 31.6400 12.2086 13.5941
2015-04-10 31.6400 13.4294 13.2969
获取股票列表历史日线行情(返回pandas DataPanel):
[In]get_price(['000024.XSHE', '000001.XSHE', '000002.XSHE'], start_date='2015-04-01', end_date='2015-04-12')
[Out]
<class 'rqcommons.pandas_patch.HybridDataPanel'>
Dimensions: 8 (items) x 7 (major_axis) x 3 (minor_axis)
Items axis: open to limit_down
Major_axis axis: 2015-04-01 00:00:00 to 2015-04-10 00:00:00
Minor_axis axis: 000024.XSHE to 000002.XSHE
获取交易日列表
get_trading_dates - 获取交易日列表
get_trading_dates(start_date, end_date, market='cn')
参数:
参数 | 类型 | 说明 |
---|---|---|
start_date | str, datetime.date, datetime.datetime, pandasTimestamp | 开始日期 |
end_date | str, datetime.date, datetime.datetime, pandasTimestamp | 结束日期 |
market | str | 默认是中国内地市场(‘cn’) 。可选’cn’ - 中国内地市场;‘hk’ - 香港市场 |
返回:
datetime.date list - 交易日期列表
范例:
[In]
get_trading_dates(start_date='20160505', end_date='20160505')
[Out]
[datetime.date(2016, 5, 5)]
查询财务数据
get_fundamentals - 查询财务数据
get_fundamentals(query, entry_date=None, interval='1d', report_quarter=False,expect_df=False)
获取历史财务数据表格。目前支持中国市场超过 400 个指标,具体请参考财务数据文档。目前仅支持中国市场。需要注意,一次查询过多股票的财务数据会导致系统运行缓慢。
注:get_fundamentals 即将废弃,请使用get_factor 获取财务数据.
参数:
参数 | 类型 | 说明 |
---|---|---|
query | SQLAlchemyQueryObject | SQLAlchmey 的 Query 对象。其中可在’query’内填写需要查询的指标,'filter’内填写数据过滤条件。具体可参考 sqlalchemy’s query documentation 学习使用更多的方便的查询语句。从数据科学家的观点来看,sqlalchemy 的使用比 sql 更加简单和强大 |
entry_date | str, datetime.date, datetime.datetime, pandasTimestamp | 查询财务数据的基准日期,应早于策略当前日期。默认为策略当前日期前一天。 |
interval | str | 查询财务数据的间隔,默认为’1d’。例如,填写’5y’,则代表从 entry_date 开始(包括 entry_date)回溯 5 年,返回数据时间以年为间隔。‘d’ - 天,‘m’ - 月, ‘q’ - 季,‘y’ - 年 |
report_quarter | bool | 是否显示报告期,默认为 False,不显示。‘Q1’ - 一季报,‘Q2’ - 半年报,‘Q3’ - 三季报,‘Q4’ - 年报 |
expect_df | bool | 默认返回原有的 Panel 数据结构。如果调为真,则返回 pandas dataframe |
返回:
- pandas DataPanel
- 如果查询结果为空,返回空pandas DataFrame
- 如果给定间隔为 1d, 1m, 1q, 1y,返回 pandas DataFrame
范例:
获取财务数据中的 pe_ratio 和 revenue 指标:
# 并且通过filter过滤掉得到符合一定范围的pe_ratio的结果
# 最后只拿到按照降序排序之后的前10个
fundamental_df = get_fundamentals(
query(
fundamentals.income_statement.revenue, fundamentals.eod_derivative_indicator.pe_ratio
).filter(
fundamentals.eod_derivative_indicator.pe_ratio > 25
).filter(
fundamentals.eod_derivative_indicator.pe_ratio < 30
).order_by(
fundamentals.income_statement.revenue.desc()
).limit(
10
)
)
context.stocks = fundamental_df.columns.values
update_universe(context.stocks)
获取某些指定股票的历史财务数据:
def init(context):
context.stocks = industry('A01')
logger.info("industry stocks: " + str(context.stocks))
#每个表都有一个stockcode在用来方便通过股票代码来过滤掉查询的数据,比如次数是只查询'A01'板块的revenue 和 pe_ratio
#最后加入 entry_date 参数获取2015年12月31日的数据
context.fundamental_df = get_fundamentals(
query(
fundamentals.income_statement.revenue, fundamentals.eod_derivative_indicator.pe_ratio
).filter(
fundamentals.eod_derivative_indicator.pe_ratio > 5
).filter(
fundamentals.eod_derivative_indicator.pe_ratio < 300
).filter(
fundamentals.income_statement.stockcode.in_(context.stocks)
),entry_date='20151231'
)
logger.info(context.fundamental_df)
update_universe(context.fundamental_df.columns.values)