山林 发布于2016-01-21
回复 21
浏览 26520
133
### **JoinQuant 心得——基本面数据**
**by 庸俗神父**
___
聚宽使用两个月,分享些心得,方便后来人。
若朋友们觉得有帮助,回复一下,权当鼓励。
当然,若觉得有疑问或建议,也请告知。
API文档已有一定的说明,故只写重点,但附上API连接,请自行查阅。
- [JoinQuant 心得——股票行情数据](https://www.joinquant.com/post/495)
- [JoinQuant 心得——时间持仓资金数据](https://www.joinquant.com/post/502)
- [JoinQuant 心得——基本面数据](https://www.joinquant.com/post/509)
- [JoinQuant 心得——订单](https://www.joinquant.com/post/521)
- [JoinQuant 心得——回测功能性完善](https://www.joinquant.com/post/542)
- [JoinQuant 心得——数据存取](https://www.joinquant.com/post/580)
___
#### **获取指数的成分股**
get_index_stocks
- [API原文:get_index_stocks](https://www.joinquant.com/api#getindexstocks)
#### **获取行业的所有股票**
get_industry_stocks
- [API原文:get_industry_stocks](https://www.joinquant.com/api#getindustrystocks)
#### **股票是否是ST**
get_extras
- [API原文:get_extras](https://www.joinquant.com/api#getextras)
- 目前(20160121),此处ST的含义包括ST和*ST,所以ST和*ST无法区分。
#### **财务数据**
get_fundamentals
- [API原文:get_fundamentals](https://www.joinquant.com/api#getfundamentals)
- [JoinQuant-财务数据汇总表](https://www.joinquant.com/help/api/fundamentals)
- 查询指定日期date所能看到的**最近的数据**。(对市值表来说, 最近一天, 对其他表来说, 最近一个季度)
- 为了防止返回数据量过大, 我们**每次最多返回10000行**
- 当相关股票上市前、退市后,财务数据返回**各字段为空**
- 只能查询单独一个时间的。
- **返回的是pandas.DataFrame格式。**
样例
```
get_fundamentals(query(
# 查询内容
valuation.code # 市值表.股票代码
,valuation.market_cap # 市值表.市值
,valuation.pe_ratio # 市值表.动态市盈率
,income.total_operating_revenue # 利润表.营业总收入
).filter(
# 筛选条件
valuation.market_cap > 1000 # 市值表.市值 大于 1000
,valuation.pe_ratio < 10 # 市值表.动态市盈率 小于 10
,income.total_operating_revenue > 2e10 # 利润表.营业总收入 大于 200 0000 0000
).order_by(
# 排序方法
valuation.market_cap.desc()# 按照 市值表.市值.进行降序排列
).limit(
# 数量限制
100
), date='2015-10-15' # 时间
)
```
___
#### **DataFrame 简单讲解**
**导入模块**
- 通常使用DataFrame需要导入pandas和numpy,有时不需要。不妨每次用就都导入吧。
- 代码:
```
import pandas as pd
import numpy as np
```
**常用代码**
- df.index 取出行索引
- df.colunms 取出列索引
- df.values 取出值
- df['colunm_name'] 取出列索引为'colunm_name'的列
- df.loc['index_name'] 取出行索引为'index_name'的行
- df.ix[x,y] 取出第x行,第y列的值
样例
```
# 该段程序只能在策略中使用,不能在研究中用
# 回测时间为20151129-20151130
# 资金100000
import pandas as pd
import numpy as np
def initialize(context):
# 定义一个全局变量, 保存要操作的股票
g.security = ['000001.XSHE','000002.XSHE']
# 设置我们要操作的股票池
set_universe(g.security)
# 每个单位时间(如果按天回测,则每天调用一次,如果按分钟,则每分钟调用一次)调用一次
def handle_data(context, data):
df=get_fundamentals(query(
# 查询内容
valuation.code # 市值表.股票代码
,valuation.market_cap # 市值表.市值
,valuation.pe_ratio # 市值表.动态市盈率
,income.total_operating_revenue # 利润表.营业总收入
).filter(
# 筛选条件
valuation.market_cap > 1000 # 市值表.市值 大于 1000
,valuation.pe_ratio < 10 # 市值表.动态市盈率 小于 10
,income.total_operating_revenue > 2e10 # 利润表.营业总收入 大于 200 0000 0000
).order_by(
# 排序方法
valuation.market_cap.desc()# 按照 市值表.市值.进行降序排列
).limit(
# 数量限制
4
), date='2015-10-15' # 时间
)
print df
print df.index #取出行索引
print df.columns #取出列索引
print df.values #取出值
print df['pe_ratio'] #取出列索引为'pe_ratio'的列
print df.loc[0] #取出行索引为0的行
print df.ix[1,2] #取出第1行,第2列的值
```
输出:
```
2015-11-30 09:30:00 - INFO -
code market_cap pe_ratio total_operating_revenue
0 601398.XSHG 16002.6396 5.78 1.750780e+11
1 601939.XSHG 13575.5996 5.93 1.486750e+11
2 601988.XSHG 11451.6904 6.71 1.181210e+11
3 601288.XSHG 10166.0596 5.66 1.347040e+11
2015-11-30 09:30:00 - INFO - Int64Index([0, 1, 2, 3], dtype='int64')
2015-11-30 09:30:00 - INFO - Index([u'code', u'market_cap', u'pe_ratio', u'total_operating_revenue'], dtype='object')
2015-11-30 09:30:00 - INFO -
[['601398.XSHG' 16002.6396 5.78 175077998592.0]
['601939.XSHG' 13575.5996 5.93 148675002368.0]
['601988.XSHG' 11451.6904 6.71 118120996864.0]
['601288.XSHG' 10166.0596 5.66 134703996928.0]]
2015-11-30 09:30:00 - INFO -
0 5.78
1 5.93
2 6.71
3 5.66
Name: pe_ratio, dtype: float64
2015-11-30 09:30:00 - INFO -
code 601398.XSHG
market_cap 16002.64
pe_ratio 5.78
total_operating_revenue 1.75078e+11
Name: 0, dtype: object
2015-11-30 09:30:00 - INFO - 5.93
```
评论
赞一个 完全可以当JoinQuant文档的注解了
2016-01-21
非常好,可以直接用来进行各种选股策略的编写了。赞一个。
2016-01-24
现在总算看明白了。
可否讲解Query对象?哈哈……
2016-02-06
同求query用法,哈哈哈 @庸俗神父
2016-02-06
Query对象是吧,以后考虑更新
2016-02-06
赞!手册多几个类似这样的例子会更加容易用
2016-03-03
为什么设置的时间是10.15,输出的却是11.30呢?
2016-10-30
我是量化新手,有个问题我不知道理解的对不对,想请教下。比如:get_index_stocks,get_industry_stocks,get_extras,get_fundamentals
这些接口都是JoinQuant封装好的python库,然后想量化投资者提供这些API,投资者直接利用这些API来实现常用功能,避免了投资者去具体实现这些API的功能。这样理解对吗?
2017-04-08
100>valuation.market_cap
或者valuation.market_cap > 1000
楼主,想多一个条件,市值在<100或>1000中,别的条件不变,怎么实现?
2017-09-20
@为己之学
filter(valuation.market_cap<100,valuation.market_cap>1000
,valuation.pe_ratio< 10
就直接把原作中的valuation.market_cap > 1000这句,换为上面的2句,后面不变
2018-01-04
真心感谢您的辛苦总结,真的帮了我很大忙,感谢!!
2019-05-26