Python量化炒股的获取数据函数—get_fundamentals()

简介: Python量化炒股的获取数据函数—get_fundamentals()

要利用Python编写股票量化炒股策略,就必须获取股票的数据(如收盘价、5日均价、上一时间点价格),还要选出操作的股票,这些都需要用到获取数据函数。

获取多只股票单个数据字段函数history()
利用history()函数可以获取多只股票的单个数据字段历史数据,返回数据格式为DataFrame或Dict(字典),其语法格式如下:

history(count, unit='1d', field='open', security_list=None, df=True,skip_paused=False,fq='pre')

需要注意的是,在获取天数据时,不包括当天的数据,即使在收盘后,关于停牌:因为获取了多只股票的数据,可能有的股票要停牌而没有数据,为零保持时间轴的一致,默认没有跳过停牌的日期,停牌时使用停牌前的数据填充。

各项参数的意义
history()函数共有7项参数,各项参数的意义如下:

1.count

参数count,表示数量,即返回的结果集的行数。

2.unit

参数unit,表示单位时间长度,几天或者几分钟,即支持’Xd’和’Xm’。其中,X是一个正整数。

'Xd’表示具体几天,如10d,表示单位时间长度为10天。

‘Xm’表示具体几分钟,如10m,表示单位时间长度为10分钟。需要注意的是,当X > 1时,fields只支持’open’ ‘close’ ‘high’ ‘low’ ‘volume’ 'money’这几个标准字段。其中,open表示时间段股票的开始时价格,即开盘价。close表示时间段股票的结束价格,即收盘价。high表示时间段股票的最高价格,即最高价。low表示时间段股票的最低价格,即最低价。volume表示时间段股票的成交量。money表示时间段股票的成交金额。

3.field

参数field, 表示获取的数据类型,支持SecurityUnitData中的所有基本属性,包括’open’ ‘close’ ‘low’ ‘high’ ‘volume’ ‘money’ ‘factor’ ‘high_limit’ ‘low_limit’ ‘avg’ ‘pre_close’ ‘paused’。前面6个字段的意义同参数unit。其他字段的意义:factor:前复权因子,high_limit:涨停价,low_limit:跌停价 avg:这段时间的平均价,pre_close:前一个单位时间结束时的价格,按天则是前一天的收盘价,按分钟则是前一分钟的结束价格,paused:布尔值,用来判断股票是否停牌。需要注意的是,停牌时open/close/low/high/pre_close依然有值,都等于停牌前的收盘价。而volume=money=0。

4.security_list

参数security_list,用来获取数据的股票列表。如果其值为None,则表示查询context.universe中所有股票的数据。context.universe需要使用set_universe进行设定,形如:set_universe([‘000001.XSHE’, ‘600000.XSHG’])。

5.df

参数df的值若是True,则返回pandas.DataFrame,否则返回一个dict。参数df的默认值为True。

6.skip_paused

参数skip_paused用来设置是否跳过不交易日期(包括停牌、为上市或者退市后的日期)。如果不跳过,则停牌时会使用停牌前的数据填充。上市前或者退市后数据都为nan。需要注意的是,该参数默认为False,即不跳过不交易日期。

7.fq

参数fq是复权选项。参数值设置为’pre’,表示前复权,为默认设置;参数值设置为None,表示不复权,返回实际价格;参数值设置为’pos‘,表示后复权。

利用函数history()显示单只股票的信息
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python3文件,接着输入如下代码:

import pandas as pd
from matplotlib import pyplot as plt
df = history(5, unit='1d', field='close', security_list='002465.XSHE', df=True, skip_paused=False, fq='pre')
print('海格通信(002465)的近5个交易日的收盘价信息:\n', df)
plt.figure()
plt.plot(df, 'ob')
plt.show()

df为海格通信的近5个交易日的收盘价信息,然后打印出来,并图标显示。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

利用函数history()显示多只股票的开盘价信息
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python3文件,接着输入如下代码:

import pandas as pd
from matplotlib import pyplot as plt
df = history(100, unit='1d', field='open', security_list=['002465.XSHE', '002540.XSHE', '600108.XSHG'], df=True, skip_paused=False, fq='pre')
print('3只股票的近100个交易日的开盘价信息:\n', df)

df为3只股票(海格通信,亚太科技,亚盛集团)的近100个交易日的开盘价信息。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
image.png

如果只想显示3只股票的昨日的开盘价信息,则实现代码如下:

print('三只股票昨日的开盘价格:')
print(df.iloc[-1])

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
image.png

如果只想显示某一只股票的昨日开盘价信息,则实现代码如下:

print('海格通信昨日开盘价信息:')
print(df['002465.XSHE'][-1])

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

还可以利用mean()函数求平均价格,具体实现代码如下:

print('三只股票近100日的开盘价的平均价格是:\n', df.mean())
print('海格通信近100日的开盘价的平均价格是:\n', f"{df['002465.XSHE'].mean():.2f}")

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

最后利用图表显示3只股票近100日开盘价信息,实现代码如下:

matplotlib.rcParams.update({
   'font.size':12, 'font.family':'serif'})
flg, ax = plt.subplots()
ax.plot(df['002465.XSHE'], label='海格通信')
ax.plot(df['002540.XSHE'], label='亚太科技')
ax.plot(df['600108.XSHG'], label='亚盛集团')
ax.legend();
ax.set_xlabel('三只股票d')

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

获取一只股票多个数据字段函数attribute_history()
attribute_history()函数可以用于获取一只股票多个数据字段历史数据,返回数据格式为DataFrame或Dict(字典),其语法格式为:

attribute_history(security, count, unit='1d', fields=['open', 'close','high', 'low', 'volume', 'money'],skip_paused=True, df=True, fq='pre')

需要注意的是,在获取天数据时,不包括当天的数据,即使在收盘后,还需要注意:默认跳过停牌日期。

提醒:history()函数可以获得多只股票的信息,但只能是一个字段的信息,而利用attribute_history()函数只能获得一只股票的信息,但可以获取这只股票的多个属性。

attribute_history()函数也有7项参数,其中count、unit、fields、skip_paused、df、fq参数与history()函数相同。而参数security用来设置股票代码。

利用函数attribute_history()显示股票的报价信息
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python3文件,接着输入如下代码:

import pandas as pd
df = attribute_history('002465.XSHE', 10, unit='1d', fields=['open', 'close','high', 'low', 'volume', 'money'],skip_paused=True, df=True, fq='pre')
df             # df为海格通信近10个交易日的报价信息

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

显示海格通信的昨日收盘价信息和10日收盘价的平均价,具体代码如下:

print('海格通信(002465)的昨日收盘价:', df['close'][-1])
print('海格通信(002465)的10日收盘价的平均价:', df['close'].mean())

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

假如想显示海格通信(002465)2024年4月25日的开盘价、收盘价和成交金额信息,实现代码如下:

print('海格通信2024年4月25日的开盘价:', df['open']['2024-04-25'])
print('海格通信2024年4月25日的收盘价:', df['close']['2024-04-25'])
print('海格通信2024年4月25日的成交金额:', df['money']['2024-04-25'])

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

利用函数attribute_history()显示股票满足条件的报价信息
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python3文件,接着输入如下代码:

import pandas as pd
df = attribute_history('002465.XSHE', 300, '1d', ['open', 'close', 'high', 'low', 'volume', 'money'], True, True,'pre')
myc1 = df['open']
myc2 = df['close']
df[myc1 == myc2]

df为海格通信近300个交易日的报价信息。myc1位开盘价的值,myc2为收盘价的值。df[myc1 == myc2]显示的是开盘价等于收盘价的海格通信(002465)的报价信息。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

如果想查看近100个交易日收盘为阳线的报价信息,即查看收盘价大于开盘价的报价信息,实现代码如下:

df[myc2 > myc1]

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

如果想要显示收盘价大于100日均线的报价信息,实现代码如下:

myc3 = df['close'].mean()
df[myc2 > myc3]

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
image.png

利用图表显示收盘价大于100日均线的收盘价和成交额信息,实现代码如下:

myc3 = df['close'].mean()
df2 = df[myc2>myc3]
myc4 = df['close']
myc5 = df['money']
plt.figure(figsize=(12, 6))
# 激活第一个subplot
plt.subplot(2, 1, 1)
plt.plot(myc4, '-b')   # 实线蓝色绘制收盘价格
plt.subplot(2, 1, 2)
plt.plot(myc5, '-r')   # 实线红色绘制成交量
plt.show()

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

查询单个交易日财务数据函数get_fundamentals()
get_fundamentals()函数可以用于查询单个交易日一只股票或多只股票的财务数据,其语法格式如下:

get_fundamentals(query_object, date=None, statDate=None)

各项参数的意义
get_fundamentals()函数共有3项参数,各项参数意义如下:

1.query_object
参数query_object是一个sqlalchemy.orm.query.Query对象,可以通过全局的query函数获取Query对象。

