怎么用Python获取股票的实时数据?

学习目标:

  • 应用industry实现行业股票列表的获取
  • 应用history_bars实现股票合约历史行情数据获取
  • 应用get_fundamentals实现股票基本面数据获取
  • 使用query的过滤条件完成股票数据的过滤
  • 应用scheduler定时器实现股票数据定期获取

1、 数据接口种类

  • 获取指定行业、板块股票列表
  • history_bars - 指定股票合约历史数据
  • get_fundamentals - 查询财务数据

2、 获取行业、板块以及概念股票列表

2.1 关于股票代码以及代码补齐

RiceQuant上的股票代码标记

怎么用Python获取股票的实时数据?_第1张图片

股票自动搜索及补全

  • Windows 用户 : 输入ctrl + i
  • Mac 用户 :输入command + i
  • Linux 用户 :输入ctrl + i

当您输入了这个组合键之后,Ricequant在线IDE就会进入股票代码搜索和自动完成模式,接着您可以输入任何一种进行搜索和自动补全:

  • 股票数字代码 - 自动补全为股票数字代码,比如"000024.XSHE"
  • 股票中文全称 - 自动补全为股票中文全称,比如"招商地产"
  • 股票拼音缩写 - 这里比较特殊,自动补全为股票中文全称,因为股票拼音缩写并不是独一无二的,比如ZSDC补全为"招商地产"

2.2 获取行业

industry - 行业股票列表

industry(code)

获得属于某一行业的所有股票列表。

参数

参数 类型 注释
code str OR industry_code item 行业名称或行业代码。例如,农业可填写industry_code.A01 或 'A01'

返回

获得属于某一行业的所有股票的order_book_id list。

范例

def init(context):
    stock_list = industry('A01')
    logger.info("农业股票列表:" + str(stock_list))

2.3 获取板块

sector - 板块股票列表

sector(code)

获得属于某一板块的所有股票列表。

参数

参数 类型 注释
code str OR sector_code items 板块名称或板块代码。例如,能源板块可填写'Energy'、'能源'或sector_code.Energy

返回

属于该板块的股票order_book_id或order_book_id list.

范例

def init(context):
    stock_list = industry('A01')
    logger.info("农业股票列表:" + str(stock_list))

2.3 获取板块

sector - 板块股票列表

sector(code)

获得属于某一板块的所有股票列表。

参数

参数 类型 注释
code str OR sector_code items 板块名称或板块代码。例如,能源板块可填写'Energy'、'能源'或sector_code.Energy

返回

属于该板块的股票order_book_id或order_book_id list.

范例

def init(context):
    ids1 = sector("consumer discretionary")
    ids2 = sector("非必需消费品")
    ids3 = sector("ConsumerDiscretionary")
    assert ids1 == ids2 and ids1 == ids3
    logger.info(ids1)

支持的行业获取如下,想要了解全球行业划分标准参考全球行业标准分类:

板块代码 中文板块名称 英文板块名称
Energy 能源 energy
Materials 原材料 materials
ConsumerDiscretionary 非必需消费品 consumer discretionary
ConsumerStaples 必需消费品 consumer staples
HealthCare 医疗保健 health care
Financials 金融 financials
InformationTechnology 信息技术 information technology
TelecommunicationServices 电信服务 telecommunication services
Utilities 公共服务 utilities
Industrials 工业 industrials

2.4 获取概念

参考:https://www.ricequant.com/api/python/chn#data-methods-concept

2.5 获取指数成分股

index_components - 指数成分股

index_components(order_book_id, date=None)

获取某一指数的股票构成列表,也支持指数的历史构成查询。

参数 类型 说明
order_book_id str 指数代码,可传入order_book_id
date str, date, datetime, pandas Timestamp 查询日期,默认为策略当前日期。如指定,则应保证该日期不晚于策略当前日期

返回

构成该指数股票的order_book_id list

常见的指数获取代码为

怎么用Python获取股票的实时数据?_第2张图片

2.6 自定义股票池,提供给handle_bar使用

我们可以通过context的参数,相当于提供一个全局变量来获取

def init(context):
    # 在context中保存全局变量
    context.s1 = "000001.XSHE"

    # context.s2 = "601390.XSHG"
    # 获取行业
    # context.stock_list = industry("C39")
    # 获取指数成分股
    context.hs300 = index_components("000300.XSHG")


