量化交易 因子数据获取

策略流程

如果我们想要构建一个多因子策略, 那么因子的挖掘与选择就至关重要. 让我们再来看一下策略的流程图:
在这里插入图片描述

多因子策略流程

在这里插入图片描述

因子挖掘

因子数据的处理:

  • 去极值
  • 标准化
  • 中性化

单因子的有效性检测:

  • 因子 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)

猜你喜欢

转载自blog.csdn.net/weixin_46274168/article/details/114958524