2.date
参数date是查询日期,可以是一个字符串(格式类似“2024-04-24”)或者datetime.date/datetime.datetime对象。可以是None,使用默认日期,该默认日期在回测和研究模块上有如下差别。

回测模块:默认值会随着回测日期变化而变化,等于context.current_dt的前一天(实际生活中我们只能看到前一天的财报和市值数据,所以要用前一天)。

研究模块:使用平台财务数据的最新日期,一般是昨天。

需要注意的是,如果传入的date不是交易日,则使用此日期之前的最近的一个交易日。

3.statDate
参数statDate是一个字符串,表示财报统计的季度或者年份,有如下两种格式。

季度:格式是年+ ‘q’ + 季度序号, 例如, ‘2024q1’ ‘2023q4’

年份:格式就是年份的数字,例如,‘2020’ ‘2023’

提醒:date和statDate参数只能传入一个。传入date时,查询指定日期date收盘后所能看到的最近的数据;传入statDate时,查询datDate指定的季度或者年份的财务数据。当两个参数都没有传入时,相当于使用data参数,即使用默认日期。

get_fundamentals()函数的返回值是一个pandas.DataFrame,每一行对应数据库返回的每一行,列索引是用户查询的所有字段。

需要注意的是,为了防止返回数据量过大,每次最多返回10000行。另外,当相关股票上市前、退市后,财务数据返回各字段为空。

query的基本查询方式
query():需要查询的对象,可以是整张表,也可以是表中的多个字段或计算出的结果。

filter:过滤条件,多个过滤条件可以用逗号隔开,或者用and或or这样的语法。

order_by:排序条件,其中,desc()表示降序排列,而asc()表示升序排列。

limit:限制返回的个数。

显示一只股票单个交易日的财务数据
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python3文件,接着输入如下代码:

import pandas as pd
myq = query(valuation).filter(valuation.code=='002465.XSHE')
df = get_fundamentals(myq, '2024-04-25')
df

myq表示海格通信的市值数据。valuation表示市值数据表。然后利用get_fundamentals()显示2024-04-25海格通信的市值数据信息。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

市值数据字段的意义如下:

id:每行数据的索引,不能重复。

code:股票代码

pe_ratio:股票的市盈率(PE, TTM),即动态市盈率。动态市盈率是指每股市价为每股收益的倍数,反映投资者对每元净利润所愿支付的价格,用来估计股票的投资报酬和风险。

turnover_ratio:股票的换手率。换手率是指在一定时间内市场中股票转手买卖的频率,是反映股票流通性强弱的指标之一。

pb_ratio:股票的市净率(PB)。市净率是指每股股价与每股净资产的比率。

ps_ratio:股票的市销率。市销率是指股票价格与每股销售收入之比,市销率越小,通常被认为投资价值越高。

pcf_ratio:股票的市现率。市现率是指每股市价为每股现金净流量的倍数。

capitalization:股票的总股本(万股)。总股本是指上市公司已发行的普通股股份总数(包含A股、B股和H股的总股本)。

market_cap:股票的总市值(亿元)。总市值是指在某特定的时间内,交易所挂牌交易全部证券(以总股本计)按当时价格计算的证券总值。

circulating_cap:股票的流通股本(万股)。流通股本是指上市公司已发行的境内上市流通、以人民币兑换的股份总数(A股市场的流通股本)。

circulating_market_cap:股票的流通市值(亿元)。流通市值是指在某特定时间内当时可交易的流通股股数乘以当时股价得出的流通股票总市值。

day:查询股票财务数据的具体日期。

pe_ratio_lyr:股票的市盈率(PE)。以上一年度每股盈利计算的静态市盈率。

显示多只股票单个交易日的财务数据
单击聚宽JoinQuant量化炒股平台中的“策略研究/研究环境”命令,进入Jupyter Notebook的研究平台。然后单击“新建”按钮,创建Python3文件,接着输入如下代码:

import pandas as pd
myq = query(valuation).filter(valuation.code.in_(['002465.XSHE', '002540.XSHE', '600108.XSHG']))
df = get_fundamentals(myq, '2024-04-25')
df

注意:这里不能使用in操作,要使用in_()函数。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

还可以显示部分市值数据字段信息,具体代码如下:

myq1 = query(valuation.pe_ratio, valuation.turnover_ratio).filter(valuation.code.in_(['002465.XSHE', '002540.XSHE', '600108.XSHG']))
df = get_fundamentals(myq, '2024-04-25')
df