def before_trading(context):
    logger.info(context.hs300)
    logger.info("before_trading")

3、获取股票合约数据

3.1 history_bars - 某一合约历史数据

history_bars(order_book_id, bar_count, frequency, fields=None, skip_suspended=True, include_now=False)

获取指定合约的历史行情,同时支持日以及分钟历史数据。不能在init中调用。

参数

参数 类型 注释
order_book_id str 合约代码,必填项
bar_count int 获取的历史数据数量,必填项
frequency str 获取数据什么样的频率进行。'1d'或'1m'分别表示每日和每分钟,必填项。您可以指定不同的分钟频率,例如'5m'代表5分钟线
fields strOR str list 返回数据字段。必填项。见下方列表
skip_suspended bool 是否跳过停牌,默认True,跳过停牌
include_now bool 是否包括不完整的bar数据。默认为False,不包括。举例来说,在09:39的时候获取上一个5分钟线,默认将获取到09:31~09:35合成的5分钟线。如果设置为True,则将获取到09:36~09:39之间合成的"不完整"5分钟线

返回

ndarray ,方便直接与talib等计算库对接,效率较history返回的DataFrame更高。

获取的字段内容如下

fields 字段名
datetime 时间戳
open 开盘价
high 最高价
low 最低价
close 收盘价
volume 成交量
total_turnover 成交额
datetime int类型时间戳
open_interest 持仓量(期货专用)
basis_spread 期现差(股指期货专用)
settlement 结算价(期货日线专用)
prev_settlement 结算价(期货日线专用)

3.2 代码以及注意的问题

  • 因为撮合逻辑是当前bar收盘或者下一个bar开盘,所以history_bars()可以获取到包含当前bar及之前所有的bar数据
    • 获取当天的数据
    • 获取前十天的数据
    • 获取每天的每分钟分钟的数据?获取每分钟之前的几分钟数据?

# 如果想在今天运行,获取从几天开始前几天一些数据
# 获取前5天的收盘价,开盘价
# 股票代号,间隔,频率,交易指标
data = history_bars(context.s1, 5, '1d', 'close')

# 获取多个指标
data = history_bars(context.s1, 5, '1d', ['close', 'open'])

# 如果回测是每日的,不支持获取分钟数据
data = history_bars(context.s1, 5, '1m', ['close', 'open'])

问题:这里的频率跟回测的频率区别?

怎么用Python获取股票的实时数据?_第3张图片

3.3 其它-通过bar_dict获取

获取合约当前价格的bar_dict,

Bar对象

属性 类型 注释
order_book_id str 合约代码
symbol str 合约简称
datetime datetime.datetime 时间戳
open float 开盘价
close float 收盘价
high float 最高价
low float 最低价
volume float 成交量
total_turnover float 成交额
prev_close float 昨日收盘价
limit_up float 涨停价
limit_down float 跌停价
isnan bool 当前bar数据是否有行情。例如,获取已经到期的合约数据,isnan此时为True
suspended bool 是否全天停牌
prev_settlement float 昨结算(期货日线数据专用)
settlement float 结算(期货日线数据专用)

注意,在股票策略中bar对象可以拿到所有股票合约的bar信息

# 只能获取当前的交易信息
logger.info(bar_dict[context.s1].close)

注:只能获取当前运行日期的,不能获取之前日期

4、获取财务数据

4.1 get_fundamentals - 查询财务数据

get_fundamentals(query, entry_date=None, interval='1d', report_quarter=False)

获取历史财务数据表格。目前支持中国市场超过400个指标,具体请参考 财务数据文档 。目前仅支持中国市场。需要注意,一次查询过多股票的财务数据会导致系统运行缓慢。(entry_date在回测当中不去要提供)

注意这里的数据指标类别虽然有400多种,但是RQ平台的这些指标数据质量不高,很多指标没有经过运算处理成需要的指标,跟我们在讲金融数据处理的时候列出来的那些财务指标差别比较大

怎么用Python获取股票的实时数据?_第4张图片

参数

参数 类型 说明
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' - 年报

返回

pandas DataPanel 如果查询结果为空,返回空pandas DataFrame 如果给定间隔为1d, 1m, 1q, 1y,返回pandas DataFrame

