如何获取实时的股票数据
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何获取实时的股票数据相关的知识,希望对你有一定的参考价值。
要跟供应商协商得到他的接口才能得到实时股票行情数据拓展资料
股票(stock)是股份公司所有权的一部分,也是发行的所有权凭证,是股份公司为筹集资金而发行给各个股东作为持股凭证并借以取得股息和红利的一种有价证券。股票是资本市场的长期信用工具,可以转让,买卖,股东凭借它可以分享公司的利润,但也要承担公司运作错误所带来的风险。每股股票都代表股东对企业拥有一个基本单位的所有权。每家上市公司都会发行股票。
同一类别的每一份股票所代表的公司所有权是相等的。每个股东所拥有的公司所有权份额的大小,取决于其持有的股票数量占公司总股本的比重。
股票是股份公司资本的构成部分,可以转让、买卖,是资本市场的主要长期信用工具,但不能要求公司返还其出资。
大多数股票的交易时间是:
交易时间4小时,分两个时段,为:周一至周五上午9:30至11:30和下午13:00至15:00。
上午9:15开始,投资人就可以下单,委托价格限于前一个营业日收盘价的加减百分之十,即在当日的涨跌停板之间。9:25前委托的单子,在上午9:25时撮合,得出的价格便是所谓“开盘价”。9:25到9:30之间委托的单子,在9:30才开始处理。
如果你委托的价格无法在当个交易日成交的话,隔一个交易日则必须重新挂单。
休息日:周六、周日和上证所公告的休市日不交易。(一般为五一国际劳动节、十一国庆节、春节、元旦、清明节、端午节、中秋节等国家法定节假日)
股票买进和卖出都要收佣金(手续费),买进和卖出的佣金由各证券商自定(最高为成交金额的千分之三,最低没有限制,越低越好),一般为:成交金额的0.05%,佣金不足5元按5元收。卖出股票时收印花税:成交金额的千分之一(以前为3‰,2008年印花税下调,单边收取千分之一)。 参考技术A 要跟供应商协商得到他的接口才能得到实时股票行情数据;
股票实时行情,可以通过两个方法来进行查看:
第一种,在百度搜索页面直接输入股票代码,如:000717,百度输入后,即可在搜索结果中看到,其中分时,就是该股票在当天的实时走向。
第二种,通过炒股软件,如东财,同花顺等,在开启后,直接输入,股票代码,如600854,点击回车。进入的第一个页面就是该股票在当天的实时行情。
同时在股票软件的分时成交界面,可以查看到每一分钟的成交价和手数。股票行情趋势判断必要时也需要结合分时成交界面的数据来进行判断。
查看其它股票的行情也是一样的道理,直接键入该股票的代码就可以查看到该股票当天或某个时间段内的行情。当然,精准的行情走势、趋势,是需要结合多种指标来共同进行分析的。本回答被提问者采纳 参考技术B BIGI行情有期货、外汇、股指、期权、A股、现货、数字货币实时行情数据源API接口
怎么用Python获取股票的实时数据?
学习目标:
- 应用industry实现行业股票列表的获取
- 应用history_bars实现股票合约历史行情数据获取
- 应用get_fundamentals实现股票基本面数据获取
- 使用query的过滤条件完成股票数据的过滤
- 应用scheduler定时器实现股票数据定期获取
1、 数据接口种类
- 获取指定行业、板块股票列表
- history_bars - 指定股票合约历史数据
- get_fundamentals - 查询财务数据
2、 获取行业、板块以及概念股票列表
2.1 关于股票代码以及代码补齐
RiceQuant上的股票代码标记
股票自动搜索及补全
- 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
常见的指数获取代码为
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'])
问题:这里的频率跟回测的频率区别?
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平台的这些指标数据质量不高,很多指标没有经过运算处理成需要的指标,跟我们在讲金融数据处理的时候列出来的那些财务指标差别比较大
参数
参数 | 类型 | 说明 |
---|---|---|
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查询
通过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)
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)
后续大家如果想要了解回测角仪、策略交易借口,多因子策略等等内容,欢迎本条下留言。我们会持续更新哦~
开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系以上是关于如何获取实时的股票数据的主要内容,如果未能解决你的问题,请参考以下文章