本文是量化交易零基础入门教程的第七篇。
之前讲过怎么看API文档以及函数参数的含义,现在应该能直接看说明使用了。补充一个更详细点的例子应该就会用了。
# 获取20180301时,上证50指数(000016.XSHG)成分股
t=get_index_stocks("000016.XSHG","2018-03-01")
print(t[0])
print(t)
# 打印日志如下。股票代码在list中被打印出来前面会带有的u代表是对字符串进行unicode编码(略复杂,不懂没关系),只是显示效果,单独打印t[0]时就没有u。
# 600000.XSHG
# [u'600000.XSHG', u'600016.XSHG', u'600019.XSHG', u'600028.XSHG', u'600029.XSHG', u'600030.XSHG', u'600036.XSHG', u'600048.XSHG', u'600050.XSHG', u'600104.XSHG', u'600111.XSHG', u'600309.XSHG', u'600340.XSHG', u'600518.XSHG', u'600519.XSHG', u'600547.XSHG', u'600606.XSHG', u'600837.XSHG', u'600887.XSHG', u'600919.XSHG', u'600958.XSHG', u'600999.XSHG', u'601006.XSHG', u'601088.XSHG', u'601166.XSHG', u'601169.XSHG', u'601186.XSHG', u'601211.XSHG', u'601229.XSHG', u'601288.XSHG', u'601318.XSHG', u'601328.XSHG', u'601336.XSHG', u'601390.XSHG', u'601398.XSHG', u'601601.XSHG', u'601628.XSHG', u'601668.XSHG', u'601669.XSHG', u'601688.XSHG', u'601766.XSHG', u'601800.XSHG', u'601818.XSHG', u'601857.XSHG', u'601878.XSHG', u'601881.XSHG', u'601985.XSHG', u'601988.XSHG', u'601989.XSHG', u'603993.XSHG']
history
接下来介绍的API还会有skip_paused、df、fq参数,就不再提了。这三个参数新手可以以后慢慢了解,现在不管也没关系,如果不想用dataframe,会把df参数调成False(或0)就行。
# 例子 df=True,返回dataframe类型
w=history(count=3, field='money', security_list=['000001.XSHE','000002.XSHE'])
print(w)
# 结果如下:
# 000001.XSHE 000002.XSHE
# 2016-08-29 5.322954e+08 1.796321e+09
# 2016-08-30 5.618541e+08 2.072873e+09
# 2016-08-31 4.638758e+08 5.748581e+09
# 例子 df=False,返回dict类型
w=history(count=3, field='money', security_list=['000001.XSHE','000002.XSHE'],df=False)
print(w)
# 结果如下:
# {'000001.XSHE': array([ 5.32295362e+08, 5.61854066e+08, 4.63875763e+08]), '000002.XSHE': array([ 1.79632055e+09, 2.07287325e+09, 5.74858107e+09])}
attribute_history
默认跳过不交易日期,由skip_paused参数控制。
# 例子
w=attribute_history(security='000001.XSHE',count=3, fields=['money','high'])
print(w)
# 结果如下:
# money high
# 2016-08-29 5.322954e+08 9.31
# 2016-08-30 5.618541e+08 9.33
# 2016-08-31 4.638758e+08 9.36
Pandas.DataFrame
返回的财务数据是DataFrame类型,这是一种二维表结构的功能强大的数据类型,常用于数据处理与分析。我们以刚刚的例子介绍下dataframe最常用的获取数据的方法。
# 一个dataframe类型的例子
w=attribute_history(security='000001.XSHE',count=3, fields=['money','high','open'])
print(w)
# 结果如下:
# money high open
# 2016-08-30 5.618541e+08 9.33 9.29
# 2016-08-31 4.638758e+08 9.36 9.32
# 2016-09-01 4.548486e+08 9.38 9.35
dataframe是一个二维表,包括index(行标签、索引)、columns(列标签)、values(值)三个部分。取用方法如下,注意三个部分的数据类型不是固定的,因此功能很灵活但也更难使用。
# 获取index
print(w.index)
# 结果如下,是datatimeindex类型,很特殊,不常用,建议新手回避。
# DatetimeIndex(['2016-08-30', '2016-08-31', '2016-09-01'], dtype='datetime64[ns]', freq=None, tz=None)
# 获取columns
print(w.columns)
# 结果如下,是index类型
# Index([u'money', u'high', u'open'], dtype='object')
# 可以用list()将其转成list
print(list(w.columns))
# 结果如下
# ['money', 'high', 'open']
# 获取values
print(w.values)
# 结果如下,是一个嵌套的list
# [[ 5.61854066e+08 9.33000000e+00 9.29000000e+00]
# [ 4.63875763e+08 9.36000000e+00 9.32000000e+00]
# [ 4.54848634e+08 9.38000000e+00 9.35000000e+00]]
选择dataframe某几列
# 按标签获取某几列.loc[:,[列标签名,...]]
print(w.loc[:,['open','high']])
# 结果如下
# open high
# 2016-08-29 9.28 9.31
# 2016-08-30 9.29 9.33
# 2016-08-31 9.32 9.36
# 按位置获取某几列.iloc[:,[位置,...]],位置的含义是第几个,从0开始。下文同。
print(w.iloc[:,[0,2]])
# 结果如下
# money open
# 2016-08-29 5.322954e+08 9.28
# 2016-08-30 5.618541e+08 9.29
# 2016-08-31 4.638758e+08 9.32
# : 即冒号,可以代表全部,iloc或loc都可以。
print(w.iloc[:,:])
# 结果如下
# money high open
# 2016-08-29 5.322954e+08 9.31 9.28
# 2016-08-30 5.618541e+08 9.33 9.29
# 2016-08-31 4.638758e+08 9.36 9.32
# 选择后的数据依然是dataframe类型,用.values可以获取数据。对后文的行情况也成立。
print(w.iloc[:,[0,2]].values)
# 结果如下,是个list
# [[ 5.61854066e+08 9.29000000e+00]
# [ 4.63875763e+08 9.32000000e+00]
# [ 4.54848634e+08 9.35000000e+00]]
选择dataframe某几行
# 按标签获取某几行.loc[[行标签名,...],:]
print(w.loc[['2016-08-29','2016-08-31'],:])
# 此处这样写会报错,原因是当前的行标签类型是DatetimeIndex,不是字符串,所以使用标签名时要注意数据类型。而时间类型的数据处理往往非常麻烦,因此行或列标签名是日期情况下建议新手回避,改使用位置获取。
# 按位置获取某几行.iloc[[位置,...],:]
print(w.iloc[[0,2],:])
# 结果如下
# money high open
# 2016-08-29 5.322954e+08 9.31 9.28
# 2016-08-31 4.638758e+08 9.36 9.32
# : 即冒号,行情况下依然可以代表全部
print(w.loc[:,:])
# 结果如下
# money high open
# 2016-08-29 5.322954e+08 9.31 9.28
# 2016-08-30 5.618541e+08 9.33 9.29
# 2016-08-31 4.638758e+08 9.36 9.32
dataframe 行列转置
# 行列转置的意思就是按对角线行列反转,方法是.T
print(w.T)
# 结果如下
# 2016-08-29 2016-08-30 2016-08-31
# money 5.322954e+08 5.618541e+08 4.638758e+08
# high 9.310000e+00 9.330000e+00 9.360000e+00
# open 9.280000e+00 9.290000e+00 9.320000e+00
股票财务数据这里是指发股票的公司发布的财务报表中的数据。可以在聚宽数据-股票财务数据查看数据详情。
财务报表简称财报,是用来向股东汇报企业经营情况的,上市公司必须按季度公布财报,一年有四季所以财报依发布次序一季报、半年报(也称中报)、三季报、年报,而具体的发布日期在一定期限内即可并非固定,年报要求年度结束四个月内披露,半年报是上半年结束后两个月内,一季报与三季报是季度结束后一个月内。特别的是像总市值、市盈率这种跟股价挂钩的市值数据是每天更新的。
query_object参数以及快速上手模板
query_object参数是要求传入一个Query对象用于描述所需的数据,这个东西展开讲相当于一门小的编程语言,麻烦而不必要,这里提供一个快速上手的模板用来产生query_object参数,多数情况下往里套就可以了,例子如下,建议对比文档里的例子看看。
# 快速上手模板
# query(表.字段).filter(筛选条件).order_by(排序方法).limit(数量上限)
#比较长的话可以分行写
表和字段可以在财务数据文档查看,如下。表和字段可以写多个用逗号隔开,只写表名不写字段代表选择该表的所有字段。注意看含义与单位。
筛选条件跟讲if判断时用的条件是一样的,多个条件用逗号隔开代表与(and)的关系。特别的是要用复杂的与或非的逻辑关系时,在此处and、or、not是不能用的,要对应的改用&(与)、|(或)、~(非)。
数量上限可以自己设置,代表最多返回的数据条数。不过系统强制限制每次最多返回10000条,就算你自己在此处限制比10000多也没用。
# 例子
# 获取 市值表.股票代码,资产负债表.未分配利润
q=query(valuation.code,balance.retained_profit
# 筛选 市值大于100 并且 市盈率小于10
).filter(valuation.market_cap>100,valuation.pe_ratio < 10
# 排序 按市值从大到小排
).order_by(valuation.market_cap.desc()
# 数量 上限10条数据
).limit(10)
w=get_fundamentals(q)
print(w)
# 结果如下:
# code retained_profit
# 0 601398.XSHG 8.566400e+11
# 1 601939.XSHG 7.400340e+11
# 2 601288.XSHG 4.644490e+11
# 3 601988.XSHG 5.267460e+11
# 4 600036.XSHG 1.816520e+11
# 5 601328.XSHG 9.208500e+10
# 6 600000.XSHG 1.037620e+11
# 7 600016.XSHG 1.277570e+11
# 8 601166.XSHG 1.573490e+11
# 9 601998.XSHG 1.298680e+11