4.2 如何获取指标-query查询

怎么用Python获取股票的实时数据?_第5张图片

通过fundamentals获取以上的属性

q = query(fundamentals.eod_derivative_indicator.pe_ratio)

4.3 过滤指标条件

  • query().filter:过滤大小
  • query().order_by:排序
  • query().limit():限制数量
  • fundamentals.stockcode.in_():在指定的股票池当中过滤
# 增加条件过滤掉不符合的股票代码
# 默认直接获取A股是所有的股票这个指标数据
# order_by默认是升序
# limit:选择固定数量的股票,获取20个股票交易
q = query(fundamentals.eod_derivative_indicator.pe_ratio,
             fundamentals.eod_derivative_indicator.pcf_ratio).filter(
                 fundamentals.eod_derivative_indicator.pe_ratio > 20,
                 fundamentals.eod_derivative_indicator.pcf_ratio > 15,
                 ).order_by(
                     fundamentals.eod_derivative_indicator.pe_ratio
                     ).limit(20)

# 想要从沪深300指数的一些股票去进行筛选
# 通过fundamentals.stockcode去限定股票池
    q = query(fundamentals.eod_derivative_indicator.pe_ratio,
             fundamentals.eod_derivative_indicator.pcf_ratio).filter(
                 fundamentals.eod_derivative_indicator.pe_ratio > 20,
                 ).order_by(
                     fundamentals.eod_derivative_indicator.pe_ratio
                     ).filter(
                         fundamentals.stockcode.in_(context.hs300)
                         ).limit(20)


# 获取财务数据,默认获取的是dataframe,entry_date在回测当中不去要提供
fund = get_fundamentals(q)
# 注释:每个表都有一个stockcode在用来方便通过股票代码来过滤掉查询的数据

问题:一般选择一些满足财务数据的股票时间并不是每天去获取,而是间隔一周、一个月去获取一次?怎么取获取呢?

4、scheduler定时器定时数据获取

  • scheduler.run_daily - 每天运行
  • scheduler.run_weekly - 每周运行
  • scheduler.run_monthly - 每月运行

4.1 API介绍

4.1.1 scheduler.run_daily - 每天运行

scheduler.run_daily(function)

每日运行一次指定的函数,只能在init内使用

注意,schedule一定在其对应时间点的handle_bar之前执行,如果定时运行函数运行时间较长,则中间的handle_bar事件将会被略过。

参数

参数 类型 注释
function function 使传入的function每日运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数

返回

4.1.2 scheduler.run_monthly - 每月运行

scheduler.run_monthly(function,tradingday=t)

每月运行一次指定的函数,只能在init内使用

注意:

  • tradingday的负数表示倒数。
  • tradingday表示交易日,如某月只有三个交易日,则此月的tradingday=3与tradingday=-1表示同一。

参数

参数 类型 注释
function function 使传入的function每日交易开始前运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数
tradingday int 范围为[-23,1], [1,23] ,例如,1代表每月第一个交易日,-1代表每月倒数第一个交易日,用户必须指定

返回

4.2 添加定时器之后的策略运行顺序

比如我们添加了这样一段代码:

def init(context):
    # 定义一个每天运行一个定时器
    scheduler.run_daily(get_data)
    # 每个一个月去获取财务数据,每隔一周去获取财务数据
    scheduler.run_monthly(get_data, tradingday=1)

怎么用Python获取股票的实时数据?_第6张图片

4.3 代码

def get_data(context, bar_dict):
    # logger.info("-------")
    # 进行每月的第一天去调整要买卖的股票
    q = query(fundamentals.eod_derivative_indicator.pe_ratio,
             fundamentals.eod_derivative_indicator.pcf_ratio).filter(
                 fundamentals.eod_derivative_indicator.pe_ratio > 20,
                 ).order_by(
                     fundamentals.eod_derivative_indicator.pe_ratio
                     ).filter(
                         fundamentals.stockcode.in_(context.hs300)
                         ).limit(20)

    # 获取财务数据
    data = get_fundamentals(q)

    logger.info("这个月更新的股票池")
    logger.info(data.T)

后续大家如果想要了解回测角仪、策略交易借口,多因子策略等等内容,欢迎本条下留言。我们会持续更新哦~

你可能感兴趣的:(python,django)