要利用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),运行结果如下图所示:
利用函数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),运行结果如下图所示:
如果只想显示3只股票的昨日的开盘价信息,则实现代码如下:
print('三只股票昨日的开盘价格:')
print(df.iloc[-1])
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
如果只想显示某一只股票的昨日开盘价信息,则实现代码如下:
print('海格通信昨日开盘价信息:')
print(df['002465.XSHE'][-1])
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
还可以利用mean()函数求平均价格,具体实现代码如下:
print('三只股票近100日的开盘价的平均价格是:\n', df.mean())
print('海格通信近100日的开盘价的平均价格是:\n', f"{df['002465.XSHE'].mean():.2f}")
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
最后利用图表显示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),运行结果如下图所示:
获取一只股票多个数据字段函数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),运行结果如下图所示:
显示海格通信的昨日收盘价信息和10日收盘价的平均价,具体代码如下:
print('海格通信(002465)的昨日收盘价:', df['close'][-1])
print('海格通信(002465)的10日收盘价的平均价:', df['close'].mean())
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
假如想显示海格通信(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),运行结果如下图所示:
利用函数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),运行结果如下图所示:
如果想查看近100个交易日收盘为阳线的报价信息,即查看收盘价大于开盘价的报价信息,实现代码如下:
df[myc2 > myc1]
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
如果想要显示收盘价大于100日均线的报价信息,实现代码如下:
myc3 = df['close'].mean()
df[myc2 > myc3]
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
利用图表显示收盘价大于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),运行结果如下图所示:
查询单个交易日财务数据函数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),运行结果如下图所示:
市值数据字段的意义如下:
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),运行结果如下图所示:
还可以显示部分市值数据字段信息,具体代码如下:
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
这里显示多只股票的市盈率和换手率信息。
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
还可以设置用不同的财务数据条件,然后把满足条件的部分市值数据字段信息显示出来,具体代码如下:
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(
# 最多返回100个
100
),date='2024-04-26')
df3
这时显示的是股票的市盈率和换手率信息,条件是总市值大于1000亿元并且市盈率小于10,选出数据后按总市值降序排列。另外,选出的股票最多显示100只,即如果满足条件的股票大于100只,那么也只显示前100只股票的市值数据信息。
单击工具栏按钮,快捷键(shift+enter),运行结果如下图所示:
利用图表显示市盈率和换手率信息,代码如下:
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),运行结果如下图所示: