量化交易多因子策略流程
Posted 黑马程序员官方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了量化交易多因子策略流程相关的知识,希望对你有一定的参考价值。
本文学习目标:说明多因子策略的流程。
一、多因子策略流程
重在因子的探索和处理
我们可以得出以下步骤
- 因子挖掘
- 因子数据的处理
- 去极值
- 标准化
- 中性化
- 单因子的有效性检测
- 因子IC分析
- 因子收益率分析
- 因子的方向
- 多因子相关性和和组合分析
- 因子相关性
- 因子合成
- 因子数据的处理
- 回测
- 多因子选股的权重
- 调仓周期
二、多因子策略确定的事情
- 1、选择哪些因子和因子的方向确定
- 2、因子的权重(打分法和回归法)
- 3、调仓周期
其中1步骤属于因子的探索和处理部分,2和3步骤属于选好因子回测部分
三、因子挖掘怎么做?
由于此部分不是回测,所以我们需要在单独的研究平台使用特定的接口进行分析。RQ平台提供了这样的研究平台供我们去挖掘因子
四、关于研究平台的获取函数
在研究因子的时候我们需要获取更多区间段历史的数据来进行研究,所以研究平台当中的函数会跟回测中不一样
关于研究平台文档:https://www.ricequant.com/api/research/chn
4.1 get_price - 获取合约历史数据
get_price(order_book_id, start_date='2013-01-04', end_date='2014-01-04', frequency='1d', fields=None, adjust_type='pre', skip_suspended =False, country='cn')
获取指定合约或合约列表的历史数据(包含起止日期,日线或分钟线)。目前仅支持中国市场。在编写策略的时候推荐使用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'),目前仅支持中国市场 |
返回
- 传入一个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
4.2 get_trading_dates - 获取交易日列表
get_trading_dates(start_date, end_date, country='cn')
获取某个国家市场的交易日列表(起止日期加入判断)。目前仅支持中国市场。
参数
参数 | 类型 | 说明 |
---|---|---|
start_date | str, datetime.date, datetime.datetime, pandasTimestamp | 开始日期 |
end_date | str, datetime.date, datetime.datetime, pandasTimestamp | 结束日期 |
country | str | 默认是中国市场('cn'),目前仅支持中国市场 |
返回
datetime.date list - 交易日期列表(除去周末、节假日)
范例
[In]get_trading_dates(start_date='20160505', end_date='20160505')
[Out]
[datetime.date(2016, 5, 5)]
4.3 get_fundamentals - 查询财务数据
get_fundamentals(query, entry_date, interval=None, report_quarter=False)
获取历史财务数据表格。目前支持中国市场超过400个指标,具体请参考 财务数据文档 。目前仅支持中国市场。我们特别为该函数进行了优化,读取内存的操作会极大地提升数据的获取速度。 注意:
- 使用get_fundamentals()查询财务数据时,我们是以所有年报的发布日期(announcement date)为准,因为只有财报发布后才成为市场上公开可以获取的数据。比如某公司第三季度的财报于11月10号发布,那么如果从查询日期为10月5号,也就是早于发布日期,那么返回的只是第二季度的财报数据。
- 如需获取固定报告期的财务数据请使用get_financials()。
参数
参数 | 类型 | 说明 |
---|---|---|
query | SQLAlchemyQueryObject | SQLAlchmey的Query对象。其中可在'query'内填写需要查询的指标,'filter'内填写数据过滤条件。具体可参考 sqlalchemy's query documentation 学习使用更多的方便的查询语句。从数据科学家的观点来看,sqlalchemy的使用比sql更加简单和强大 |
entry_date | str, datetime.date, datetime.datetime, pandasTimestamp | 查询财务数据的基准开始日期 |
interval | str | 查询财务数据的间隔。例如,填写'5y',则代表从entry_date开始(包括entry_date)回溯5年,返回数据时间以年为间隔。'd' - 天,'m' - 月(30天), 'q' - 季(90天),'y' - 年(365天) |
report_quarter | bool | 是否显示报告期,默认为False,不显示。'Q1' - 一季报,'Q2' - 半年报,'Q3' - 三季报,'Q4' - 年报 |
返回
pandas DataPanel - 财务数据查询结果。
范例
fundamentals是一个重要的对象,其中包括了股指指标表(eod_derivative_indicator),财务指标表(financial_indicator),利润表(income_statement),资产负债表(balance_sheet),现金流量表(cash_flow_statement)以及股票列表(stock_code)等内容。结合SQLAlchemy的查找方式,能够满足用户多种查找需求。
- 获取某几只股票2015年1月10日及以前5年的营业收入(revenue)以及营业成本(cost_of_good_sold)
[In]dp = get_fundamentals(query(fundamentals.income_statement.revenue, fundamentals.income_statement.cost_of_goods_sold
).filter(fundamentals.income_statement.stockcode.in_(['002478.XSHE', '000151.XSHE'])), '2015-01-10', '5y')
[In]dp
[Out]
<class 'pandas.core.panel.Panel'>
Dimensions: 2 (items) x 5 (major_axis) x 2 (minor_axis)
Items axis: revenue to cost_of_goods_sold
Major_axis axis: 2015-01-09 to 2011-01-10
Minor_axis axis: 002478.XSHE to 000151.XSHE
[In]dp['revenue']
[Out]
002478.XSHE 000151.XSHE
2015-01-09 2.937843e+09 1.733703e+09
2014-01-10 2.926316e+09 8.839355e+08
2013-01-10 2.616532e+09 9.488980e+08
2012-01-10 2.681016e+09 6.205934e+08
2011-01-10 2.034147e+09 4.998120e+08
以上是关于量化交易多因子策略流程的主要内容,如果未能解决你的问题,请参考以下文章