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

article/2025/9/14 6:07:49

学习目标:

  • 应用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)

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

参数

参数类型注释
codestr 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)

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

参数

参数类型注释
codestr 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)

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

参数

参数类型注释
codestr 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 == ids3logger.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_idstr指数代码,可传入order_book_id
datestr, 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_idstr合约代码,必填项
bar_countint获取的历史数据数量,必填项
frequencystr获取数据什么样的频率进行。'1d'或'1m'分别表示每日和每分钟,必填项。您可以指定不同的分钟频率,例如'5m'代表5分钟线
fieldsstrOR str list返回数据字段。必填项。见下方列表
skip_suspendedbool是否跳过停牌,默认True,跳过停牌
include_nowbool是否包括不完整的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成交额
datetimeint类型时间戳
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_idstr合约代码
symbolstr合约简称
datetimedatetime.datetime时间戳
openfloat开盘价
closefloat收盘价
highfloat最高价
lowfloat最低价
volumefloat成交量
total_turnoverfloat成交额
prev_closefloat昨日收盘价
limit_upfloat涨停价
limit_downfloat跌停价
isnanbool当前bar数据是否有行情。例如,获取已经到期的合约数据,isnan此时为True
suspendedbool是否全天停牌
prev_settlementfloat昨结算(期货日线数据专用)
settlementfloat结算(期货日线数据专用)

注意,在股票策略中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平台的这些指标数据质量不高,很多指标没有经过运算处理成需要的指标,跟我们在讲金融数据处理的时候列出来的那些财务指标差别比较大

参数

参数类型说明
querySQLAlchemyQueryObjectSQLAlchmey的Query对象。其中可在'query'内填写需要查询的指标,'filter'内填写数据过滤条件。具体可参考 sqlalchemy's query documentation 学习使用更多的方便的查询语句。从数据科学家的观点来看,sqlalchemy的使用比sql更加简单和强大
entry_datestr, datetime.date, datetime.datetime, pandasTimestamp查询财务数据的基准日期,应早于策略当前日期。默认为策略当前日期前一天。
intervalstr查询财务数据的间隔,默认为'1d'。例如,填写'5y',则代表从entry_date开始(包括entry_date)回溯5年,返回数据时间以年为间隔。'd' - 天,'m' - 月, 'q' - 季,'y' - 年
report_quarterbool是否显示报告期,默认为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事件将会被略过。

参数

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

返回

4.1.2 scheduler.run_monthly - 每月运行

scheduler.run_monthly(function,tradingday=t)

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

注意:

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

参数

参数类型注释
functionfunction使传入的function每日交易开始前运行。注意,function函数一定要包含(并且只能包含)context, bar_dict两个输入参数
tradingdayint范围为[-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)

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


http://chatgpt.dhexx.cn/article/gDFl2QOV.shtml

相关文章

SAP UI5 Focus related

tap, keydown, keypresssap.ui.core.FocusHandlersap.ca.scfld.md.app.CommonHeaderFooterHelperevent new jQuery.Event(originalEvent);focusin, activate, blur, focusout, sapfocusleaveoElement._handleEvent(oEvent); 要获取更多Jerry的原创…

Consider defining a bean of type ‘com.qf.user.consumer.feign.api.UserFeignAPI‘ in your configuration

Consider defining a bean of type ‘com.qf.user.consumer.feign.api.UserFeignAPI’ in your configuration… 引导类加注解EnableFeignClients

Prime算法 C++实现

Prime算法 算法介绍: 课本实现方法: 先从最小堆说起(heap):任一结点的关键码均小于或等于它的左右子女的关键码,位于堆顶(即完全二叉树的根结点的位置)的结点的关键码是整个集合中最…

【数学】Prime-Factor Prime

Prime-Factor Prime 题目描述 A positive integer is called a "prime-factor prime" when the number of its prime factors is prime. For example, 12 is a prime-factor prime because the number of prime factors of 12223 is 3, which is prime. On the other…

Prime Factory (Training, Math)

Prime Factory (Training, Math) 题目描述 Your task is simple: Find the first two primes above 1 million, whose separate digit sums are also prime. As example take 23, which is a prime whose digit sum, 5, is also prime. The solution is the concatination of t…

Fiori Fundamentals和SAP UI5 Web Components

这周有位同事邀请我给团队讲一讲SAP技术的演进历史,所以我准备了下面几个主题来介绍。 其中SAP的技术回顾和演进,我的思路就是从前后台两方面分别介绍。 我画了一张非常简单的图: 去年5月我写过一篇文章:SAP UI和Salesforce UI开…

C++Prime Plus(3)

