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

相关文章
|
8天前
|
数据采集 Web App开发 数据可视化
Python用代理IP获取抖音电商达人主播数据
在当今数字化时代,电商直播成为重要的销售模式,抖音电商汇聚了众多达人主播。了解这些主播的数据对于品牌和商家至关重要。然而,直接从平台获取数据并非易事。本文介绍如何使用Python和代理IP高效抓取抖音电商达人主播的关键数据,包括主播昵称、ID、直播间链接、观看人数、点赞数和商品列表等。通过环境准备、代码实战及数据处理与可视化,最终实现定时任务自动化抓取,为企业决策提供有力支持。
|
17天前
|
Python
[oeasy]python057_如何删除print函数_dunder_builtins_系统内建模块
本文介绍了如何删除Python中的`print`函数,并探讨了系统内建模块`__builtins__`的作用。主要内容包括: 1. **回忆上次内容**:上次提到使用下划线避免命名冲突。 2. **双下划线变量**:解释了双下划线(如`__name__`、`__doc__`、`__builtins__`)是系统定义的标识符,具有特殊含义。
26 3
|
21天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
33 2
|
28天前
|
数据采集 Web App开发 监控
Python爬虫:爱奇艺榜单数据的实时监控
Python爬虫:爱奇艺榜单数据的实时监控
|
6天前
|
存储 人工智能 Python
[oeasy]python061_如何接收输入_input函数_字符串_str_容器_ 输入输出
本文介绍了Python中如何使用`input()`函数接收用户输入。`input()`函数可以从标准输入流获取字符串,并将其赋值给变量。通过键盘输入的值可以实时赋予变量,实现动态输入。为了更好地理解其用法,文中通过实例演示了如何接收用户输入并存储在变量中,还介绍了`input()`函数的参数`prompt`,用于提供输入提示信息。最后总结了`input()`函数的核心功能及其应用场景。更多内容可参考蓝桥、GitHub和Gitee上的相关教程。
9 0
|
1月前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
58 18
|
1月前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
77 8
|
1月前
|
Python
Python中的函数
Python中的函数
51 8
|
23天前
|
数据采集 存储 XML
python实战——使用代理IP批量获取手机类电商数据
本文介绍了如何使用代理IP批量获取华为荣耀Magic7 Pro手机在电商网站的商品数据,包括名称、价格、销量和用户评价等。通过Python实现自动化采集,并存储到本地文件中。使用青果网络的代理IP服务,可以提高数据采集的安全性和效率,确保数据的多样性和准确性。文中详细描述了准备工作、API鉴权、代理授权及获取接口的过程,并提供了代码示例,帮助读者快速上手。手机数据来源为京东(item.jd.com),代理IP资源来自青果网络(qg.net)。
|
1月前
|
数据采集 分布式计算 大数据
构建高效的数据管道:使用Python进行ETL任务
在数据驱动的世界中,高效地处理和移动数据是至关重要的。本文将引导你通过一个实际的Python ETL(提取、转换、加载)项目,从概念到实现。我们将探索如何设计一个灵活且可扩展的数据管道,确保数据的准确性和完整性。无论你是数据工程师、分析师还是任何对数据处理感兴趣的人,这篇文章都将成为你工具箱中的宝贵资源。

热门文章

最新文章