image.png

这里显示多只股票的市盈率和换手率信息。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
image.png

还可以设置用不同的财务数据条件,然后把满足条件的部分市值数据字段信息显示出来,具体代码如下:

df3 = get_fundamentals(query(
    valuation.pe_ratio, valuation.turnover_ratio
).filter(
    valuation.market_cap > 1000,
    valuation.pe_ratio < 10,
).order_by(
    # 按市值降序排列
    valuation.market_cap.desc()
).limit(
    # 最多返回100100
),date='2024-04-26')
df3

这时显示的是股票的市盈率和换手率信息,条件是总市值大于1000亿元并且市盈率小于10,选出数据后按总市值降序排列。另外,选出的股票最多显示100只,即如果满足条件的股票大于100只,那么也只显示前100只股票的市值数据信息。

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

利用图表显示市盈率和换手率信息,代码如下:

myc1 = df3['pe_ratio']      # 市盈率
myc2 = df1['turnover_ratio']  # 换手率
plt.figure(figsize=(12, 6))
# 激活第一个subplot
plt.subplot(2, 1, 1)
plt.plot(myc1, '-b')     # 实践蓝色绘制市盈率
plt.subplot(2, 1, 2)
plt.plot(myc2, '-r')    # 实线红色绘制换手率
plt.show()

单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:

image.png

相关文章
|
2月前
|
数据采集 JSON 数据处理
抓取和分析JSON数据:使用Python构建数据处理管道
在大数据时代,电商网站如亚马逊、京东等成为数据采集的重要来源。本文介绍如何使用Python结合代理IP、多线程等技术,高效、隐秘地抓取并处理电商网站的JSON数据。通过爬虫代理服务,模拟真实用户行为,提升抓取效率和稳定性。示例代码展示了如何抓取亚马逊商品信息并进行解析。
抓取和分析JSON数据:使用Python构建数据处理管道
|
21天前
|
图形学 Python
SciPy 空间数据2
凸包(Convex Hull)是计算几何中的概念,指包含给定点集的所有凸集的交集。可以通过 `ConvexHull()` 方法创建凸包。示例代码展示了如何使用 `scipy` 库和 `matplotlib` 绘制给定点集的凸包。
27 1
|
22天前
|
JSON 数据格式 索引
Python中序列化/反序列化JSON格式的数据
【11月更文挑战第4天】本文介绍了 Python 中使用 `json` 模块进行序列化和反序列化的操作。序列化是指将 Python 对象(如字典、列表)转换为 JSON 字符串,主要使用 `json.dumps` 方法。示例包括基本的字典和列表序列化,以及自定义类的序列化。反序列化则是将 JSON 字符串转换回 Python 对象,使用 `json.loads` 方法。文中还提供了具体的代码示例,展示了如何处理不同类型的 Python 对象。
|
22天前
|
数据采集 Web App开发 iOS开发
如何使用 Python 语言的正则表达式进行网页数据的爬取?
使用 Python 进行网页数据爬取的步骤包括:1. 安装必要库(requests、re、bs4);2. 发送 HTTP 请求获取网页内容;3. 使用正则表达式提取数据;4. 数据清洗和处理;5. 循环遍历多个页面。通过这些步骤,可以高效地从网页中提取所需信息。
|
1月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
1月前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
|
2月前
|
Python
python的时间操作time-函数介绍
【10月更文挑战第19天】 python模块time的函数使用介绍和使用。
31 4
|
2月前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
60 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
2月前
|
存储 Python
[oeasy]python038_ range函数_大小写字母的起止范围_start_stop
本文介绍了Python中`range`函数的使用方法及其在生成大小写字母序号范围时的应用。通过示例展示了如何利用`range`和`for`循环输出指定范围内的数字,重点讲解了小写和大写字母对应的ASCII码值范围,并解释了`range`函数的参数(start, stop)以及为何不包括stop值的原因。最后,文章留下了关于为何`range`不包含stop值的问题,留待下一次讨论。
22 1
|
21天前
|
索引 Python
SciPy 空间数据1
SciPy 通过 `scipy.spatial` 模块处理空间数据,如判断点是否在边界内、计算最近点等。三角测量是通过测量角度来确定目标距离的方法。多边形的三角测量可将其分解为多个三角形,用于计算面积。Delaunay 三角剖分是一种常用方法,可以对一系列点进行三角剖分。示例代码展示了如何使用 `Delaunay()` 函数创建三角形并绘制。
28 0