目录 51.抽象和类52.类的使用53.对象构造54.对象析构55.const与类56.this指针57.类作用域58.运算符重载59.运算符重载的实例60.友元61.运算符重载-成员或非成员62.类的类型转换63.拷贝构造函数与赋值运算符重载64.静态数据成员65.静态成员函数 51.抽象和类 类型的构成 1.数据占…

C++Prime Plus(6)

目录 92.STL(1)容器93.STL(2)迭代器94.STL(3)函数对象95.STL(4)算法 92.STL(1)容器 标准模板库 STL(Standard Template Library),是 C 标准库的一部分,不需要单独安装,只需要#include 头文件。STL提供了容器&#xff…

C++Prime Plus(5)

目录 85.异常(1)异常处理机制86.异常(2)exception类87.RTTI(1)88.RTTI(2)89.类型转换运算符90.string类91.智能指针 85.异常(1)异常处理机制 异常:运行错误(比如无法打开文件,动态内存申请失败),导致程序无法继续正常…

SAP Fiori学习笔记

资料链接:有些是需要自带梯子的哦~ Fiori Design Guidelines​experience.sap.com戴团长:SAP Fiori Design​zhuanlan.zhihu.com如何评价 SAP Fiori Design Guidelines?​www.zhihu.comhttps://mp.weixin.qq.com/s?__bizMzIyNjY…

C++Prime Plus(2)

目录 21.for循环(1)22.for循环(2)23.while循环24.do while循环25.二维数组与嵌套循环26.if语句27.逻辑表达式28.条件表达式29.switch语句30.文件概念31.文本文件的输入输出32.函数详解(1)回顾33.函数详解(2)参数传递34.函数详解(3)数组传递35.函数详解(4)C风格字符串36.递归概念…

C++Prime Plus(1)

目录 1.C简介2.程序生成(创建源码,编译和链接)3.进入C4.C语句5.函数入门6.整型7.char,bool(小整数)8.const与符号常量9.浮点数10.算术表达式11.数组12.C风格字符串13.C风格字符串14.结构15.指针16.动态内存…

C++Prime Plus(7)

目录 96.输入输出概述97.使用cout输出(1)ostream基本功能98.使用cout输出(2)格式化输出99.使用cin输入100.文件(1)简单的文件IO101.文件打开的进一步讨论102.二进制文件访问103.随机读写 96.输入输出概述 C的输入输出是由库iostream中提供的一组类实现的; 流 C把输…

E-Prime软件包及安装

E-Prime软件包及安装 1 版本问题2 安装过程3 注意事项4 唠唠叨叨 Hello, 这里是行上行下,我是喵君姐姐~ 众所周知,E-Prime是实验设计的执行者。 当我们提出一个想法,则需要一个具体的软件来实现它。 而E-Prime相对于Matlab和Py…

Prime Sample

又发现了个框架 但没有代码啊~~ 还是搬来了,重要样本关注机制,一种新颖的目标检测框架 上论文 论文地址: https://arxiv.org/pdf/1904.04821.pdf 在目标检测框架中,平等对待所有样本并以平均性能最大化目标是一种常见的范例。在…

Prime Factors

此题需要使用到质因子分解的算法,可以参考以下链接: https://blog.csdn.net/qq_42410605/article/details/100150140 题目描述: Given any positive integer N,you are supposed to find all of prime factors,and write them in the form…

SpringBoot实现分布式锁

SpringBoot实现分布式锁 先了解一下线程数: 线程锁 线程锁:主要用来给类,方法,代码加锁,当某个方法或者某块代码使用synchronize关键字来修饰,那么在同一时刻最多只能有一个线程执行该代码,如…

深入理解ConcurrentHashMap原理分析以及线程安全性问题

在之前的文章提到ConcurrentHashMap是一个线程安全的,那么我么看一下ConcurrentHashMap如何进行操作的。 ConcurrentHashMap与HashTable区别? HashTable put()源代码 我们来看一下put 操作: 方法体 被 同步锁标记,由于同步锁的…

Redis分布式锁到底安全吗?

若有收获,请记得分享和转发哦 这篇文章我想和你聊一聊,关于 Redis 分布式锁的「安全性」问题。 Redis 分布式锁的话题,很多文章已经写烂了,我为什么还要写这篇文章呢? 因为我发现网上 99% 的文章,并没有把这个问题真正…

Java线程安全

前段时间有测试一个后端对账单和话单采集服务,在测试过程中有涉及到数据库读写逻辑和并发的场景,所以结合经验针对系统技术架构设计了部分并发场景结合数据库读写时可能出现的一些问题的用例,也确实出现了一些测试环境容易忽视,线上环境确确实实可能出现的问题,当然最后还是得到…