JAQS¶
在这里,你将可以获得:
- 使用数据API,轻松获取研究数据
- 根据策略模板,编写自己的量化策略
- 使用回测框架,对策略进行回测和验证
查看代码,请点击GitHub
Install Guide¶
A detailed step-by-step description of installation.
JAQS安装步骤¶
1、安装Python环境¶
运行JAQS需要Python环境,可通过在控制台(Windows系统为命令提示符,Linux系统为终端)运行python
命令确定系统是否安装。
如果本地还没有安装Python环境,或已安装的Python不是Anaconda,强烈建议按下方步骤安装,Anaconda是集成开发环境,其中包含稳定版Python和众多常用包,且易于安装,避免不必要的麻烦;如果已经装好了Anaconda,可直接看下一步骤安装依赖包。
*如何安装Anaconda*:
打开Anaconda官网,选择相应的操作系统,确定要按照的Python版本,一般建议用Python 2.7。
下载完成以后,按照图形界面步骤完成安装。在默认情况下,Anaconda会自动设置PATH环境。
- 安装完成后,
windows下我们可以在系统菜单中看如下程序目录:
在cmd里执行
ipython
命令,可以调出IPython调试器。
2、安装依赖包¶
除Anaconda中已包含的常用包外,JAQS还有些额外的依赖,这些依赖可在使用pip
安装JAQS的过程中自动安装,唯一需要注意的是,python-snappy
这个包在Windows(及部分Linux)系统上的安装需要比较多的编译依赖,建议从这个网页下载编译好的包,然后安装:
pip install python_snappy-0.5.1-cp27-cp27m-win_amd64.whl # 具体文件名可能不同, 取决于系统版本
装好python-snappy
后,即可使用pip
直接安装JAQS和其他依赖包,见下一节安装JAQS。
如果希望手动安装依赖:
- 可以在jaqs程序目录下,执行
pip install -r requirements.txt
一次完成所有依赖的安装。 - 也可以通过单个安装完成,例如:
pip install pyzmq
用户手册¶
一个简洁清晰的入门指南, 涵盖各个功能模块.
用户手册¶
本页面给用户提供了一个简洁清晰的入门指南,涵盖各个功能模块
数据API¶
本产品提供了金融数据api,方便用户调用接口获取各种数据,通过python的api调用接口,返回DataFrame格式的数据和消息,以下是用法
导入接口¶
在python程序里面导入module,然后用注册的用户帐号登录就可以使用行情和参考数据的接口来获取数据了
引入模块¶
from jaqs.data.dataapi import DataApi
登录数据服务器¶
api = DataApi()
api.login("demo", "666666") # 示例账户,用户需要改为自己注册的账户
行情数据获取¶
获取实时行情¶
使用quote()函数查询最新市场行情。
输入参数:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
symbol | string | 标的代码,支持多标的查询 | 不可缺省 |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 | “” |
使用示例:
df,msg = api.quote("000001.SH, cu1709.SHF", fields="open,high,low,last,volume")
输出字段:
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 标的代码 |
code | string | 交易所原始代码 |
date | int | 自然日,YYYYMMDD格式,如20170823 |
time | int | 时间,精确到毫秒,如14:21:05.330记为142105330 |
trade_date | int | YYYYMMDD格式,如20170823 |
open | double | 开盘价 |
high | double | 最高价 |
low | double | 最低价 |
last | double | 最新价 |
close | double | 收盘价 |
volume | double | 成交量(总) |
turnover | double | 成交金额(总) |
vwap | double | 截止到行情时间的日内成交均价 |
oi | double | 持仓总量 |
settle | double | 今结算价 |
iopv | double | 净值估值 |
limit_up | double | 涨停价 |
limit_down | double | 跌停价 |
preclose | double | 昨收盘价 |
presettle | double | 昨结算价 |
preoi | double | 昨持仓 |
askprice1 | double | 申卖价1 |
askprice2 | double | 申卖价2 |
askprice3 | double | 申卖价3 |
askprice4 | double | 申卖价4 |
askprice5 | double | 申卖价5 |
bidprice1 | double | 申买价1 |
bidprice2 | double | 申买价2 |
bidprice3 | double | 申买价3 |
bidprice4 | double | 申买价4 |
bidprice5 | double | 申买价5 |
askvolume1 | double | 申卖量1 |
askvolume2 | double | 申卖量2 |
askvolume3 | double | 申卖量3 |
askvolume4 | double | 申卖量4 |
askvolume5 | double | 申卖量5 |
bidvolume1 | double | 申买量1 |
bidvolume2 | double | 申买量2 |
bidvolume3 | double | 申买量3 |
bidvolume4 | double | 申买量4 |
bidvolume5 | double | 申买量5 |
获取日线行情¶
代码示例:
df, msg = api.daily(
symbol="600832.SH, 600030.SH",
start_date="2012-10-26",
end_date="2012-11-30",
fields="",
adjust_mode="post")
结果示例(前5条记录):
close | code | high | low | oi | open | settle | symbol | trade_date | trade_status | turnover | volume | vwap |
---|---|---|---|---|---|---|---|---|---|---|---|---|
5.09 | 600832 | 5.24 | 5.08 | NaN | 5.23 | NaN | 600832.SH | 20121026 | 交易 | 2.779057e+07 | 5381800 | 5.16 |
5.10 | 600832 | 5.15 | 5.08 | NaN | 5.11 | NaN | 600832.SH | 20121029 | 交易 | 1.320333e+07 | 2582557 | 5.11 |
5.11 | 600832 | 5.18 | 5.08 | NaN | 5.12 | NaN | 600832.SH | 20121030 | 交易 | 1.622705e+07 | 3170615 | 5.12 |
5.11 | 600832 | 5.14 | 5.09 | NaN | 5.12 | NaN | 600832.SH | 20121031 | 交易 | 1.072007e+07 | 2097770 | 5.11 |
5.18 | 600832 | 5.20 | 5.12 | NaN | 5.12 | NaN | 600832.SH | 20121101 | 交易 | 1.972100e+07 | 3814712 | 5.17 |
获取分钟线行情(不含ask,bid信息)¶
代码示例:
df,msg = api.bar(
symbol="600030.SH",
trade_date=20170928,
freq="5M",
start_time="00:00:00",
end_time="16:00:00",
fields="")
结果示例(前5条记录):
close | code | date | freq | high | low | oi | open | settle | symbol | time | trade_date | turnover | volume | vwap |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
18.05 | 600030 | 20170928 | 5M | 18.08 | 18.00 | NaN | 18.01 | NaN | 600030.SH | 93500 | 20170928 | 13576973.0 | 752900 | 18.032903 |
18.03 | 600030 | 20170928 | 5M | 18.06 | 18.01 | NaN | 18.04 | NaN | 600030.SH | 94000 | 20170928 | 16145566.0 | 895110 | 18.037522 |
18.04 | 600030 | 20170928 | 5M | 18.05 | 18.02 | NaN | 18.03 | NaN | 600030.SH | 94500 | 20170928 | 11024829.0 | 611400 | 18.032105 |
17.99 | 600030 | 20170928 | 5M | 18.05 | 17.97 | NaN | 18.04 | NaN | 600030.SH | 95000 | 20170928 | 30021003.0 | 1667190 | 18.006948 |
18.02 | 600030 | 20170928 | 5M | 18.03 | 17.97 | NaN | 17.98 | NaN | 600030.SH | 95500 | 20170928 | 13691203.0 | 761161 | 17.987263 |
获取分钟线行情(包含ask,bid信息)¶
代码示例:
df,msg = api.bar_quote(
symbol="000001.SH,cu1709.SHF",
start_time = "09:56:00",
end_time="13:56:00",
trade_date=20170823,
freq= "5M",
fields="open,high,low,last,volume")
结果示例(前5条记录):
high | low | symbol | time | trade_date | volume |
---|---|---|---|---|---|
3294.3371 | 3291.7666 | 000001.SH | 100000 | 20170823 | 493058300 |
3292.3162 | 3289.5202 | 000001.SH | 100500 | 20170823 | 492695100 |
3290.4118 | 3288.3906 | 000001.SH | 101000 | 20170823 | 458298100 |
3289.2133 | 3285.9129 | 000001.SH | 101500 | 20170823 | 535085000 |
3287.4892 | 3284.6076 | 000001.SH | 102000 | 20170823 | 426738700 |
基本数据获取¶
获取证券基础信息¶
代码示例:
df, msg = api.query(
view="lb.instrumentInfo",
fields="status,list_date, fullname_en, market",
filter="inst_type=&status=1&symbol=",
data_format='pandas')
结果示例(前5条记录):
list_date | market | name | status | symbol |
---|---|---|---|---|
20021231 | 89 | 长期债券指数_10年以上 | 1 | Y60001 |
20021231 | 89 | 银行间债券总指数_1年以下 | 1 | Y70000 |
20021231 | 89 | 银行间债券总指数_1-3年 | 1 | Y70001 |
20021231 | 89 | 银行间债券总指数_3-5年 | 1 | Y70003 |
20021231 | 89 | 银行间债券总指数_5-7年 | 1 | Y70005 |
获取指数基本信息¶
代码示例:
df, msg = api.query(
view="lb.indexInfo",
fields="",
filter="",
data_format='pandas')
结果示例(前5条记录):
获取交易日历¶
代码示例:
df, msg = api.query(
view="jz.secTradeCal",
fields="date,market,istradeday,isweekday,isholiday",
filter="market=1&start_date=20170101&end_date=20170801",
data_format='pandas')
结果示例(前5条记录):
isholiday | istradeday | isweekday | trade_date |
---|---|---|---|
F | T | T | 20170103 |
F | T | T | 20170104 |
F | T | T | 20170105 |
F | T | T | 20170106 |
F | T | T | 20170109 |
获取分配除权信息¶
代码示例:
df, msg = api.query(
view="lb.secDividend",
fields="",
filter="start_date=20170101&end_date=20170801",
data_format='pandas')
结果示例(前5条记录):
ann_date | bonus_list_date | cash | cash_tax | cashpay_date | end_date | exdiv_date | publish_date | record_date | share_ratio | share_trans_ratio | symbol |
---|---|---|---|---|---|---|---|---|---|---|---|
20161025 | 0.20000000 | 0.20000000 | 20170103 | 20160930 | 20170103 | 20161227 | 20161230 | 0.0 | 0.000000 | 002059.SZ | |
20170117 | 20170217 | 3.60000000 | 3.60000000 | 20170217 | 20161231 | 20170217 | 20170210 | 20170216 | 0.0 | 5.000000 | 300561.SZ |
20161105 | 0.50000000 | 0.50000000 | 20170216 | 20160630 | 20170216 | 20170210 | 20170215 | 0.0 | 0.000000 | 601900.SH | |
20170120 | 4.50000000 | 4.50000000 | 20170303 | 20161231 | 20170303 | 20170224 | 20170302 | 0.0 | 0.000000 | 603025.SH | |
20170125 | 20170307 | 6.00000000 | 6.00000000 | 20170306 | 20161231 | 20170306 | 20170227 | 20170303 | 0.0 | 12.000000 | 600816.SH |
获取复权因子¶
代码示例:
df, msg = api.query(
view="lb.secAdjFactor",
fields="",
filter="symbol=002059&start_date=20170101&end_date=20170801",
data_format='pandas')
结果示例(前5条记录):
adjust_factor | symbol | trade_date |
---|---|---|
2.077892 | 002059.SZ | 20170103 |
2.077892 | 002059.SZ | 20170104 |
2.077892 | 002059.SZ | 20170105 |
2.077892 | 002059.SZ | 20170106 |
2.077892 | 002059.SZ | 20170109 |
获取停牌信息¶
代码示例:
df, msg = api.query(
view="lb.secSusp",
fields="susp_time",
filter="symbol=002059",
data_format='pandas')
结果示例(前5条记录):
ann_date | resu_date | susp_date | susp_reason | susp_time | symbol |
---|---|---|---|---|---|
20080408 | 20080409 | 20080408 | 召开股东大会 | 9:30:00 | 002059.SZ |
20080612 | 20080613 | 20080612 | 召开股东大会 | 9:30:00 | 002059.SZ |
20080922 | 20080922 | 20080922 | 异常波动 | 9:30:00 | 002059.SZ |
20090220 | 20090223 | 20090220 | 召开股东大会 | 9:30:00 | 002059.SZ |
20090417 | 20090420 | 20090417 | 召开股东大会 | 9:30:00 | 002059.SZ |
获取行业分类¶
代码示例:
df, msg = api.query(
view="lb.secIndustry",
fields="",
filter="industry1_name=金融&industry2_name=金融&industry_src=中证",
data_format='pandas')
结果示例(前5条记录):
in_date | industry1_code | industry1_name | industry2_code | industry2_name | industry3_code | industry3_name | industry4_code | industry4_name | industry_src | is_new | out_date | symbol |
---|---|---|---|---|---|---|---|---|---|---|---|---|
20130219 | J | 金融业 | J66 | 货币金融服务 | 中证指数有限公司 | Y | 000001.SZ | |||||
20130219 | J | 金融业 | J69 | 其他金融业 | 中证指数有限公司 | Y | 000563.SZ | |||||
20130219 | J | 金融业 | J66 | 货币金融服务 | 中证指数有限公司 | Y | 600000.SH | |||||
20130219 | J | 金融业 | J66 | 货币金融服务 | 中证指数有限公司 | Y | 600015.SH | |||||
20130219 | J | 金融业 | J66 | 货币金融服务 | 中证指数有限公司 | Y | 600016.SH |
获取指数成份¶
代码示例:
df, msg = api.query(
view="lb.indexCons",
fields="",
filter="index_code=399001&is_new=Y",
data_format='pandas')
结果示例(前5条记录):
in_date | index_code | out_date | symbol |
---|---|---|---|
20140814 | 000001.SH | 603126.SH | |
20140815 | 000001.SH | 603111.SH | |
20090511 | 000001.SH | 600372.SH | |
20140819 | 000001.SH | 603100.SH | |
20140822 | 000001.SH | 603609.SH |
获取常量参数¶
代码示例:
df, msg = api.query(
view="jz.sysConstants",
fields="",
filter="code_type=symbol_type",
data_format='pandas')
结果示例(前5条记录):
code | code_type | value |
---|---|---|
1 | inst_type | 股票 |
10 | inst_type | 回购 |
100 | inst_type | 指数 |
101 | inst_type | 股指期货 |
102 | inst_type | 国债期货 |
获取日行情估值¶
代码示例:
df, msg = api.query(
view="lb.secDailyIndicator",
fields='pb,net_assets,ncf,price_level',
filter='symbol=000063.SZ&start_date=20170605&end_date=20170701')
结果示例(前5条记录):
close_price | float_market_value | high_52w | low_52w | net_assets | pb | pe | price_level | share_float_free | symbol | total_market_value | trade_date |
---|---|---|---|---|---|---|---|---|---|---|---|
19.62 | 6.726969e+06 | 20.05 | 13.07 | 3.659734e+10 | 2.2457 | 0.0 | 0 | 215879.8077 | 000063.SZ | 8.218724e+06 | 20170605 |
19.81 | 6.792113e+06 | 20.05 | 13.07 | 3.659734e+10 | 2.2675 | 0.0 | 0 | 215879.8077 | 000063.SZ | 8.298314e+06 | 20170606 |
20.59 | 7.059546e+06 | 20.80 | 13.07 | 3.659734e+10 | 2.3567 | 0.0 | 0 | 215879.8077 | 000063.SZ | 8.625052e+06 | 20170607 |
20.63 | 7.073260e+06 | 21.05 | 13.07 | 3.659734e+10 | 2.3613 | 0.0 | 0 | 215879.8077 | 000063.SZ | 8.641808e+06 | 20170608 |
20.98 | 7.193262e+06 | 21.09 | 13.07 | 3.659734e+10 | 2.4014 | 0.0 | 0 | 215879.8077 | 000063.SZ | 8.788421e+06 | 20170609 |
获取资产负债表¶
代码示例:
df, msg = api.query(
view="lb.balanceSheet",
fields="",
filter="symbol=002636.SZ",
data_format='pandas')
结果示例(前5条记录):
acct_rcv | ann_date | inventories | notes_rcv | report_date | report_type | symbol | tot_cur_assets |
---|---|---|---|---|---|---|---|
2.035835e+08 | 20130318 | 7.627147e+07 | 1.737082e+08 | 20121231 | 408006000 | 002636.SZ | 1.074759e+09 |
7.050691e+08 | 20130425 | 1.685824e+08 | 2.460369e+08 | 20130331 | 408001000 | 002636.SZ | 1.890115e+09 |
2.436788e+08 | 20120421 | 6.736024e+07 | 5.982293e+07 | 20101231 | 408009000 | 002636.SZ | 4.718200e+08 |
2.495033e+08 | 20120424 | 1.077278e+08 | 1.173246e+08 | 20120331 | 408006000 | 002636.SZ | 1.133775e+09 |
2.035835e+08 | 20140422 | 7.627147e+07 | 1.737082e+08 | 20121231 | 408009000 | 002636.SZ | 1.074759e+09 |
获取利润表¶
代码示例:
df, msg = api.query(
view="lb.income",
fields="",
filter="symbol=600030.SH,000063.SZ,000001.SZ&report_type=408002000&start_date=20160601&end_date=20170601",
data_format='pandas')
结果示例(前5条记录):
ann_date | int_income | less_handling_chrg_comm_exp | net_int_income | oper_exp | oper_profit | oper_rev | report_date | symbol | tot_oper_cost | tot_profit | total_oper_rev |
---|---|---|---|---|---|---|---|---|---|---|---|
20160812 | 3.120900e+10 | 857000000.0 | 1.779800e+10 | 1.909500e+10 | 8.142000e+09 | 2.723700e+10 | 20160630 | 000001.SZ | 1.909500e+10 | 8.125000e+09 | 2.723700e+10 |
20160825 | 0.000000e+00 | 0.0 | 6.524571e+08 | 5.588709e+09 | 4.970444e+09 | 1.055915e+10 | 20160630 | 600030.SH | 5.588709e+09 | 4.917090e+09 | 1.055915e+10 |
20160826 | 0.000000e+00 | 0.0 | 0.000000e+00 | 0.000000e+00 | 1.811750e+08 | 2.589879e+10 | 20160630 | 000063.SZ | 2.615474e+10 | 1.336791e+09 | 2.589879e+10 |
20161029 | 0.000000e+00 | 0.0 | 7.365511e+08 | 5.237163e+09 | 3.643600e+09 | 8.880763e+09 | 20160930 | 600030.SH | 5.237163e+09 | 3.659715e+09 | 8.880763e+09 |
20161021 | 3.200700e+10 | 863000000.0 | 1.836700e+10 | 1.881000e+10 | 8.389000e+09 | 2.719900e+10 | 20160930 | 000001.SZ | 1.881000e+10 | 8.406000e+09 | 2.719900e+10 |
获取现金流量表¶
代码示例:
df, msg = api.query(
view="lb.cashFlow",
fields="",
filter="symbol=002548.SZ",
data_format='pandas')
结果示例(前5条记录):
ann_date | cash_recp_prem_orig_inco | cash_recp_return_invest | cash_recp_sg_and_rs | incl_dvd_profit_paid_sc_ms | net_cash_flows_inv_act | net_cash_received_reinsu_bus | net_incr_dep_cob | net_incr_disp_tfa | net_incr_fund_borr_ofi | ... | net_incr_int_handling_chrg | net_incr_loans_central_bank | other_cash_recp_ral_fnc_act | other_cash_recp_ral_oper_act | recp_tax_rends | report_date | report_type | stot_cash_inflows_oper_act | stot_cash_outflows_oper_act | symbol |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
20140815 | 0.0 | 1071150.68 | 4.747366e+08 | 0.0 | 3.387516e+05 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.000000e+00 | 2.372317e+07 | 0.00 | 20130630 | 408003000 | 4.984598e+08 | 4.938527e+08 | 002548.SZ |
20140815 | 0.0 | 492274.24 | 4.574233e+08 | 0.0 | -5.160987e+06 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.000000e+00 | -2.986875e+05 | 0.00 | 20140630 | 408002000 | 4.571247e+08 | 4.261462e+08 | 002548.SZ |
20140815 | 0.0 | 37071150.68 | 1.294270e+08 | 0.0 | 3.893878e+07 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.000000e+00 | -7.582736e+06 | 0.00 | 20130630 | 408008000 | 1.218442e+08 | 1.523719e+08 | 002548.SZ |
20140815 | 0.0 | 492274.24 | 1.098741e+08 | 0.0 | -4.613494e+07 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 0.000000e+00 | 2.659082e+08 | 0.00 | 20140630 | 408007000 | 3.757823e+08 | 3.125591e+08 | 002548.SZ |
20170429 | 0.0 | 19237803.19 | 2.754383e+09 | 2450000.0 | -7.779336e+08 | 0.0 | 0.0 | 0.0 | 0.0 | ... | 0.0 | 0.0 | 1.547990e+08 | 4.374965e+07 | 0.00 | 20161231 | 408001000 | 2.798133e+09 | 2.846801e+09 | 002548.SZ |
获取业绩快报¶
代码示例:
df, msg = api.query(
view="lb.profitExpress",
fields="",
filter="start_anndate=20170101",
data_format='pandas')
结果示例(前5条记录):
ann_date | net_profit_int_inc | oper_profit | oper_rev | report_date | symbol | total_assets | total_profit |
---|---|---|---|---|---|---|---|
20170207 | 1.054700e+10 | 1.227300e+10 | 9.844400e+10 | 20161231 | 601633.SH | 9.214600e+10 | 1.248000e+10 |
20170713 | 1.493567e+08 | 1.902676e+08 | 1.218885e+09 | 20170630 | 002258.SZ | 3.658932e+09 | 1.890177e+08 |
20170228 | 1.177647e+08 | 1.142228e+08 | 1.023947e+09 | 20161231 | 002406.SZ | 2.538539e+09 | 1.389901e+08 |
20170228 | 2.148007e+08 | 1.276432e+08 | 4.011206e+09 | 20161231 | 002087.SZ | 7.744742e+09 | 2.504674e+08 |
20170228 | 1.621291e+08 | 1.944727e+08 | 1.480000e+09 | 20161231 | 002688.SZ | 2.713363e+09 | 2.025310e+08 |
获取限售股解禁表¶
代码示例:
df, msg = api.query(
view="lb.secRestricted",
fields="",
filter="list_date=20170925",
data_format='pandas')
结果示例(前5条记录):
lifted_shares | list_date | symbol |
---|---|---|
7.597341e+08 | 20171011 | 000536.SZ |
7.586547e+08 | 20171011 | 000813.SZ |
2.776560e+08 | 20171011 | 002701.SZ |
1.151995e+08 | 20171010 | 603010.SH |
5.385944e+06 | 20171010 | 300190.SZ |
数据视图¶
数据视图(DataView)将各种行情数据和参考数据进行了封装,方便用户使用数据。
DataView做什么¶
将频繁使用的DataFrame
操作自动化,使用者操作数据时尽量只考虑业务需求而不是技术实现:
- 根据字段名,自动从不同的数据api获取数据
- 按时间、标的整理对齐(财务数据按发布日期对齐)
- 在已有数据基础上,添加字段、加入自定义数据或根据公式计算新数据
- 数据查询
- 本地存储
初始化¶
DataView初始化工作主要包括创建DataView和DataService、初始化配置、数据准备三步。
创建DataView和DataService¶
DataService提供原始的数据,目前jaqs已经提供远程数据服务类(RemoteDataService),可以通过互联网获取行情数据和参考数据。
from jaqs.data.dataservice import RemoteDataService
from jaqs.data.dataview import DataView
dv = DataView()
ds = RemoteDataService()
初始化配置¶
通过init_from_config函数进行初始化配置,配置参数如下表所示:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
symbol | string | universe标的代码,多标的以’,’隔开,如‘000001.SH, 600300.SH’,指数代码不会被展开成对应成员股票代码 | 不可缺失,symbol与universe二选一 |
universe | string | 指数代码,单标的,将该指数的成员作为universe | 不可缺省,symbol与universe二选一 |
start_date | int | 开始日期 | 不可缺省 |
end_date | int | 结束日期 | 不可缺省 |
fields | string | 数据字段,多字段以’,’隔开,如’open,close,high,low’ | 不可缺省 |
freq | int | 数据类型,目前只支持1,表示日线数据 | 1 |
示例代码:
dv = DataView()
ds = RemoteDataService()
secs = '600030.SH,000063.SZ,000001.SZ'
props = {'start_date': 20160601, 'end_date': 20170601, 'symbol': secs,
'fields': 'open,close,high,low,volume,pb,net_assets,eps_basic',
'freq': 1}
dv.init_from_config(props, data_api=ds)
获取数据¶
数据结构说明¶
DataView用一个三维的数据结构保存的所需数据,其三维数据轴分别为:
- 标的代码,如 600030.SH, 000002.SH
- 交易日期,如 20150202, 20150203
- 数据字段,如 open, high, low, close
根据日期获取数据:¶
使用get_snapshot()函数来获取某日的数据快照(在时间轴切片),输入参数见下表:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
snapshot_date | int | 交易日 | 不可缺省 |
symbol | string | 标的代码,多标的以’,’隔开,如‘000001.SH, 600300.SH’ | 不可缺省 |
fields | string | 数据字段,多字段以’,’隔开,如’open,close,high,low’ | 不可缺省 |
返回在结果格式为pandas DataFrame,标的代码作为DataFrame的index,数据字段作为DataFrame的column。
示例代码:
snap1 = dv.get_snapshot(20170504, symbol='600030.SH,000063.SZ', fields='close,pb')
返回结果示例:
根据数据字段获取数据¶
使用get_ts()函数获取某个数据字段的时间序列(在字段轴切片),输入参数见下表:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
field | string | 数据字段,多字段以’,’隔开 | 不可缺省 |
symbol | string | “标的代码,多标的以’,’隔开,如”“000001.SH, 600300.SH”“” | 不可缺省 |
start_date | int | 开始日期 | 不可缺省 |
end_date | int | 结束日期 | 不可缺省 |
返回结果格式为pandas DataFrame,交易日作为DataFrame的index,标的代码作为DataFrame的column
示例代码:
ts1 = dv.get_ts('close', symbol='600030.SH,000063.SZ',
start_date=20170101, end_date=20170302)
数据视图及保存¶
- 可以读取修改后继续存储
- 默认覆盖
保存DataView到文件¶
使用save_dataview()函数将当前数据视图保存到指定文件夹,保存格式为h5文件。函数输入参数如下:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
folder_path | string | 文件保存主目录 | 不可缺省 |
sub_folder | string | 文件保存子目录,缺省为’{start_date}*{end*date}freq={freq}D’,例如,若DataView初始参数为startdate=20120101,end_date=20120110,freq=1时,sub_folder为‘20120101_20120110_freq=1D’ | ‘{start_date}*{end*date}_freq={freq}D’| |
示例代码:
dv.save_dataview('prepared', 'demo')
Store data...
Dataview has been successfully saved to:
/home/user/prepared/demo
You can load it with load_dataview('/home/user/prepared/demo')
读取已经保存的DataView¶
利用load_dataview()函数,DataView可以不经初始化,直接读取已经保存的DataView数据。函数输入参数如下所示:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
folder | string | DataView文件保存目录 | 不可缺省 |
示例代码:
dv = DataView()
dv.load_dataview('/home/user/prepared/demo')
Dataview loaded successfully.
添加数据¶
- 从DataApi获取更多字段:
dv.add_field('roe')
- 加入自定义DataFrame:
dv.append_df(name, df)
- 根据公式计算衍生指标:
dv.add_formula(name, formula, is_quarterly=False)
添加字段¶
利用add_field()函数可以添加当前DataView没有包含的数据,输入参数如下:
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
field_name | string | 需要添加的字段名称 | 不可缺省 |
data_api | BaseDataServer | 缺省时为None,即利用DataView初始化时传入的DataService添加数据;当DataView是从文件中读取得到时,该DataView没有DataService,需要外部传入一个DataService以添加数据。 | None |
示例代码:
.
添加自定义公式数据¶
利用add_formula()函数可以添加当前DataView添加自定义公式数据字段,输入参数如下所示:
字段 | 类型 | 说明 | 缺省 |
---|---|---|---|
field_name | string | 字段名称 | 不可缺省 |
formula | string | 公式表达式 | 不可缺省 |
is_quarterly | bool | 是否为季度数据,如财务季报数据 | 不可缺省 |
formula_func_name_style | string | 函数名大小写识别模式,’upper’:使用默认函数名,’lower’:formular里所有函数名都为应为小写。 | ‘upper’ |
data_api | BaseDataServer | 数据服务 | None |
示例代码:
## 日频0/1指标:是否接近涨跌停
dv.add_formula('limit_reached', 'Abs((open - Delay(close, 1)) / Delay(close, 1)) > 0.095', is_quarterly=False)
dv.get_ts('limit_reached').iloc[:, 100:].head(2)
## 日频指标:与52周高点的百分比
dv.add_formula('how_high_52w', 'close_adj / Ts_Max(close_adj, 252)', is_quarterly=False)
dv.get_ts('how_high_52w').tail().applymap(lambda x: round(100*x, 1))
## 日频指标:量价背离
dv.add_formula('price_volume_divert', 'Correlation(vwap_adj, volume, 10)', is_quarterly=False)
dv.get_snapshot(20171009, fields='price_volume_divert')
## 季频指标:eps增长率
dv.add_formula('eps_growth', 'Return(eps_basic, 4)', is_quarterly=True)
dv.get_ts('eps_growth', start_date=20160810).head()
ds = RemoteDataService()
dv.add_field('total_share', ds)
目前支持的公式如下表所示:
公式 | 说明 | 示例 |
---|---|---|
+ |
加法运算 | close + open |
- |
减法运算 | close - open |
* |
乘法运算 | vwap * volume |
/ |
除法运算 | close / open |
^ |
幂函数 | close ^ 2 |
% |
取余函数 | oi % 10 |
== |
判断是否相等 | close == open |
!= |
判断是否不等 | close != open |
> |
大于 | close > open |
< |
小于 | close < open |
>= |
大于等于 | close >= open |
<= |
小于等于 | close <= open |
&& |
逻辑与 | (close > open) && (close > vwap) |
|| |
逻辑或 | (close > open) ||(close > vwap) |
! |
逻辑非 | !(close>open) |
Sin(x) | 正弦函数 | Sin(close/open) |
Cos(x) | 余弦函数 | Cos(close/open) |
Tan(x) | 正切函数 | Tan(close/open) |
Sqrt(x) | 开平方函数 | Sqrt(close^2 + open^2) |
Abs(x) | 绝对值函数 | Abs(close-open) |
Log(x) | 自然对数 | Log(close/open) |
Ceil(x) | 向上取整 | Ceil(high) |
Floor(x) | 向下取整 | Floor(low) |
Round(x) | 四舍五入 | Round(close) |
Sign(x) | 取 x 正负号,返回以-1,0和1标志 | Sign(close-open) |
-x | 对x取负 | -close |
Max(x,y) | 取 x 和 y 同位置上的较大值组成新的DataFrame返回 | Max(close, open) |
Min(x,y) | 取 x 和 y 同位置上的较小值组成新的DataFrame返回 | Min(close,open) |
Delay(x,n) | 时间序列函数, n 天前 x 的值 | Delay(close,1) 表示前一天收盘价 |
Rank(x) | 各标的根据给出的指标x的值,在横截面方向排名 | Rank( close/Delay(close,1)-1 ) 表示按日收益率进行排名 |
GroupRank(x,g) | 各标的根据指标 x 的值,在横截面方向进行按分组 g 进行分组排名。分组 DataFrame g 以int数据标志分组,例如三个标的在某一天的截面上的分组值都为2,则表示这三个标的在同一组 | GroupRank(close/Delay(close,1)-1, g) 表示按分组g根据日收益率进行分组排名 |
ConditionRank(x,cond) | 各标的根据条件 DataFrame cond,按照给出的指标 x 的值,在横截面方向排名,只有 cond 中值为True的标的参与排名。 | GroupRank(close/Delay(close,1)-1, cond) 表示按条件cond根据日收益率进行分组排名 |
Quantile(x,n) | 各标的按根据指标 x 的值,在横截面方向上进行分档,每档标的数量相同 | Quantile( close/Delay(close,1)-1,5)表示按日收益率分为5档 |
GroupQuantile(x,g,n) | 各标的根据指标 x 的值,在横截面方向上按分组 g 进行分组分档,分组 DataFrame g 以int数据标志分组,例如三个标的在某一天的截面上的分组值都为2,则表示这三个标的在同一组 | GroupQuantile(close/Delay(close,1)-1,g,5) 表示按日收益率和分组g进行分档,每组分为5档 |
Standardize(x) | 标准化,x值在横截面上减去平均值后再除以标准差 | Standardize(close/Delay(close,1)-1) 表示日收益率的标准化 |
Cutoff(x,z_score) | x值在横截面上去极值,用MAD方法 | Cutoff(close,3) 表示去掉z_score大于3的极值 |
Sum(x,n) | 时间序列函数,x 指标在过去n天的和,类似于pandas的rolling_sum()函数 | Sum(volume,5) 表示一周成交量 |
Product(x,n) | 时间序列函数,计算 x 中的值在过去 n 天的积 | Product(close/Delay(close,1),5) - 1 表示过去5天累计收益 |
CountNans(x,n) | 时间序列函数,计算 x 中的值在过去 n 天中为 nan (非数字)的次数 | CountNans((close-open)^0.5, 10) 表示过去10天内有几天close小于open |
Ewma(x,halflife) | 指数移动平均,以halflife的衰减对x进行指数移动平均 | Ewma(x,3) |
StdDev(x,n) | 时间序列函数,计算 x 中的值在过去n天的标准差 | StdDev(close/Delay(close,1)-1, 10) |
Covariance(x,y,n) | 时间序列函数,计算 x 中的值在过去n天的协方差 | Covariance(close, open, 10) |
Correlation(x,y,n) | 时间序列函数,计算 x 中的值在过去n天的相关系数 | Correlation(close,open, 10) |
Delta(x,n) | 时间序列函数,计算 x 当前值与n天前的值的差 | Delta(close,5) |
Return(x,n,log) | 时间序列函数,计算x值n天的增长率,当log为False时,计算线性增长;当log为True时,计算对数增长 | Return(close,5,True)计算一周对数收益 |
Ts_Mean(x,n) | 时间序列函数,计算 x 中的值在过去n天的平均值 | Ts_Mean(close,5) |
Ts_Min(x,n) | 时间序列函数,计算 x 中的值在过去n天的最小值 | Ts_Min(close,5) |
Ts_Max(x,n) | 时间序列函数,计算 x 中的值在过去n天的最大值 | Ts_Max(close,5) |
Ts_Skewness(x,n) | 时间序列函数,计算 x 中的值在过去n天的偏度 | Ts_Skewness(close,20) |
Ts_Kurtosis(x,n) | 时间序列函数,计算 x 中的值在过去n天的峰度 | Ts_Kurtosis(close,20) |
Tail(x, lower, upper, newval) | 如果 x 的值介于 lower 和 upper,则将其设定为 newval | Tail(close/open, 0.99, 1.01, 1.0) |
Step(n) | Step(n) 为每个标的创建一个向量,向量中 n 代表最新日期,n-1 代表前一天,以此类推。 | Step(30) |
Decay_linear(x,n) | 时间序列函数,过去n天的线性衰减函数。Decay_linear(x, n) = (x[date] * n + x[date - 1] * (n - 1) + … + x[date – n - 1]) / (n + (n - 1) + … + 1) | Decay_linear(close,15) |
Decay_exp(x,f,n) | 时间序列函数, 过去 n 天的指数衰减函数,其中 f 是平滑因子。这里 f 是平滑因子,可以赋一个小于 1 的值。Decay_exp(x, f, n) = (x[date] + x[date - 1] * f + … +x[date – n - 1] * (f ^ (n – 1))) / (1 + f + … + f ^ (n - 1)) | Decay_exp(close,0.9,10) |
Pow(x,y) | 幂函数x^y | Pow(close,2) |
SignedPower(x,e) | 等价于Sign(x) * (Abs(x)^e) | SignedPower(close-open, 0.5) |
If(cond,x,y) | cond为True取x的值,反之取y的值 | If(close > open, close, open) 表示取open和close的较大值 |
研究¶
信号研究与回测: SignalDigger
模块
功能¶
- 收益分析:分组收益、加权组合收益等
- 相关性分析:每日IC、IC分布等
- 排除涨跌停、停牌、非指数成分等
特性¶
- 计算与绘图分离
- 绘图输出格式可选、可关闭,数据计算结果可返回
测试量价背离因子¶
- 输入:两个
DataFrame
:因子值,标的价格/收益 - 设置:period,quantile个数
factor = -dv.get_ts('price_volume_divert').shift(1, axis=0) # avoid look-ahead bias
price = dv.get_ts('close_adj')
price_bench = dv.data_benchmark
my_period = 5
obj = SignalDigger(output_folder='.', output_format='plot')
obj.process_factor_before_analysis(factor, price=price,
mask=mask_all,
n_quantiles=5, period=my_period,
benchmark_price=price_bench,
)
res = obj.create_full_report()
利用输出数据做进一步分析¶
def performance(ret):
cum = ret.add(1.0).cumprod(axis=0)
std = np.std(ret)
start = pd.to_datetime(ser.index[0], format="%Y%m%d")
end = pd.to_datetime(ser.index[-1], format="%Y%m%d")
years = (end - start).days / 365.0
yearly_return = np.power(cum.values[-1], 1. / years) - 1
yearly_vol = std * np.sqrt(225.)
# beta = np.corrcoef(df_returns.loc[:, 'bench'], df_returns.loc[:, 'strat'])[0, 1]
sharpe = yearly_return / yearly_vol
print "ann. ret = {:.1f}%; ann. vol = {:.1f}%, sharpe = {:.2f}".format(yearly_return*100, yearly_vol*100, sharpe)
ser = res['quantile_active_ret_correct'][1]['mean']#.iloc[90:]
print ser.index[0], ser.index[-1]
plt.figure(figsize=(14, 5))
plt.plot(ser.add(1.0).cumprod().values)
performance(ser)
20160105 20171013
ann. ret = -17.2%; ann. vol = 3.7%, sharpe = -4.63
回测¶
这里回测指基于权重调仓的Alpha策略回测,支持自定义选股和自定义信号。
回测&结果分析示例代码¶
处理:
- 分红除息再投资
- 退市清仓
- 指数成分
on_bar
中进行发单,而是给出选股条件(booleanseries)和信号(float series)权重
dv.add_formula('my_signal', 'Quantile(price_volume_divert, 5)', is_quarterly=False)
def my_singal(context, user_options=None):
res = -context.snapshot_sub.loc[:, 'price_volume_divert']
return res
def test_alpha_strategy_dataview():
## dv = DataView()
## fullpath = '/home/bliu/pytrade_dir/ipynb/prepared/compare'
## dv.load_dataview(folder=fullpath)
props = {
"benchmark": "000300.SH",
"universe": ','.join(dv.symbol),
"start_date": dv.start_date,
"end_date": dv.end_date,
"period": "week",
"days_delay": 0,
"init_balance": 1e8,
"position_ratio": 0.7,
'commission_rate': 0.0
}
trade_api = AlphaTradeApi()
bt = AlphaBacktestInstance()
signal_model = model.FactorSignalModel()
stock_selector = model.StockSelector()
signal_model.add_signal(name='my_factor', func=my_singal)
stock_selector.add_filter(name='total_profit_growth', func=my_selector)
stock_selector.add_filter(name='no_new_stocks', func=my_selector_no_new_stocks)
strategy = AlphaStrategy(signal_model=signal_model, stock_selector=stock_selector,
pc_method='factor_value_weight')
pm = PortfolioManager()
context = model.AlphaContext(dataview=dv, trade_api=trade_api,
instance=bt, strategy=strategy, pm=pm)
for mdl in [risk_model, signal_model, cost_model, stock_selector]:
mdl.register_context(context)
bt.init_from_config(props)
bt.run_alpha()
bt.save_results(folder_path=backtest_result_dir_path)
test_alpha_strategy_dataview()
def test_backtest_analyze():
ta = ana.AlphaAnalyzer()
dv = DataView()
dv.load_dataview(folder_path=dataview_dir_path)
ta.initialize(dataview=dv, file_folder=backtest_result_dir_path)
ta.do_analyze(result_dir=backtest_result_dir_path, selected_sec=list(ta.universe)[:3])
test_backtest_analyze()
process trades...
get daily stats...
calc strategy return...
Plot strategy PnL...
generate report...
HTML report: /home/bliu/pytrade_dir/ipynb/output/jli/report.html
格雷厄姆选股策略¶
本策略完整实现代码见 这里。
主要介绍基于回测框架实现格雷厄姆模型。格雷厄姆模型分为两步,首先是条件选股,其次按照市值从小到大排序,选出排名前五的股票。
一. 数据准备¶
我们选择如下指标,对全市场的股票进行筛选,实现过程如下:
a. 首先在数据准备模块save_dataview()中通过props设置数据起止日期,股票版块,以及所需变量
props = {
'start_date': 20150101,
'end_date': 20170930,
'universe':'000905.SH',
'fields': ('tot_cur_assets,tot_cur_liab,inventories,pre_pay,deferred_exp, eps_basic,ebit,pe,pb,float_mv,sw1'),
'freq': 1
}
b. 接着创建0-1变量表示某只股票是否被选中,并通过add_formula将变量添加到dataview中
- 市盈率(pe ratio)低于 20
- 市净率(pb ratio)低于 2
- 同比每股收益增长率(inc_earning_per_share)大于 0
- 税前同比利润增长率(inc_profit_before_tax)大于 0
- 流动比率(current_ratio)大于 2
- 速动比率(quick_ratio)大于 1
factor_formula = 'pe < 20'
dv.add_formula('pe_condition', factor_formula, is_quarterly=False)
factor_formula = 'pb < 2'
dv.add_formula('pb_condition', factor_formula, is_quarterly=False)
factor_formula = 'Return(eps_basic, 4) > 0'
dv.add_formula('eps_condition', factor_formula, is_quarterly=True)
factor_formula = 'Return(ebit, 4) > 0'
dv.add_formula('ebit_condition', factor_formula, is_quarterly=True)
factor_formula = 'tot_cur_assets/tot_cur_liab > 2'
dv.add_formula('current_condition', factor_formula, is_quarterly=True)
factor_formula = '(tot_cur_assets - inventories - pre_pay - deferred_exp)/tot_cur_liab > 1'
dv.add_formula('quick_condition', factor_formula, is_quarterly=True)
需要注意的是,涉及到的财务数据若不在secDailyIndicator表中,需将is_quarterly设置为True,表示该变量为季度数据。
- 由于第二步中需要按流通市值排序,我们将这一变量也放入dataview中
dv.add_formula('mv_rank', 'Rank(float_mv)', is_quarterly=False)
二. 条件选股¶
条件选股在my_selector函数中完成:
- 首先我们将上一步计算出的0/1变量提取出来,格式为Series
- 接着我们对所有变量取交集,选中的股票设为1,未选中的设为0,并将结果通过DataFrame形式返回
def my_selector(context, user_options=None):
#
pb_selector = context.snapshot['pb_condition']
pe_selector = context.snapshot['pe_condition']
eps_selector = context.snapshot['eps_condition']
ebit_selector = context.snapshot['ebit_condition']
current_selector = context.snapshot['current_condition']
quick_selector = context.snapshot['quick_condition']
#
merge = pd.concat([pb_selector, pe_selector, eps_selector, ebit_selector, current_selector, quick_selector], axis=1)
result = np.all(merge, axis=1)
mask = np.all(merge.isnull().values, axis=1)
result[mask] = False
return pd.DataFrame(result, index=merge.index, columns=['selector'])
三、按市值排序¶
按市值排序功能在signal_size函数中完成。我们根据流通市值排序变量’mv_rank’对所有股票进行排序,并选出市值最小的5只股票。
def signal_size(context, user_options = None):
mv_rank = context.snapshot_sub['mv_rank']
s = np.sort(mv_rank.values)[::-1]
if len(s) > 0:
critical = s[-5] if len(s) > 5 else np.min(s)
mask = mv_rank < critical
mv_rank[mask] = 0.0
mv_rank[~mask] = 1.0
return mv_rank
四、回测¶
我们在test_alpha_strategy_dataview()模块中实现回测功能
该模块首先载入dataview并允许用户设置回测参数,比如基准指数,起止日期,换仓周期等。
dv = DataView()
fullpath = fileio.join_relative_path('../output/prepared', dv_subfolder_name)
dv.load_dataview(folder=fullpath)
props = {
"benchmark": "000905.SH",
"universe": ','.join(dv.symbol),
"start_date": dv.start_date,
"end_date": dv.end_date,
"period": "week",
"days_delay": 0,
"init_balance": 1e8,
"position_ratio": 1.0,
}
接着我们使用StockSelector选股模块,将之前定义的my_selector载入
stock_selector = model.StockSelector
stock_selector.add_filter(name='myselector', func=my_selector)
在进行条件选股后,使用FactorSignalModel模块对所选股票进行排序
signal_model = model.FactorSignalModel(context)
signal_model.add_signal(name='signalsize', func = signal_size)
将上面定义的stockSelector和FactorSignalModel载入AlphaStrategy函数进行回测
strategy = AlphaStrategy(
stock_selector=stock_selector,
signal_model=signal_model,
pc_method='factor_value_weight')
t_start = time.time()
test_save_dataview()
test_alpha_strategy_dataview()
test_backtest_analyze()
t3 = time.time() - t_start
print "\n\n\nTime lapsed in total: {:.1f}".format(t3)
五、回测结果¶
回测的参数如下:
指标 | 值 |
---|---|
Beta | 0.87 |
Annual Return | 0.08 |
Annual Volatility | 0.29 |
Sharpe Ratio | 0.28 |
回测的净值曲线图如下:
基于因子IC的多因子选股模型¶
本策略完整实现代码见 这里。
主要介绍基于回测框架实现基于因子IC的因子权重优化模型。
一. 因子IC定义及优化模型¶
Coefficient)的定义。传统意义上,因子在某一期的IC为该期因子与股票下期收益率的秩相关系数,即: | $$IC_t = RankCorrelation(\vec{f_t}, \vec{r_{t+1}})$$ | 其中$\vec{f_t}$为所有股票在t期的因子值向量,$\vec{r_{t+1}}$为所有股票在t到t+1期的收益率向量。秩相关系数直接反映了因子的预测能力:IC越高,说明该因子对接下里一期股票收益的预测能力越强。
在本示例中我们简单选取了几个因子,更多的因子可以在股票因子数据中找到:
- Turnover, 换手率
- BP, Book-to-Market Ratio
- MOM20, 过去20天收益率
- LFMV, 对数流通市值
实现过程如下:
a. 首先在数据准备模块save_dataview()中通过props设置数据起止日期,股票版块,以及所需变量
props = {'start_date': 20150101, 'end_date': 20170930, 'universe':
'000905.SH', 'fields': ('turnover,float_mv,close_adj,pe'), 'freq': 1}
b. 接着计算因子,进行标准化和去极值处理后通过add_formula()将因子添加到变量列表中
factor_formula = 'Cutoff(Standardize(turnover / 10000 / float_mv), 2)'
dv.add_formula('TO', factor_formula, is_quarterly=False)
factor_formula = 'Cutoff(Standardize(1/pb), 2)'
dv.add_formula('BP', factor_formula, is_quarterly = False)
factor_formula = 'Cutoff(Standardize(Return(close_adj, 20)), 2)'
dv.add_formula('REVS20', factor_formula, is_quarterly=False)
factor_formula = 'Cutoff(Standardize(Log(float_mv)), 2)'
dv.add_formula('float_mv_factor', factor_formula, is_quarterly=False)
factorList = ['TO', 'BP', 'REVS20', 'float_mv_factor']
factorList_adj = [x + '_adj' for x in factorList]
from jaqs.util import fileio
fileio.save_json(factorList_adj, '.../myCustomData.json')
c. 由于多个因子间可能存在多重共线性,我们对因子进行施密特正交化处理,并将处理后的因子添加到变量列表中。
### add the orthogonalized factor to dataview
for trade_date in dv.dates:
snapshot = dv.get_snapshot(trade_date)
factorPanel = snapshot[factorList]
factorPanel = factorPanel.dropna()
if len(factorPanel) != 0:
orthfactorPanel = Schmidt(factorPanel)
orthfactorPanel.columns = [x + '_adj' for x in factorList]
snapshot = pd.merge(left = snapshot, right = orthfactorPanel,
left_index = True, right_index = True, how = 'left')
for factor in factorList:
orthFactor_dic[factor][trade_date] = snapshot[factor]
for factor in factorList:
dv.append_df(pd.DataFrame(orthFactor_dic[factor]).T, field_name = factor + '_adj', is_quarterly=False)
从dataview中提取所有交易日,在每个交易日计算每个因子的IC
def get_ic(dv):
"""
Calculate factor IC on all dates and save it in a DataFrame
:param dv:
:return: DataFrame recording factor IC on all dates
"""
factorList = fileio.read_json('.../myCustomData.json')
ICPanel = {}
for singleDate in dv.dates:
singleSnapshot = dv.get_snapshot(singleDate)
ICPanel[singleDate] = ic_calculation(singleSnapshot, factorList)
ICPanel = pd.DataFrame(ICPanel).T
return ICPanel
其中计算IC的函数为ic_calculation()
def ic_calculation(snapshot, factorList):
"""
Calculate factor IC on single date
:param snapshot:
:return: factor IC on single date
"""
ICresult = []
for factor in factorList:
# drop na
factorPanel = snapshot[[factor, 'NextRet']]
factorPanel = factorPanel.dropna()
ic, _ = stats.spearmanr(factorPanel[factor], factorPanel['NextRet'])
ICresult.append(ic)
return ICresult
\overline{IC_2}, \cdots, \overline{IC_k},)’$,相应协方差矩阵为$\Sigma$,因子的权重向量为$\vec{v}=(\overline{V_1}, \overline{V_2},\cdots, \overline{V_k})’$。则所有因子的复合IR值为 | $$IR = \frac{\vec{v}’\vec{IC}}{\sqrt{\vec{v}’ \Sigma \vec{v}}}$$ | 我们的目标是通过调整$\vec{v}$使IR最大化。经简单计算我们可以直接求出$\vec{v}$的解析解,则最优权重向量为: | $$\vec{v}^* = \Sigma^{-1}\vec{IC}$$ | 具体实现过程如下:
def store_ic_weight():
"""
Calculate IC weight and save it to file
"""
dv = DataView()
fullpath = fileio.join_relative_path('../output/prepared', dv_subfolder_name)
dv.load_dataview(folder=fullpath)
w = get_ic_weight(dv)
store = pd.HDFStore('/home/lli/ic_weight.hd5')
store['ic_weight'] = w
store.close()
其中使用到了get_ic_weight()函数,其作用是计算每个因子IC对应的weight
def get_ic_weight(dv):
"""
Calculate factor IC weight on all dates and save it in a DataFrame
:param dv: dataview
:return: DataFrame containing the factor IC weight, with trading date as index and factor name as columns
"""
ICPanel = get_ic(dv)
ICPanel = ICPanel.dropna()
N = 10
IC_weight_Panel = {}
for i in range(N, len(ICPanel)):
ICPanel_sub = ICPanel.iloc[i-N:i, :]
ic_weight = ic_weight_calculation(ICPanel_sub)
IC_weight_Panel[ICPanel.index[i]] = ic_weight
IC_weight_Panel = pd.DataFrame(IC_weight_Panel).T
return IC_weight_Panel
我们在计算weight时需要确定一个rolling window,这里选择N=10。
def ic_weight_calculation(icpanel):
"""
Calculate factor IC weight on single date
:param icpanel:
:return: a vector containing all factor IC weight
"""
mat = np.mat(icpanel.cov())
mat = nlg.inv(mat)
weight = mat * np.mat(icpanel.mean()).reshape(len(mat), 1)
weight = np.array(weight.reshape(len(weight), ))[0]
return weight
二. 基于因子IC及相应权重的选股模型¶
在介绍选股模型的具体实现之前,我们首先熟悉一下策略模块test_alpha_strategy_dataview()。该模块的功能是基于dataview对具体策略进行回测。
该模块首先载入dataview并允许用户设置回测参数,比如基准指数,起止日期,换仓周期等。
dv = DataView()
fullpath = fileio.join_relative_path('../output/prepared', dv_subfolder_name)
dv.load_dataview(folder=fullpath)
props = {
"benchmark": "000905.SH",
"universe": ','.join(dv.symbol),
"start_date": dv.start_date,
"end_date": dv.end_date,
"period": "week",
"days_delay": 0,
"init_balance": 1e8,
"position_ratio": 1.0,
}
context是一个类用来保存一些中间结果,可在程序中任意位置调用,并将之前算出的ic_weight放入context中。
context = model.Context(dataview=dv, gateway=gateway)
store = pd.HDFStore('.../ic_weight.hd5')
context.ic_weight = store['ic_weight']
store.close()
接着我们使用StockSelector选股模块。基于因子IC及相应权重的选股过程在my_selector中实现。
stock_selector = model.StockSelector(context)
stock_selector.add_filter(name='myselector', func=my_selector)
a.首先载入因子ic的权重context.ic_weight,回测日期列表context.trade_date记忆因子名称列表factorList
ic_weight = context.ic_weight
t_date = context.trade_date
current_ic_weight = np.mat(ic_weight.loc[t_date,]).reshape(-1,1)
factorList = fileio.read_json('.../myCustomData.json')
factorPanel = {}
for factor in factorList:
factorPanel[factor] = context.snapshot[factor]
factorPanel = pd.DataFrame(factorPanel)
b.接着根据各因子IC的权重,对当天各股票的IC值进行加权求和,选出得分最高的前30只股票。最后返回一个列表,1代表选中,0代表未选中。
factorResult = pd.DataFrame(np.mat(factorPanel) * np.mat(current_ic_weight), index = factorPanel.index)
factorResult = factorResult.fillna(-9999)
s = factorResult.sort_values(0)[::-1]
critical = s.values[30]
mask = factorResult > critical
factorResult[mask] = 1.0
factorResult[~mask] = 0.0
t_start = time.time()
test_save_dataview()
store_ic_weight()
test_alpha_strategy_dataview()
test_backtest_analyze()
t3 = time.time() - t_start
print "\n\n\nTime lapsed in total: {:.1f}".format(t3)
三、回测结果¶
回测的参数如下:
指标 | 值 |
---|---|
Beta | 0.92 |
Annual Return | 0.19 |
Annual Volatility | 0.16 |
Sharpe Ratio | 1.21 |

四、参考文献¶
- 基于因子IC的多因子模型
- 《安信证券-多因子系列报告之一:基于因子IC的多因子模型》
Calendar Spread交易策略¶
本策略完整实现代码见 这里。
本帖主要介绍了基于事件驱动回测框架实现calendar spread交易策略。
一. 策略介绍¶
二. 参数准备¶
我们在test_spread_commodity.py文件中的test_spread_trading()函数中设置策略所需参数,例如交易标的,策略开始日期,终止日期,换仓频率等。
props = {
"symbol" : "ru1801.SHF,ru1805.SHF",
"start_date" : 20170701,
"end_date" : 20171109,
"bar_type" : "DAILY",
"init_balance" : 2e4,
"bufferSize" : 20,
"future_commission_rate": 0.00002,
"stock_commission_rate" : 0.0001,
"stock_tax_rate" : 0.0000
}
三. 策略实现¶
策略实现全部在spread_commodity.py中完成,创建名为SpreadCommodity()的class继承EventDrivenStrategy,具体分为以下几个步骤:
这里将后续步骤所需要的变量都创建好并初始化。
def __init__(self):
EventDrivenStrategy.__init__(self)
self.symbol = ''
self.s1 = ''
self.s2 = ''
self.quote1 = None
self.quote2 = None
self.bufferSize = 0
self.bufferCount = 0
self.spreadList = ''
这里将props中设置的参数传入。其中,self.spreadList记录了最近$n$天的spread值,$n$是由self.bufferSize确定的。
def init_from_config(self, props):
super(SpreadCommodity, self).init_from_config(props)
self.symbol = props.get('symbol')
self.init_balance = props.get('init_balance')
self.bufferSize = props.get('bufferSize')
self.s1, self.s2 = self.symbol.split(',')
self.spreadList = np.zeros(self.bufferSize)
q1 = quote_dic.get(self.s1)
q2 = quote_dic.get(self.s2)
self.quote1 = q1
self.quote2 = q2
spread = q1.close - q2.close
接着更新self.spreadList。因为self.spreadList为固定长度,更新方法为将第2个到最后1个元素向左平移1位,并将当前的spread放在队列末尾。
self.spreadList[0:self.bufferSize - 1] = self.spreadList[1:self.bufferSize]
self.spreadList[-1] = spread
self.bufferCount += 1
接着将self.spreadList中的数据对其对应的编号(例如从1到20)做regression,观察回归系数的pvalue是否显著,比如小于0.05。如果结果不显著,则不对仓位进行操作;如果结果显著,再判断系数符号,如果系数大于0则做多spread,反之做空spread。
X, y = np.array(range(self.bufferSize)), np.array(self.spreadList)
X = X.reshape(-1, 1)
y = y.reshape(-1, 1)
X = sm.add_constant(X)
est = sm.OLS(y, X)
est = est.fit()
if est.pvalues[1] < 0.05:
if est.params[1] < 0:
self.short_spread(q1, q2)
else:
self.long_spread(q1, q2)
四. 回测结果¶
商品期货的Dual Thrust日内交易策略¶
本策略完整实现代码见 这里。
本帖主要介绍了基于事件驱动回测框架实现Dual Thrust日内交易策略。
一. 策略介绍¶
Thrust是一个趋势跟踪策略,具有简单易用、适用度广的特点,其思路简单、参数较少,配合不同的参数、止盈止损和仓位管理,可以为投资者带来长期稳定的收益,被投资者广泛应用于股票、货币、贵金属、债券、能源及股指期货市场等。 | 在本文中,我们将Dual Thrust应用于商品期货市场中。 | 简而言之,该策略的逻辑原型是较为常见的开盘区间突破策略,以今日开盘价加减一定比例确定上下轨。日内突破上轨时平空做多,突破下轨时平多做空。 | 在Dual Thrust交易系统中,对于震荡区间的定义非常关键,这也是该交易系统的核心和精髓。Dual Thrust系统使用 | $$Range = Max(HH-LC,HC-LL)$$ | 来描述震荡区间的大小。其中HH是过去N日High的最大值,LC是N日Close的最小值,HC是N日Close的最大值,LL是N日Low的最小值。
二. 参数准备¶
我们在test_spread_commodity.py文件中的test_spread_trading()函数中设置策略所需参数,例如交易标的,策略开始日期,终止日期,换仓频率等,其中$k1,k2$为确定突破区间上下限的参数。
props = {
"symbol" : "rb1710.SHF",
"start_date" : 20170510,
"end_date" : 20170930,
"buffersize" : 2,
"k1" : 0.7,
"k2" : 0.7,
"bar_type" : "MIN",
"init_balance" : 1e5,
"future_commission_rate": 0.00002,
"stock_commission_rate" : 0.0001,
"stock_tax_rate" : 0.0000
}
三. 策略实现¶
策略实现全部在DualThrust.py中完成,创建名为DualThrustStrategy()的class继承EventDrivenStrategy,具体分为以下几个步骤:
这里将后续步骤所需要的变量都创建好并初始化。其中self.bufferSize为窗口期长度,self.pos记录了实时仓位,self.Upper和self.Lower记录了突破区间上下限。
def __init__(self):
EventDrivenStrategy.__init__(self)
self.symbol = ''
self.quote = None
self.bufferCount = 0
self.bufferSize = ''
self.high_list = ''
self.close_list = ''
self.low_list = ''
self.open_list = ''
self.k1 = ''
self.k2 = ''
self.pos = 0
self.Upper = 0.0
self.Lower = 0.0
这里将props中设置的参数传入。其中,self.high_list为固定长度的list,保存了最近$N$天的日最高价,其他变量类似。
def init_from_config(self, props):
super(DualThrustStrategy, self).init_from_config(props)
self.symbol = props.get('symbol')
self.init_balance = props.get('init_balance')
self.bufferSize = props.get('buffersize')
self.k1 = props.get('k1')
self.k2 = props.get('k2')
self.high_list = np.zeros(self.bufferSize)
self.close_list = np.zeros(self.bufferSize)
self.low_list = np.zeros(self.bufferSize)
self.open_list = np.zeros(self.bufferSize)
在每天开始时,首先调用initialize()函数,得到当天的open,close,high和low的值,并对应放入list中。
def initialize(self):
self.bufferCount += 1
# get the trading date
td = self.ctx.trade_date
ds = self.ctx.data_api
# get the daily data
df, msg = ds.daily(symbol=self.symbol, start_date=td, end_date=td)
# put the daily value into the corresponding list
self.open_list[0:self.bufferSize - 1] =
self.open_list[1:self.bufferSize]
self.open_list[-1] = df.high
self.high_list[0:self.bufferSize - 1] =
self.high_list[1:self.bufferSize]
self.high_list[-1] = df.high
self.close_list[0:self.bufferSize - 1] =
self.close_list[1:self.bufferSize]
self.close_list[-1] = df.close
self.low_list[0:self.bufferSize - 1] =
self.low_list[1:self.bufferSize]
self.low_list[-1] = df.low
策略的主体部分在on_quote()函数中实现。因为我们选择分钟级回测,所以会在每分钟调用on_quote()函数。
首先取到当日的quote,并计算过去$N$天的HH,HC,LC和LL,并据此计算Range和上下限Upper,Lower
HH = max(self.high_list[:-1])
HC = max(self.close_list[:-1])
LC = min(self.close_list[:-1])
LL = min(self.low_list[:-1])
Range = max(HH - LC, HC - LL)
Upper = self.open_list[-1] + self.k1 * Range
Lower = self.open_list[-1] - self.k2 * Range

我们的交易时间段为早上9:01:00到下午14:28:00,交易的逻辑为:
当分钟Bar的open向上突破上轨时,如果当时持有空单,则先平仓,再开多单;如果没有仓位,则直接开多单;
当分钟Bar的open向下突破下轨时,如果当时持有多单,则先平仓,再开空单;如果没有仓位,则直接开空单;
if self.pos == 0: if self.quote.open > Upper: self.short(self.quote, self.quote.close, 1) elif self.quote.open < Lower: self.buy(self.quote, self.quote.close, 1) elif self.pos < 0: if self.quote.open < Lower: self.cover(self.quote, self.quote.close, 1) self.long(self.quote, self.quote.close, 1) else: if self.quote.open > Upper: self.sell(self.quote, self.quote.close, 1) self.short(self.quote, self.quote.close, 1)
由于我们限制该策略为日内策略,故当交易时间超过14:28:00时,进行强行平仓。
elif self.quote.time > 142800: if self.pos > 0: self.sell(self.quote, self.quote.close, 1) elif self.pos < 0: self.cover(self.quote, self.quote.close, 1)
我们在下单后,可能由于市场剧烈变动导致未成交,因此在on_trade_ind()函数中记录具体成交情况,当空单成交时,self.pos减一,当多单成交时,self.pos加一。
def on_trade_ind(self, ind): if ind.entrust_action == 'sell' or ind.entrust_action == 'short': self.pos -= 1 elif ind.entrust_action == 'buy' or ind.entrust_action == 'cover': self.pos += 1 print(ind)
四. 回测结果¶

五、参考文献¶
版块内股票轮动策略¶
本策略完整实现代码见 这里。
本帖主要介绍了基于事件驱动回测框架实现版块内股票轮动策略。
一. 策略介绍¶
计算各股在过去$m$天相对板块指数的收益率 | $$R^A_{i,t} = (lnP_{i,t}-lnP_{i,t-m})-(lnP_{B,t}-lnP_{B,t-m})$$ | 其中$P_{i,t}$为股票$i$在$t$天的收盘价,$P_{B,t}$为板块指数在$t$天的收盘价。每天检查持仓,若持仓股$R^A_{i,t}$超过过去$n$天均值加$k$倍标准差,则卖出;反之,若有未持仓股$R^A_{i,t}$小于过去$n$天均值减$k$倍标准差,则买入。
二. 参数准备¶
我们在test_roll_trading.py文件中的test_strategy()函数中设置策略所需参数。首先确定策略开始日期,终止日期以及板块指数。在本文中,我们选择券商指数399975.SZ,并听过data_service得到该指数中所有成份股。
start_date = 20150901
end_date = 20171030
index = '399975.SZ'
data_service = RemoteDataService()
symbol_list = data_service.get_index_comp(index, start_date, start_date)
接着在props中设置参数
symbol_list.append(index)
props = {"symbol": ','.join(symbol_list),
"start_date": start_date,
"end_date": end_date,
"bar_type": "DAILY",
"init_balance": 1e7,
"std multiplier": 1.5,
"m": 10,
"n": 60,
"future_commission_rate": 0.00002,
"stock_commission_rate": 0.0001,
"stock_tax_rate": 0.0000}
我们可以在bar_type中设置换仓周期,现在支持分钟和日换仓,本例中选择每日调仓。
三. 策略实现¶
策略实现全部在roll.py中完成,创建名为RollStrategy()的class继承EventDrivenStrategy,具体分为以下几个步骤:
这里将后续步骤所需要的变量都创建好并初始化。
def __init__(self):
EventDrivenStrategy.__init__(self)
self.symbol = ''
self.benchmark_symbol = ''
self.quotelist = ''
self.startdate = ''
self.bufferSize = 0
self.rollingWindow = 0
self.bufferCount = 0
self.bufferCount2 = 0
self.closeArray = {}
self.activeReturnArray = {}
self.std = ''
self.balance = ''
self.multiplier = 1.0
self.std_multiplier = 0.0
这里将props中设置的参数传入。其中,self.closeArray和self.activeReturnArray数据类型为dict,key为股票代码,value分别为最近$m$天的收盘价和最近$n$天的active return。
def init_from_config(self, props):
super(RollStrategy, self).init_from_config(props)
self.symbol = props.get('symbol').split(',')
self.init_balance = props.get('init_balance')
self.startdate = props.get('start_date')
self.std_multiplier = props.get('std multiplier')
self.bufferSize = props.get('n')
self.rollingWindow = props.get('m')
self.benchmark_symbol = self.symbol[-1]
self.balance = self.init_balance
for s in self.symbol:
self.closeArray[s] = np.zeros(self.rollingWindow)
self.activeReturnArray[s] = np.zeros(self.bufferSize)
self.quotelist = []
for s in self.symbol:
self.quotelist.append(quote_dic.get(s))
接着对每只股票更新self.closeArray。因为self.closeArray为固定长度,更新方法为将第2个到最后1个元素向左平移1位,并将当前quote中最新的close放在末尾。
for stock in self.quotelist:
self.closeArray[stock.symbol][0:self.rollingWindow - 1] = self.closeArray[stock.symbol][1:self.rollingWindow]
self.closeArray[stock.symbol][-1] = stock.close
计算每只股票在过去$m$天的active return,存入self.activeReturnArray。
### calculate active return for each stock
benchmarkReturn = np.log(self.closeArray[self.benchmark_symbol][-1])
-np.log(self.closeArray[self.benchmark_symbol][0])
for stock in self.quotelist:
stockReturn = np.log(self.closeArray[stock.symbol][-1])
-np.log(self.closeArray[stock.symbol][0])
activeReturn = stockReturn - benchmarkReturn
self.activeReturnArray[stock.symbol][0:self.bufferSize - 1]
= self.activeReturnArray[stock.symbol][1:self.bufferSize]
self.activeReturnArray[stock.symbol][-1] = activeReturn
在策略首次执行时,默认等价值持有版块中所有的股票。
### On the first day of strategy, buy in equal value stock in the universe
stockvalue = self.balance/len(self.symbol)
for stock in self.quotelist:
if stock.symbol != self.benchmark_symbol:
self.buy(stock, stock.close,
np.floor(stockvalue/stock.close/self.multiplier))
在其他日期,当策略开始执行时,首先通过self.pm.holding_securities检查持有的股票代码,并与版块成分比较确定未持有的股票代码。
stockholdings = self.pm.holding_securities
noholdings = set(self.symbol) - stockholdings
stockvalue = self.balance/len(noholdings)
对于已持有的股票,计算最近$m$天的active return,若超过self.activeReturnArray均值的一定范围,就将该股票卖出。
for stock in list(stockholdings):
curRet = self.activeReturnArray[stock][-1]
avgRet = np.mean(self.activeReturnArray[stock][:-1])
stdRet = np.std(self.activeReturnArray[stock][:-1])
if curRet >= avgRet + self.std_multiplier * stdRet:
curPosition = self.pm.positions[stock].curr_size
stock_quote = quote_dic.get(stock)
self.sell(stock_quote, stock_quote.close, curPosition)
反之,对于未持有的股票,若其active return低于均值的一定范围,就将其买入。
for stock in list(noholdings):
curRet = self.activeReturnArray[stock][-1]
avgRet = np.mean(self.activeReturnArray[stock][:-1])
stdRet = np.std(self.activeReturnArray[stock][:-1])
if curRet < avgRet - self.std_multiplier * stdRet:
stock_quote = quote_dic.get(stock)
self.buy(stock_quote, stock_quote.close,
np.floor(stockvalue/stock_quote.close/self.multiplier))
此外,我们在框架中on_trade_ind()中实现了仓位管理。在策略初始化时,我们将组合中的现金设为初始资金。
self.init_balance = props.get('init_balance')
self.balance = self.init_balance
此后,每买入一只股票,我们将self.balance减去相应市值;每卖出一只股票,将self.balance加上相应市值。
def on_trade_ind(self, ind):
if ind.entrust_action == 'buy':
self.balance -= ind.fill_price * ind.fill_size * self.multiplier
elif ind.entrust_action == 'sell':
self.balance += ind.fill_price * ind.fill_size * self.multiplier
print(ind)
四. 回测结果¶

交易API¶
本产品提供了交易API,可用于委托、撤单、查询账户、查询持仓、查询委托、查询成交、批量下单等,以下是用法
导入接口¶
在python程序里面导入module,然后用注册的用户帐号登录就可以使用交易接口进行交易。
引入模块¶
from jaqs.trade.tradeapi import TradeApi
登录¶
tapi = TradeApi(addr="tcp://gw.quantos.org:8901") # tcp://gw.quantos.org:8901是仿真系统地址
user_info, msg = tapi.login("demo", "666666") # 示例账户,用户需要改为自己注册的账户
使用用户名、密码登陆, 如果成功,返回用户可用的策略帐号列表
定义并设置回调接口¶
TradeApi通过回调函数方式通知用户事件。事件包括三种:订单状态、成交回报、委托任务执行状态。
订单状态推送
def on_orderstatus(order): print "on_orderstatus:" #, order for key in order: print "%20s : %s" % (key, str(order[key])) print ""
成交回报推送
def on_trade(trade): print "on_trade:" for key in trade: print "%20s : %s" % (key, str(trade[key])) print ""
委托任务执行状态推送,通常可以忽略该回调函数
def on_taskstatus(task): print "on_taskstatus:" for key in task: print "%20s : %s" % (key, str(task[key])) print ""
设置回调函数
tapi.set_ordstatus_callback(on_orderstatus)
tapi.set_trade_callback(on_trade)
tapi.set_task_callback(on_taskstatus)
选择使用的策略帐号¶
sid, msg = tapi.use_strategy(1)
print "msg: ", msg
print "sid: ", sid
查询Portfolio¶
返回当前的策略帐号的Universe中所有标的的净持仓,包括持仓为0的标的。
df, msg = tapi.query_account()
print "msg: ", msg
print df
查询当前策略帐号的所有持仓¶
Short两个方向都有持仓,这里是返回两条记录 | 返回的 size 不带方向,全部为 正
df, msg = tapi.query_position()
print "msg: ", msg
print df
单标的下单¶
SellToday, SellYesterday | 返回 task_id
task_id, msg = tapi.place_order("000025.SZ", "Buy", 57, 100)
print "msg:", msg
print "task_id:", task_id
目标持仓下单¶
# goal_protfolio
# 参数:目标持仓
# 返回:(result, msg)
# result: 成功或失败
# msg: 错误原因
# 注意:目标持仓中必须包括所有的代码的持仓,即使不修改
# 先查询当前的持仓,
portfolio, msg = tapi.query_portfolio()
print "msg", msg
print "portfolio", portfolio
portfolio撤单¶
# stop_portfolio
# 撤单, 撤销所有portfolio订单
tapi.stop_portfolio()
批量下单(1)¶
place_batch_order,指定绝对size和交易类型
# place_batch_order
# 返回task_id, msg。
orders = [
{"security":"600030.SH", "action" : "Buy", "price": 16, "size":1000},
{"security":"600519.SH", "action" : "Buy", "price": 320, "size":1000},
]
task_id, msg = tapi.place_batch_order(orders, "", "{}")
print task_id
print msg
批量下单(2)¶
basket_order,指定变化量,不指定交易方向,由系统根据正负号来确定
# 批量下单2:basket_order
#
# 返回task_id, msg。
orders = [
{"security":"601857.SH", "ref_price": 8.40, "inc_size":1000},
{"security":"601997.SH", "ref_price": 14.540, "inc_size":20000},
]
task_id, msg = tapi.basket_order(orders, "", "{}")
print task_id
print msg
实盘交易¶
使用JAQS进行回测与实盘运行的代码具有高一致性,回测满意后,只需以下几点改动,即可接入实盘/模拟撮合:
- 使用实盘交易的交易接口:将
BacktestTradeApi
替换为RealTimeTradeApi
- 使用实盘交易主程序:将
EventBacktestInstance
替换为EventLiveTradeInstance
- 在数据接口
RemoteDataService
中订阅所要交易品种的行情 - 在主程序最后添加
time.sleep(9999999)
. 保证在事件循环运行中,主程序不会提前终止 - 实时行情均为逐笔或Tick数据,即使订阅多个品种,行情数据仍会逐个到达
strategy.on_tick()
函数
这里我们以双均线策略为例,展示实盘运行的代码:
props = {'symbol': 'rb1801.SHF'}
tapi = RealTimeTradeApi()
ins = EventLiveTradeInstance()
tapi.use_strategy(3)
ds = RemoteDataService()
strat = DoubleMaStrategy()
pm = PortfolioManager()
context = model.Context(data_api=ds, trade_api=tapi,
instance=ins, strategy=strat, pm=pm)
ins.init_from_config(props)
ds.subscribe(props['symbol'])
ins.run()
time.sleep(999999)
程序运行后,行情、策略、交易会在不同的线程内运行,我们只需要在on_tick
中进行下单,在on_trade
,
on_order_status
中处理交易回报即可。
正常收到行情如下:
rb1801.SHF 20171116-211319500 (BID) 229@3889.00 | 3891.00@12 (ASK)
Fast MA = 3889.89 Slow MA = 3889.81
rb1801.SHF 20171116-211320000 (BID) 224@3889.00 | 3891.00@13 (ASK)
Fast MA = 3889.93 Slow MA = 3889.83
rb1801.SHF 20171116-211320500 (BID) 223@3889.00 | 3891.00@5 (ASK)
Fast MA = 3889.89 Slow MA = 3889.85
rb1801.SHF 20171116-211321000 (BID) 223@3889.00 | 3891.00@5 (ASK)
Fast MA = 3889.93 Slow MA = 3889.88
rb1801.SHF 20171116-211321500 (BID) 24@3890.00 | 3891.00@5 (ASK)
Fast MA = 3890.00 Slow MA = 3889.92
如果发生下单、成交,则会收到如下回报:
rb1801.SHF 20171116-211319000 (BID) 230@3889.00 | 3891.00@6 (ASK)
Fast MA = 3889.93 Slow MA = 3889.79
Strategy on order status:
New | 20171115( 211319) Buy rb1801.SHF@3.000 size = 1
Strategy on order status:
Accepted | 20171115( 211319) Buy rb1801.SHF@3.000 size = 1
Strategy on trade:
20171115( 211319) Buy rb1801.SHF@3.000 size = 1
Strategy on order status:
Filled | 20171115( 211319) Buy rb1801.SHF@3.000 size = 1
Strategy on task ind:
task_id = 81116000001 | task_status = Stopped | task_algo =
task_msg =
DONE Execution Report (00'00"039):
+---------+------+----------+------+----+---------+-----+----------+----+---------+------------+-------+-------+--------+---------+
|underlyer| ba_id| symbol|jzcode|side|is_filled|price|fill_price|size|fill_size|pending_size|cancels|rejects|entrusts| duration|
+---------+------+----------+------+----+---------+-----+----------+----+---------+------------+-------+-------+--------+---------+
| 0|800000|rb1801.SHF| 27509|Long| Y| 3.0| 3.0000| 1| 1| 0| 0| 0| 1|00'00"033|
+---------+------+----------+------+----+---------+-----+----------+----+---------+------------+-------+-------+--------+---------+
API Refrence¶
If you want to know about package hierarchy, specific class / function...
API说明文档¶
行情数据API文档¶
市场数据¶
字典定义¶
市场名称 | 市场代码 |
---|---|
深交所 | SZ |
上交所 | SH |
中金所 | CFE |
郑商所 | CZC |
大商所 | DCE |
上期所 | SHF |
上金所 | SGE |
中证指数 | CSI |
港交所 | HK |
由标的原始代码加市场代码(表1)组合而成,中间以’.’隔开,如‘000001.SH’,多标的输入时以逗号 (‘,’) 隔开,如:‘000001.SH, cu1709.SHF’
Bar类型 | 说明 |
---|---|
15S | 15秒线 |
30S | 30秒线 |
1M | 1分钟线 |
5M | 5分钟线 |
15M | 15分钟线 |
1d | 日线 |
1w | 周线 |
1m | 月线 |
实时行情数据查询 quote¶
输入标的代码(支持多标的),输出为最新市场行情,以dataframe格式返回,可指定返回字段,以fields参数标识。
输入参数:
- 标的代码,支持多标的查询
- 需要返回字段(fields),多字段以’,’隔开
字段 | 类型 | 说明 | 缺省 |
---|---|---|---|
symbol | string | 标的代码,支持多标的查询 | 不可缺省 |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 | “” |
查询示例:
df, msg = api.quote(
view="000001.SH, cu1709.SHF",
fields="open,high,low,last,volume")
输出字段:
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 标的代码 |
code | string | 交易所原始代码 |
date | int | 自然日,YYYYMMDD格式,如20170823 |
time | int | 时间,精确到毫秒,如14:21:05.330记为142105330 |
trade_date | int | YYYYMMDD格式,如20170823 |
open | double | 开盘价 |
high | double | 最高价 |
low | double | 最低价 |
last | double | 最新价 |
close | double | 收盘价 |
volume | double | 成交量(总) |
turnover | double | 成交金额(总) |
vwap | double | 当日平均成交均价,计算公式为成交金额除以成交量 |
oi | double | 持仓总量 |
settle | double | 今结算价 |
iopv | double | IOPV净值估值 |
limit_up | double | 涨停价 |
limit_down | double | 跌停价 |
preclose | double | 昨收盘价 |
presettle | double | 昨结算价 |
preoi | double | 昨持仓 |
askprice1 | double | 申卖价1 |
askprice2 | double | 申卖价2 |
askprice3 | double | 申卖价3 |
askprice4 | double | 申卖价4 |
askprice5 | double | 申卖价5 |
bidprice1 | double | 申买价1 |
bidprice2 | double | 申买价2 |
bidprice3 | double | 申买价3 |
bidprice4 | double | 申买价4 |
bidprice5 | double | 申买价5 |
askvolume1 | double | 申卖量1 |
askvolume2 | double | 申卖量2 |
askvolume3 | double | 申卖量3 |
askvolume4 | double | 申卖量4 |
askvolume5 | double | 申卖量5 |
bidvolume1 | double | 申买量1 |
bidvolume2 | double | 申买量2 |
bidvolume3 | double | 申买量3 |
bidvolume4 | double | 申买量4 |
bidvolume5 | double | 申买量5 |
实时行情订阅 subscribe¶
使用subscribe()函数订阅实时市场行情。
输入参数:
- 标的代码,支持多标的查询
- 回调函数(func),格式为func(k, v)。k为数据类型,目前只支持实时行情(“quote”); v为实时行情数据,dictionary格式,数据含义参考quote函数输出字段定义。
- 需要返回字段(fields),多字段以’,’隔开。
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
symbol | string | 标的代码,支持多标的查询 | 不可缺省 |
func | function | 回调函数 | None |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 | “” |
使用示例:
def on_quote(k,v):
print v['symbol'] // 标的代码
print v['last'] // 最新成交价
print v['time'] // 最新成交时间
subs_list,msg = api.subscribe("000001.SH, cu1709.SHF",func=on_quote,fields="symbol,last,time,volume")
日线查询 daily¶
日线查询,支持停牌补齐、复权选择等选项。
输入参数:
- 标的代码,支持多标的查询,必要参数
- 开始日期 (start_date),string或者int类型:若为string类型,格式’YYYY-MM-DD’,如‘2017-08-01’;若为int类型,格式为YYYYMMDD,如20170801。必要参数。
- 结束日期 (end_date),string或者int类型:若为string类型,格式’YYYY-MM-DD’,如‘2017-08-01’;若为int类型,格式为YYYYMMDD,如20170801。必要参数。
- Bar类型(freq),支持日线(‘1d’),周线(‘1w’)和月线(‘1m’)。缺省为日线(‘1d’)。
- 复权类型(adjust_mode),string类型,’pre’为前复权,None不复权,’post’为后复权。缺省为None
- 返回字段 (fields),多字段以 ‘,’ 隔开,缺省时全字段返回。可选参数。
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
symbol | string | 标的代码 ,支持多标的查询 | 不可缺省 |
start_date | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ | 不可缺省 |
end_date | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ | 不可缺省 |
freq | string | 日线类型 | “1d” |
adjust_mode | string | ‘pre’为前复权,None不复权,’post’为后复权 | None |
fields | string | 需要返回字段,多字段以’,’隔开,为”“时返回所有字段 | “” |
查询示例:
df, msg = api.daily(
symbol="600832.SH, 600030.SH",
start_date="2012-10-26",
end_date="2012-11-30",
fields="",
adjust_mode="post")
返回字段:
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 标的代码 |
code | string | 交易所原始代码 |
trade_date | int | YYYYMMDD格式,如20170823 |
freq | string | 日线类型 |
open | double | 开盘价 |
high | double | 最高价 |
low | double | 最低价 |
close | double | 收盘价 |
volume | double | 成交量 |
turnover | double | 成交金额 |
vwap | double | 成交均价 |
settle | double | 结算价 |
oi | double | 持仓量 |
trade_status | string | 交易状态 |
分钟线查询 bar¶
查询各种类型的分钟线,支持日内及历史bar查询,以dataframe格式返回查询结果。
输入参数:
- 标的代码,支持多标的查询,必要参数。
- 开始时间 (start_time),精确到秒,string或者int类型:若为string类型,格式为’HH:MM:SS’,如‘09:32:35’;若为int类型,格式为HHMMSS,如93235。缺省为为开盘时间。
- 结束时间 (end_time),精确到秒,string或者int类型:若为string类型,格式为’HH:MM:SS’,如‘09:32:35’;若为int类型,格式为HHMMSS,如9323。缺省为当前时间(日内)或者收盘时间(历史)。
- 交易日 (trade_date),string或者int类型:若为string类型,格式’YYYY-MM-DD’,如‘2017-08-01’;若为int类型,格式为YYYYMMDD,如20170801。缺省为当前交易日。
- Bar类型(freq),支持一分钟线(‘1M’),五分钟线(‘5M’)和十五分钟线(‘15M’)。缺省为一分钟线 (‘1M’)。
- 返回字段 (fields),多字段以 ‘,’ 隔开,缺省时全字段返回。
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
symbol | string | 标的代码,支持多标的查询 | 不可缺省 |
start_time | int或string | 开始时间 | 开盘时间 |
end_time | int或string | 结束时间 | 收盘时间 |
trade_date | int或string | 交易日 | 当前交易日 |
freq | string | 分钟线类型 | “1M” |
fields | string | 需要返回字段,多字段以’,’隔开,为”“时返回所有字段 | “” |
查询示例:
df,msg = api.bar(
symbol="600030.SH",
trade_date=20170928,
freq="5M",
start_time="00:00:00",
end_time="16:00:00",
fields="")
返回字段:
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 标的代码 |
code | string | 交易所原始代码 |
date | int | 自然日,YYYYMMDD格式,如20170823 |
time | int | 时间,精确到毫秒,如14:21:05.330记为142105330 |
trade_date | int | YYYYMMDD格式,如20170823 |
freq | string | bar类型 |
open | double | bar内开盘价 |
high | double | bar内最高价 |
low | double | bar内最低价 |
close | double | bar内收盘价 |
volume | double | bar内成交量 |
turnover | double | bar内成交金额 |
vwap | double | bar内成交均价 |
oi | double | 当前持仓量 |
settle | double | 结算价 |
bar quote查询 bar_quote¶
在分钟线基础上再加入该分钟结束前最后一笔的行情信息(主要是ask,bid信息),以dataframe格式返回查询结果。
输入参数:
- 标的代码,支持多标的查询,必要参数。
- 开始时间 (start_time),精确到秒,string或者int类型:若为string类型,格式为’HH:MM:SS’,如‘09:32:35’;若为int类型,格式为HHMMSS,如93235。缺省为为开盘时间。
- 结束时间 (end_time),精确到秒,string或者int类型:若为string类型,格式为’HH:MM:SS’,如‘09:32:35’;若为int类型,格式为HHMMSS,如9323。缺省为当前时间(日内)或者收盘时间(历史)。
- 交易日 (trade_date),string或者int类型:若为string类型,格式’YYYY-MM-DD’,如‘2017-08-01’;若为int类型,格式为YYYYMMDD,如20170801。缺省为当前交易日。
- Bar类型(freq),支持一分钟线(‘1M’),五分钟线(‘5M’)和十五分钟线(‘15M’)。缺省为一分钟线 (‘1M’)。
- 返回字段 (fields),多字段以 ‘,’ 隔开,缺省时全字段返回。
字段 | 类型 | 说明 | 缺省值 |
---|---|---|---|
symbol | string | 标的代码 ,支持多标的查询 | 不可缺省 |
start_time | int或string | 开始时间 | 开盘时间 |
end_time | int或string | 结束时间 | 收盘时间 |
trade_date | int或string | 交易日 | 当前交易日 |
freq | string | 分钟线类型 | “1M” |
fields | string | 需要返回字段,多字段以’,’隔开,为”“时返回所有字段 | “” |
查询示例:
df,msg = api.bar_quote(
symbol="000001.SH,cu1709.SHF",
start_time = "09:56:00",
end_time="13:56:00",
trade_date=20170823,
freq= "5M",
fields="open,high,low,last,volume")
返回字段:
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 标的代码 |
code | string | 交易所原始代码 |
date | int | 自然日,YYYYMMDD格式,如20170823 |
time | int | 时间,精确到毫秒,如14:21:05.330记为142105330 |
trade_date | int | 交易日,YYYYMMDD格式,如20170823 |
freq | string | bar类型 |
open | double | bar内开盘价 |
high | double | bar内最高价 |
low | double | bar内最低价 |
close | double | bar内收盘价 |
volume | double | bar内成交量 |
turnover | double | bar内成交金额 |
vwap | double | bar内成交均价 |
oi | double | 当前持仓量 |
settle | double | 结算价 |
askprice1 | double | 申卖价1 |
askprice2 | double | 申卖价2 |
askprice3 | double | 申卖价3 |
askprice4 | double | 申卖价4 |
askprice5 | double | 申卖价5 |
bidprice1 | double | 申买价1 |
bidprice2 | double | 申买价2 |
bidprice3 | double | 申买价3 |
bidprice4 | double | 申买价4 |
bidprice5 | double | 申买价5 |
askvolume1 | double | 申卖量1 |
askvolume2 | double | 申卖量2 |
askvolume3 | double | 申卖量3 |
askvolume4 | double | 申卖量4 |
askvolume5 | double | 申卖量5 |
bidvolume1 | double | 申买量1 |
bidvolume2 | double | 申买量2 |
bidvolume3 | double | 申买量3 |
bidvolume4 | double | 申买量4 |
bidvolume5 | double | 申买量5 |
参考数据API文档¶
基础数据¶
调用说明¶
- 每个数据表都是通过api.query函数调用,第一个参数view需填入对应的接口名,如:
view="lb.instrumentInfo"
- 每个数据表的输入参数指的是filter参数里面的内容,通过’&’符号拼接,如:
filter="inst_type=&status=1&symbol="
证券基础信息表¶
df, msg = api.query(
view="lb.instrumentInfo",
fields="status,list_date, fullname_en, market",
filter="inst_type=&status=1&symbol=",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
inst_type | string | 证券类别 |
start_delistdate | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
end_delistdate | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
字段 | 类型 | 说明 |
---|---|---|
inst_type | string | 证券类别 |
market | string | 交易所代码 |
symbol | string | 证券代码 |
name | string | 证券名称 |
list_date | string | 上市日期 |
delist_date | string | 退市日期 |
cnspell | string | 拼音简写 |
currency | string | 交易货币 |
status | string | 上市状态 |
buylot | INT | 最小买入单位 |
selllot | INT | 最大买入单位 |
pricetick | double | 最小变动单位 |
product | string | 合约品种 |
underlying | string | 对应标的 |
multiplier | int | 合约乘数 |
交易日历表¶
df, msg = api.query(
view="jz.secTradeCal",
fields="date,istradeday,isweekday,isholiday",
filter="start_date=20170101&end_date=20170801",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
end_date | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
字段 | 类型 | 说明 |
---|---|---|
trade_date | string | 日历日期 |
istradeday | string | 是否交易日 |
isweekday | string | 是否工作日 |
isweekend | string | 是否周末 |
isholiday | string | 是否节假日 |
分配除权信息表¶
df, msg = api.query(
view="lb.secDividend",
fields="",
filter="start_date=20170101&end_date=20170801",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
end_date | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
end_date | string | 分红年度截至日 |
process_stauts | string | 事件进程 |
publish_date | string | 分红实施公告日 |
record_date | string | 股权登记日 |
exdiv_date | string | 除权除息日 |
cash | double | 每股分红(税前) |
cash_tax | double | 每股分红(税后) |
share_ratio | double | 送股比例 |
share_trans_ratio | double | 转赠比例 |
cashpay_date | string | 派现日 |
bonus_list_date | string | 送股上市日 |
复权因子表¶
df, msg = api.query(
view="lb.secAdjFactor",
fields="",
filter="symbol=002059.SZ&start_date=20170101&end_date=20170801",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
end_date | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
trade_date | string | 除权除息日 |
adjust_factor | double | 复权因子 |
停复牌信息表¶
df, msg = api.query(
view="lb.secSusp",
fields="susp_time",
filter="symbol=002059",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
end_date | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 停牌公告日期 |
susp_date | string | 停牌开始日期 |
susp_time | string | 停牌开始时间 |
resu_date | string | 复牌日期 |
resu_time | string | 复牌时间 |
susp_reason | string | 停牌原因 |
行业分类表¶
df, msg = api.query(
view="lb.secIndustry",
fields="",
filter="industry1_name=金融&industry2_name=金融&industry_src=中证",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
industry1_name | string | 一级行业名称 例如:钢铁 |
industry2_name | string | 二级行业名称 |
industry3_name | string | 三级行业名称 |
industry4_name | string | 四级行业名称 |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
! data_format | string | 格式 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
industry_src | string | 行业分类来源 |
in_date | string | 纳入日期 |
out_date | string | 剔除日期 |
is_new | string | 是否最新 |
industry1_code | string | 一级行业代码 |
industry1_name | string | 一级行业名称 |
industry2_code | string | 二级行业代码 |
industry2_name | string | 二级行业名称 |
industry3_code | string | 三级行业代码 |
industry3_name | string | 三级行业名称 |
industry4_code | string | 四级行业代码 |
industry4_name | string | 四级行业名称 |
常量参数表¶
df, msg = api.query(
view="jz.sysConstants",
fields="",
filter="code_type=inst_type",
data_format='pandas'
)
字段 | 类型 | 说明 |
---|---|---|
code_type | string | 参数类型 |
fields | string | 需要返回字段,多字段以’,’隔开;为”“时返回所有字段 |
字段 | 类型 | 说明 |
---|---|---|
code_type | string | 参数类型 |
type_name | string | 参数名称 |
code | string | 参数代码 |
value | string | 参数值 |
日行情估值表¶
df, msg = api.query(
view="lb.secDailyIndicator",
fields='pb,net_assets,ncf,price_level',
filter='symbol=000063.SZ&start_date=20170605&end_date=20170701'
)
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | int或者string | 开始日期, int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
end_date | int或者string | 结束日期,int时为YYYYMMDD格式(如20170809);string时为’YYYY-MM-DD’格式,如‘2017-08-09’ |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
trade_date | string | 交易日期 |
total_mv | double | 当日总市值 |
float_mv | double | 当日流通市值 |
pe | double | 市盈率 |
pb_new | double | 市净率 |
pe_ttm | double | 市盈率TTM |
pcf_ocf | double | 市现率(PCF,经营现金流) |
pcf_ocfttm | double | 市现率(PCF,经营现金流TTM) |
pcf_ncf | double | 市现率(PCF,现金净流量) |
pcf_ncfttm | double | 市现率(PCF,现金净流量TTM) |
ps | double | 市销率(PS) |
ps_ttm | double | 市销率(PS,TTM) |
turnoverratio | double | 换手率 |
freeturnover | double | 换手率(自由流通股本) |
total_share | double | 当日总股本 |
float_share | double | 当日流通股本 |
close | double | 当日收盘价 |
price_div_dps | double | 股价/每股派息 |
free_share | double | 当日自由流通股本 |
profit_ttm | double | 归属母公司净利润(TTM) |
profit_lyr | double | 归属母公司净利润(LYR) |
net_assets | double | 当日净资产 |
cash_flows_oper_act_ttm | double | 经营活动产生的现金流量净额(TTM) |
cash_flows_oper_act_lyr | double | 经营活动产生的现金流量净额(LYR) |
operrev_ttm | double | 营业收入(TTM) |
operrev_lyr | double | 营业收入(LYR) |
limit_status | Int | 涨跌停状态 |
资产负债表¶
df, msg = api.query(
view="lb.balanceSheet",
fields="",
filter="symbol=002636.SZ",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 公告开始日期 |
end_date | string | 公告结束日期 |
comp_type_code | string | 公司类型代码 |
start_actdate | string | 实际公告开始日期 |
end_actdate | string | 实际公告结束日期 |
start_reportdate | string | 报告期开始日期 |
start_reportdate | string | 报告期结束日期 |
report_type | string | 报表类型 |
update_flag | int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
comp_type_code | string | 公司类型代码 |
act_ann_date | string | 实际公告日期 |
report_date | string | 报告期 |
report_type | string | 报表类型 |
currency | string | 货币代码 |
monetary_cap | double | 货币资金 |
tradable_assets | double | 交易性金融资产 |
notes_rcv | double | 应收票据 |
acct_rcv | double | 应收账款 |
other_rcv | double | 其他应收款 |
pre_pay | double | 预付款项 |
dvd_rcv | double | 应收股利 |
int_rcv | double | 应收利息 |
inventories | double | 存货 |
consumptive_assets | double | 消耗性生物资产 |
deferred_exp | double | 待摊费用 |
noncur_assets_due_1y | double | 一年内到期的非流动资产 |
settle_rsrv | double | 结算备付金 |
loans_to_banks | double | 拆出资金 |
prem_rcv | double | 应收保费 |
rcv_from_reinsurer | double | 应收分保账款 |
rcv_from_ceded_insur_cont_rsrv | double | 应收分保合同准备金 |
red_monetary_cap_for_sale | double | 买入返售金融资产 |
other_cur_assets | double | 其他流动资产 |
tot_cur_assets | double | 流动资产合计 |
fin_assets_avail_for_sale | double | 可供出售金融资产 |
held_to_mty_invest | double | 持有至到期投资 |
long_term_eqy_invest | double | 长期股权投资 |
invest_real_estate | double | 投资性房地产 |
time_deposits | double | 定期存款 |
other_assets | double | 其他资产 |
long_term_rec | double | 长期应收款 |
fix_assets | double | 固定资产 |
const_in_prog | double | 在建工程 |
proj_matl | double | 工程物资 |
fix_assets_disp | double | 固定资产清理 |
productive_bio_assets | double | 生产性生物资产 |
oil_and_natural_gas_assets | double | 油气资产 |
intang_assets | double | 无形资产 |
r_and_d_costs | double | 开发支出 |
goodwill | double | 商誉 |
long_term_deferred_exp | double | 长期待摊费用 |
deferred_tax_assets | double | 递延所得税资产 |
loans_and_adv_granted | double | 发放贷款及垫款 |
oth_non_cur_assets | double | 其他非流动资产 |
tot_non_cur_assets | double | 非流动资产合计 |
cash_deposits_central_bank | double | 现金及存放中央银行款项 |
asset_dep_oth_banks_fin_inst | double | 存放同业和其它金融机构款项 |
precious_metals | double | 贵金属 |
derivative_fin_assets | double | 衍生金融资产 |
agency_bus_assets | double | 代理业务资产 |
subr_rec | double | 应收代位追偿款 |
rcv_ceded_unearned_prem_rsrv | double | 应收分保未到期责任准备金 |
rcv_ceded_claim_rsrv | double | 应收分保未决赔款准备金 |
rcv_ceded_life_insur_rsrv | double | 应收分保寿险责任准备金 |
rcv_ceded_lt_health_insur_rsrv | double | 应收分保长期健康险责任准备金 |
mrgn_paid | double | 存出保证金 |
insured_pledge_loan | double | 保户质押贷款 |
cap_mrgn_paid | double | 存出资本保证金 |
independent_acct_assets | double | 独立账户资产 |
clients_cap_deposit | double | 客户资金存款 |
clients_rsrv_settle | double | 客户备付金 |
incl_seat_fees_exchange | double | 其中:交易席位费 |
rcv_invest | double | 应收款项类投资 |
tot_assets | double | 资产总计 |
st_borrow | double | 短期借款 |
borrow_central_bank | double | 向中央银行借款 |
deposit_received_ib_deposits | double | 吸收存款及同业存放 |
loans_oth_banks | double | 拆入资金 |
tradable_fin_liab | double | 交易性金融负债 |
notes_payable | double | 应付票据 |
acct_payable | double | 应付账款 |
adv_from_cust | double | 预收款项 |
fund_sales_fin_assets_rp | double | 卖出回购金融资产款 |
handling_charges_comm_payable | double | 应付手续费及佣金 |
empl_ben_payable | double | 应付职工薪酬 |
taxes_surcharges_payable | double | 应交税费 |
int_payable | double | 应付利息 |
dvd_payable | double | 应付股利 |
other_payable | double | 其他应付款 |
acc_exp | double | 预提费用 |
deferred_inc | double | 递延收益 |
st_bonds_payable | double | 应付短期债券 |
payable_to_reinsurer | double | 应付分保账款 |
rsrv_insur_cont | double | 保险合同准备金 |
acting_trading_sec | double | 代理买卖证券款 |
acting_uw_sec | double | 代理承销证券款 |
non_cur_liab_due_within_1y | double | 一年内到期的非流动负债 |
other_cur_liab | double | 其他流动负债 |
tot_cur_liab | double | 流动负债合计 |
lt_borrow | double | 长期借款 |
bonds_payable | double | 应付债券 |
lt_payable | double | 长期应付款 |
specific_item_payable | double | 专项应付款 |
provisions | double | 预计负债 |
deferred_tax_liab | double | 递延所得税负债 |
deferred_inc_non_cur_liab | double | 递延收益-非流动负债 |
other_non_cur_liab | double | 其他非流动负债 |
tot_non_cur_liab | double | 非流动负债合计 |
liab_dep_other_banks_inst | double | 同业和其它金融机构存放款项 |
derivative_fin_liab | double | 衍生金融负债 |
cust_bank_dep | double | 吸收存款 |
agency_bus_liab | double | 代理业务负债 |
other_liab | double | 其他负债 |
prem_received_adv | double | 预收保费 |
deposit_received | double | 存入保证金 |
insured_deposit_invest | double | 保户储金及投资款 |
unearned_prem_rsrv | double | 未到期责任准备金 |
out_loss_rsrv | double | 未决赔款准备金 |
life_insur_rsrv | double | 寿险责任准备金 |
lt_health_insur_v | double | 长期健康险责任准备金 |
independent_acct_liab | double | 独立账户负债 |
incl_pledge_loan | double | 其中:质押借款 |
claims_payable | double | 应付赔付款 |
dvd_payable_insured | double | 应付保单红利 |
total_liab | double | 负债合计 |
capital_stk | double | 股本 |
capital_reser | double | 资本公积金 |
special_rsrv | double | 专项储备 |
surplus_rsrv | double | 盈余公积金 |
undistributed_profit | double | 未分配利润 |
less_tsy_stk | double | 减:库存股 |
prov_nom_risks | double | 一般风险准备 |
cnvd_diff_foreign_curr_stat | double | 外币报表折算差额 |
unconfirmed_invest_loss | double | 未确认的投资损失 |
minority_int | double | 少数股东权益 |
tot_shrhldr_eqy_excl_min_int | double | 股东权益合计(不含少数股东权益) |
tot_shrhldr_eqy_incl_min_int | double | 股东权益合计(含少数股东权益) |
tot_liab_shrhldr_eqy | double | 负债及股东权益总计 |
spe_cur_assets_diff | double | 流动资产差额(特殊报表科目) |
tot_cur_assets_diff | double | 流动资产差额(合计平衡项目) |
spe_non_cur_assets_diff | double | 非流动资产差额(特殊报表科目) |
tot_non_cur_assets_diff | double | 非流动资产差额(合计平衡项目) |
spe_bal_assets_diff | double | 资产差额(特殊报表科目) |
tot_bal_assets_diff | double | 资产差额(合计平衡项目) |
spe_cur_liab_diff | double | 流动负债差额(特殊报表科目) |
tot_cur_liab_diff | double | 流动负债差额(合计平衡项目) |
spe_non_cur_liab_diff | double | 非流动负债差额(特殊报表科目) |
tot_non_cur_liab_diff | double | 非流动负债差额(合计平衡项目) |
spe_bal_liab_diff | double | 负债差额(特殊报表科目) |
tot_bal_liab_diff | double | 负债差额(合计平衡项目) |
spe_bal_shrhldr_eqy_diff | double | 股东权益差额(特殊报表科目) |
tot_bal_shrhldr_eqy_diff | double | 股东权益差额(合计平衡项目) |
spe_bal_liab_eqy_diff | double | 负债及股东权益差额(特殊报表项目) |
tot_bal_liab_eqy_diff | double | 负债及股东权益差额(合计平衡项目) |
lt_payroll_payable | double | 长期应付职工薪酬 |
other_comp_income | double | 其他综合收益 |
other_equity_tools | double | 其他权益工具 |
other_equity_tools_p_shr | double | 其他权益工具:优先股 |
lending_funds | double | 融出资金 |
accounts_receivable | double | 应收款项 |
st_financing_payable | double | 应付短期融资款 |
payables | double | 应付款项 |
update_flag | int | 数据更新标记 |
利润表¶
df, msg = api.query(
view="lb.income",
fields="",
filter="symbol=600030.SH,000063.SZ,000001.SZ&report_type=408002000&start_date=20160601&end_date=20170601",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 公告开始日期 |
end_date | string | 公告结束日期 |
comp_type_code | string | 公司类型代码 |
start_actdate | string | 实际公告开始日期 |
end_actdate | string | 实际公告结束日期 |
start_reportdate | string | 报告期开始日期 |
start_reportdate | string | 报告期结束日期 |
report_type | string | 报表类型 |
update_flag | int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
comp_type_code | string | 公司类型代码 |
act_ann_date | string | 实际公告日期 |
report_date | string | 报告期 |
report_type | string | 报表类型 |
currency | string | 货币代码 |
total_oper_rev | double | 营业总收入 |
oper_rev | double | 营业收入 |
int_income | double | 利息收入 |
net_int_income | double | 利息净收入 |
insur_prem_unearned | double | 已赚保费 |
handling_chrg_income | double | 手续费及佣金收入 |
net_handling_chrg_income | double | 手续费及佣金净收入 |
net_inc_other_ops | double | 其他经营净收益 |
plus_net_inc_other_bus | double | 加:其他业务净收益 |
prem_income | double | 保费业务收入 |
less_ceded_out_prem | double | 减:分出保费 |
chg_unearned_prem_res | double | 提取未到期责任准备金 |
incl_reinsurance_prem_inc | double | 其中:分保费收入 |
net_inc_sec_trading_brok_bus | double | 代理买卖证券业务净收入 |
net_inc_sec_uw_bus | double | 证券承销业务净收入 |
net_inc_ec_asset_mgmt_bus | double | 受托客户资产管理业务净收入 |
other_bus_income | double | 其他业务收入 |
plus_net_gain_chg_fv | double | 加:公允价值变动净收益 |
plus_net_invest_inc | double | 加:投资净收益 |
incl_inc_invest_assoc_jv_entp | double | 其中:对联营企业和合营企业的投资收益 |
plus_net_gain_fx_trans | double | 加:汇兑净收益 |
tot_oper_cost | double | 营业总成本 |
less_oper_cost | double | 减:营业成本 |
less_int_exp | double | 减:利息支出 |
less_handling_chrg_comm_exp | double | 减:手续费及佣金支出 |
less_taxes_surcharges_ops | double | 减:营业税金及附加 |
less_selling_dist_exp | double | 减:销售费用 |
less_gerl_admin_exp | double | 减:管理费用 |
less_fin_exp | double | 减:财务费用 |
less_impair_loss_assets | double | 减:资产减值损失 |
prepay_surr | double | 退保金 |
tot_claim_exp | double | 赔付总支出 |
chg_insur_cont_rsrv | double | 提取保险责任准备金 |
dvd_exp_insured | double | 保户红利支出 |
reinsurance_exp | double | 分保费用 |
oper_exp | double | 营业支出 |
less_claim_recb_reinsurer | double | 减:摊回赔付支出 |
less_ins_rsrv_recb_reinsurer | double | 减:摊回保险责任准备金 |
less_exp_recb_reinsurer | double | 减:摊回分保费用 |
other_bus_cost | double | 其他业务成本 |
oper_profit | double | 营业利润 |
plus_non_oper_rev | double | 加:营业外收入 |
less_non_oper_exp | double | 减:营业外支出 |
il_net_loss_disp_noncur_asset | double | 其中:减:非流动资产处置净损失 |
tot_profit | double | 利润总额 |
inc_tax | double | 所得税 |
unconfirmed_invest_loss | double | 未确认投资损失 |
net_profit_incl_min_int_inc | double | 净利润(含少数股东损益) |
net_profit_excl_min_int_inc | double | 净利润(不含少数股东损益) |
minority_int_inc | double | 少数股东损益 |
other_compreh_inc | double | 其他综合收益 |
tot_compreh_inc | double | 综合收益总额 |
tot_compreh_inc_parent_comp | double | 综合收益总额(母公司) |
tot_compreh_inc_min_shrhldr | double | 综合收益总额(少数股东) |
ebit | double | 息税前利润 |
ebitda | double | 息税折旧摊销前利润 |
net_profit_after_ded_nr_lp | double | 扣除非经常性损益后净利润 |
net_profit_under_intl_acc_sta | double | 国际会计准则净利润 |
s_fa_eps_basic | double | 基本每股收益 |
s_fa_eps_diluted | double | 稀释每股收益 |
insurance_expense | double | 保险业务支出 |
spe_bal_oper_profit | double | 营业利润差额(特殊报表科目) |
tot_bal_oper_profit | double | 营业利润差额(合计平衡项目) |
spe_bal_tot_profit | double | 利润总额差额(特殊报表科目) |
tot_bal_tot_profit | double | 利润总额差额(合计平衡项目) |
spe_bal_net_profit | double | 净利润差额(特殊报表科目) |
tot_bal_net_profit | double | 净利润差额(合计平衡项目) |
undistributed_profit | double | 年初未分配利润 |
adjlossgain_prevyear | double | 调整以前年度损益 |
transfer_from_surplusreserve | double | 盈余公积转入 |
transfer_from_housingimprest | double | 住房周转金转入 |
transfer_from_others | double | 其他转入 |
distributable_profit | double | 可分配利润 |
withdr_legalsurplus | double | 提取法定盈余公积 |
withdr_legalpubwelfunds | double | 提取法定公益金 |
workers_welfare | double | 职工奖金福利 |
withdr_buzexpwelfare | double | 提取企业发展基金 |
withdr_reservefund | double | 提取储备基金 |
distributable_profit_shrhder | double | 可供股东分配的利润 |
prfshare_dvd_payable | double | 应付优先股股利 |
withdr_othersurpreserve | double | 提取任意盈余公积金 |
comshare_dvd_payable | double | 应付普通股股利 |
capitalized_comstock_div | double | 转作股本的普通股股利 |
update_flag | double | 数据更新标记 |
现金流量表¶
df, msg = api.query(
view="lb.cashFlow",
fields="",
filter="symbol=002548.SZ",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 公告开始日期 |
end_date | string | 公告结束日期 |
comp_type_code | string | 公司类型代码 |
start_actdate | string | 实际公告开始日期 |
end_actdate | string | 实际公告结束日期 |
start_reportdate | string | 报告期开始日期 |
start_reportdate | string | 报告期结束日期 |
report_type | string | 报表类型 |
update_flag | int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
comp_type_code | string | 公司类型代码 |
act_ann_date | string | 实际公告日期 |
report_date | string | 报告期 |
report_type | string | 报表类型 |
currency | string | 货币代码 |
cash_recp_sg_and_rs | double | 销售商品、提供劳务收到的现金 |
recp_tax_rends | double | 收到的税费返还 |
net_incr_dep_cob | double | 客户存款和同业存放款项净增加额 |
net_incr_loans_central_bank | double | 向中央银行借款净增加额 |
net_incr_fund_borr_ofi | double | 向其他金融机构拆入资金净增加额 |
cash_recp_prem_orig_inco | double | 收到原保险合同保费取得的现金 |
net_incr_insured_dep | double | 保户储金净增加额 |
net_cash_received_reinsu_bus | double | 收到再保业务现金净额 |
net_incr_disp_tfa | double | 处置交易性金融资产净增加额 |
net_incr_int_handling_chrg | double | 收取利息和手续费净增加额 |
net_incr_disp_faas | double | 处置可供出售金融资产净增加额 |
net_incr_loans_other_bank | double | 拆入资金净增加额 |
net_incr_repurch_bus_fund | double | 回购业务资金净增加额 |
other_cash_recp_ral_oper_act | double | 收到其他与经营活动有关的现金 |
stot_cash_inflows_oper_act | double | 经营活动现金流入小计 |
cash_pay_goods_purch_serv_rec | double | 购买商品、接受劳务支付的现金 |
cash_pay_beh_empl | double | 支付给职工以及为职工支付的现金 |
pay_all_typ_tax | double | 支付的各项税费 |
net_incr_clients_loan_adv | double | 客户贷款及垫款净增加额 |
net_incr_dep_cbob | double | 存放央行和同业款项净增加额 |
cash_pay_claims_orig_inco | double | 支付原保险合同赔付款项的现金 |
handling_chrg_paid | double | 支付手续费的现金 |
comm_insur_plcy_paid | double | 支付保单红利的现金 |
other_cash_pay_ral_oper_act | double | 支付其他与经营活动有关的现金 |
stot_cash_outflows_oper_act | double | 经营活动现金流出小计 |
net_cash_flows_oper_act | double | 经营活动产生的现金流量净额 |
cash_recp_disp_withdrwl_invest | double | 收回投资收到的现金 |
cash_recp_return_invest | double | 取得投资收益收到的现金 |
net_cash_recp_disp_fiolta | double | 处置固定资产、无形资产和其他长期资产收回的现金净额 |
net_cash_recp_disp_sobu | double | 处置子公司及其他营业单位收到的现金净额 |
other_cash_recp_ral_inv_act | double | 收到其他与投资活动有关的现金 |
stot_cash_inflows_inv_act | double | 投资活动现金流入小计 |
cash_pay_acq_const_fiolta | double | 购建固定资产、无形资产和其他长期资产支付的现金 |
cash_paid_invest | double | 投资支付的现金 |
net_cash_pay_aquis_sobu | double | 取得子公司及其他营业单位支付的现金净额 |
other_cash_pay_ral_inv_act | double | 支付其他与投资活动有关的现金 |
net_incr_pledge_loan | double | 质押贷款净增加额 |
stot_cash_outflows_inv_act | double | 投资活动现金流出小计 |
net_cash_flows_inv_act | double | 投资活动产生的现金流量净额 |
cash_recp_cap_contrib | double | 吸收投资收到的现金 |
incl_cash_rec_saims | double | 其中:子公司吸收少数股东投资收到的现金 |
cash_recp_borrow | double | 取得借款收到的现金 |
proc_issue_bonds | double | 发行债券收到的现金 |
other_cash_recp_ral_fnc_act | double | 收到其他与筹资活动有关的现金 |
stot_cash_inflows_fnc_act | double | 筹资活动现金流入小计 |
cash_prepay_amt_borr | double | 偿还债务支付的现金 |
cash_pay_dist_dpcp_int_exp | double | 分配股利、利润或偿付利息支付的现金 |
incl_dvd_profit_paid_sc_ms | double | 其中:子公司支付给少数股东的股利、利润 |
other_cash_pay_ral_fnc_act | double | 支付其他与筹资活动有关的现金 |
stot_cash_outflows_fnc_act | double | 筹资活动现金流出小计 |
net_cash_flows_fnc_act | double | 筹资活动产生的现金流量净额 |
eff_fx_flu_cash | double | 汇率变动对现金的影响 |
net_incr_cash_cash_equ | double | 现金及现金等价物净增加额 |
cash_cash_equ_beg_period | double | 期初现金及现金等价物余额 |
cash_cash_equ_end_period | double | 期末现金及现金等价物余额 |
net_profit | double | 净利润 |
unconfirmed_invest_loss | double | 未确认投资损失 |
plus_prov_depr_assets | double | 加:资产减值准备 |
depr_fa_coga_dpba | double | 固定资产折旧、油气资产折耗、生产性生物资产折旧 |
amort_intang_assets | double | 无形资产摊销 |
amort_lt_deferred_exp | double | 长期待摊费用摊销 |
decr_deferred_exp | double | 待摊费用减少 |
incr_acc_exp | double | 预提费用增加 |
loss_disp_fiolta | double | 处置固定、无形资产和其他长期资产的损失 |
loss_scr_fa | double | 固定资产报废损失 |
loss_fv_chg | double | 公允价值变动损失 |
fin_exp | double | 财务费用 |
invest_loss | double | 投资损失 |
decr_deferred_inc_tax_assets | double | 递延所得税资产减少 |
incr_deferred_inc_tax_liab | double | 递延所得税负债增加 |
decr_inventories | double | 存货的减少 |
decr_oper_payable | double | 经营性应收项目的减少 |
incr_oper_payable | double | 经营性应付项目的增加 |
others | double | 其他 |
im_net_cash_flows_oper_act | double | 间接法-经营活动产生的现金流量净额 |
conv_debt_into_cap | double | 债务转为资本 |
conv_corp_bonds_due_within_1y | double | 一年内到期的可转换公司债券 |
fa_fnc_leases | double | 融资租入固定资产 |
end_bal_cash | double | 现金的期末余额 |
less_beg_bal_cash | double | 减:现金的期初余额 |
plus_end_bal_cash_equ | double | 加:现金等价物的期末余额 |
less_beg_bal_cash_equ | double | 减:现金等价物的期初余额 |
im_net_incr_cash_cash_equ | double | 间接法-现金及现金等价物净增加额 |
free_cash_flow | double | 企业自由现金流量(FCFF) |
spe_bal_cash_inflows_oper | double | 经营活动现金流入差额(特殊报表科目) |
tot_bal_cash_inflows_oper | double | 经营活动现金流入差额(合计平衡项目) |
spe_bal_cash_outflows_oper | double | 经营活动现金流出差额(特殊报表科目) |
tot_bal_cash_outflows_oper | double | 经营活动现金流出差额(合计平衡项目) |
tot_bal_netcash_outflows_oper | double | 经营活动产生的现金流量净额差额(合计平衡项目) |
spe_bal_cash_inflows_inv | double | 投资活动现金流入差额(特殊报表科目) |
tot_bal_cash_inflows_inv | double | 投资活动现金流入差额(合计平衡项目) |
spe_bal_cash_outflows_inv | double | 投资活动现金流出差额(特殊报表科目) |
tot_bal_cash_outflows_inv | double | 投资活动现金流出差额(合计平衡项目) |
tot_bal_netcash_outflows_inv | double | 投资活动产生的现金流量净额差额(合计平衡项目) |
spe_bal_cash_inflows_fnc | double | 筹资活动现金流入差额(特殊报表科目) |
tot_bal_cash_inflows_fnc | double | 筹资活动现金流入差额(合计平衡项目) |
spe_bal_cash_outflows_fnc | double | 筹资活动现金流出差额(特殊报表科目) |
tot_bal_cash_outflows_fnc | double | 筹资活动现金流出差额(合计平衡项目) |
tot_bal_netcash_outflows_fnc | double | 筹资活动产生的现金流量净额差额(合计平衡项目) |
spe_bal_netcash_inc | double | 现金净增加额差额(特殊报表科目) |
tot_bal_netcash_inc | double | 现金净增加额差额(合计平衡项目) |
spe_bal_netcash_equ_undir | double | 间接法-经营活动现金流量净额差额(特殊报表科目) |
tot_bal_netcash_equ_undir | double | 间接法-经营活动现金流量净额差额(合计平衡项目) |
spe_bal_netcash_inc_undir | double | 间接法-现金净增加额差额(特殊报表科目) |
spe_bal_netcash_inc_undir | double | 间接法-现金净增加额差额(合计平衡项目) |
update_flag | int | 数据更新标记 |
业绩快报¶
df, msg = api.query(
view="lb.profitExpress",
fields="",
filter="start_anndate=20170101&end_anndate=20171010",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_anndate | string | 公告开始日期 |
end_anndate | string | 公告结束日期 |
start_reportdate | string | 报告开始期 |
end_reportdate | string | 报告结束期 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
report_date | string | 报告期 |
oper_rev | double | 营业收入(元) |
oper_profit | double | 营业利润(元) |
total_profit | double | 利润总额(元) |
net_profit_int_inc | double | 净利润(元) |
total_assets | double | 总资产(元) |
tot_shrhldr_int | double | 股东权益合计 |
eps_diluted | double | 每股收益(摊薄)(元) |
roe_diluted | double | 净资产收益率(摊薄)(%) |
is_audit | double | 是否审计 |
yoy_int_inc | double | 去年同期修正后净利润 |
限售股解禁表¶
df, msg = api.query(
view="lb.secRestricted",
fields="",
filter="start_date=20170101&end_date=20171011",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 开始日期 |
end_date | string | 结束日期 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
list_date | string | 本期解禁流通日期 |
lifted_reason | string | 本期解禁原因(来源) |
lifted_shares | double | 本期解禁数量 |
lifted_ratio | double | 可流通占A股总数比例 |
指数基本信息表¶
df, msg = api.query(
view="lb.indexCons",
fields="",
filter="index_code=000001.SH&start_date=20170113&end_date=20171010", # this api must add start and end date both
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
name | string | 证券简称 |
compname | string | 指数名称 |
exchmarket | string | 交易所 |
index_baseper | string | 基期 |
index_basept | double | 基点 |
listdate | string | 发布日期 |
index_weightsrule | string | 加权方式 |
publisher | string | 发布方 |
indexcode | int | 指数类别代码 |
indexstyle | string | 指数风格 |
index_intro | string | 指数简介 |
weight_type | int | 权重类型 |
expire_date | string | 终止发布日期 |
指数成份股表¶
df, msg = api.query(
view="lb.indexCons",
fields="",
filter="index_code=399001&is_new=Y",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
index_code | string | 指数代码 |
字段 | 类型 | 说明 |
---|---|---|
index_code | string | 指数代码 |
symbol | string | 证券代码 |
in_date | string | 纳入日期 |
out_date | string | 剔除日期 |
is_new | int | 最新标志 |
公募基金净值表¶
df, msg = api.query(
view="lb.mfNav",
fields="",
filter="",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 公告开始日期 |
end_date | string | 公告结束日期 |
start_pdate | string | 截止开始日期 |
end_pdate | string | 截止结束日期 |
update_flag | Int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
price_date | string | 截止日期 |
nav | double | 单位净值 |
nav_accumulated | double | 累计净值 |
div_accumulated | double | 累计分红 |
adj_factor | double | 复权因子 |
currency | string | 货币代码 |
netasset | double | 资产净值 |
if_mergedshare | Int | 是否合计数据 |
netasset_total | double | 合计资产净值 |
nav_adjusted | double | 复权单位净值 |
update_flag | int | 数据更新标记 |
基金分红表¶
df, msg = api.query(
view="lb.mfDividend",
fields="",
filter="",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 公告开始日期 |
end_date | string | 公告结束日期 |
update_flag | int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
ebch_date | string | 可分配收益基准日 |
div_progress | string | 方案进度 |
cash_dvd | double | 每股派息(元) |
currency | string | 货币代码 |
record_date | string | 权益登记日 |
ex_date | string | 除息日 |
div_edexdate | string | 除息日(场外) |
pay_date | string | 派息日 |
div_paydate | string | 派息日(场外) |
div_impdate | string | 分红实施公告日 |
sh_bch_y | string | 份额基准年度 |
bch_unit | double | 基准基金份额(万份) |
eapr | double | 可分配收益(元) |
exdiv_date | string | 净值除权日 |
eapr_amount | double | 收益分配金额(元) |
reinv_bch_date | string | 红利再投资份额净值基准日 |
reinv_toac_date | string | 红利再投资到账日 |
reinv_redeem_date | string | 红利再投资可赎回起始日 |
div_object | string | 分配对象 |
div_ipaydt | string | 收益支付日 |
update_flag | int | 数据更新标记 |
基金投资组合表¶
df, msg = api.query(
view="lb.mfPortfolio",
fields="",
filter="",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_date | string | 公告开始日期 |
end_date | string | 公告结束日期 |
update_flag | int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
ann_date | string | 公告日期 |
prt_enddate | string | 截止日期 |
currency | string | 货币代码 |
s_symbol | string | 股票代码 |
stk_value | double | 持有股票市值(元) |
stk_quantity | double | 持有股票数量(股) |
stk_valuetonav | double | 持有股票市值占基金净值比例(%) |
posstk_value | double | 积极投资持有股票市值(元) |
posstk_quantity | double | 积极投资持有股数(股) |
posstkto_nav | double | 积极投资持有股票市值占净资产比例(%) |
passtke_value | double | 指数投资持有股票市值(元) |
passtk_quantity | double | 指数投资持有股数(股) |
passtkto_nav | double | 指数投资持有股票市值占净资产比例(%) |
stock_per | double | 占股票市值比 |
float_shr_per | double | 占流通股本比例 |
update_flag | int | 数据更新标记 |
基金持有债券组合¶
df, msg = api.query(
view="lb.mfBondPortfolio",
fields="",
filter="",
data_format='pandas')
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
start_pdate | string | 截止开始日期 |
end_pdate | string | 截止结束日期 |
update_flag | int | 数据更新标记 |
字段 | 类型 | 说明 |
---|---|---|
symbol | string | 证券代码 |
prt_enddate | string | 截止日期 |
currency | string | 货币代码 |
bond_code | string | 持有债券代码 |
bond_value | double | 持有债券市值(元) |
bond_quantity | double | 持有债券数量(张) |
bond_valueto_nav | double | 持有债券市值占基金净值比例(%) |
update_flag | Int | 数据更新标记 |
Other Important APIs¶
jaqs.data package¶
Subpackages¶
Submodules¶
jaqs.data.align module¶
jaqs.data.dataservice module¶
jaqs.data.dataview module¶
jaqs.data.py_expression_eval module¶
Module contents¶
jaqs.trade package¶
Subpackages¶
Submodules¶
jaqs.trade.backtest module¶
jaqs.trade.common module¶
jaqs.trade.livetrade module¶
jaqs.trade.model module¶
jaqs.trade.portfoliomanager module¶
jaqs.trade.strategy module¶
jaqs.trade.tradegateway module¶
Module contents¶
jaqs.util package¶
Submodules¶
jaqs.util.dtutil module¶
-
combine_date_time
(date, time)¶
-
convert_datetime_to_int
(dt)¶
-
convert_int_to_datetime
(dt)¶ Convert int date (%Y%m%d) to datetime.datetime object.
-
get_next_period_day
(current, period, n=1, extra_offset=0)¶ Get the n’th day in next period from current day.
参数: - current (int) – Current date in format “%Y%m%d”.
- period (str) – Interval between current and next. {‘day’, ‘week’, ‘month’}
- n (int) – n times period.
- extra_offset (int) – n’th business day after next period.
返回: nxt
返回类型: int
-
shift
(date, n_weeks=0)¶ Shift date backward or forward for n weeks.
参数: - date (int or datetime) – The date to be shifted.
- n_weeks (int, optional) – Positive for increasing date, negative for decreasing date. Default 0 (no shift).
返回: res
返回类型: int or datetime
-
split_date_time
(dt)¶
jaqs.util.fileio module¶
-
create_dir
(filename)¶ Create dir if directory of filename does not exist.
参数: filename (str) –
-
fig2base64
(fig, format='png')¶ 参数: - fig (matplotlib.fig.Figure) –
- format (str) – Eg. png, jpg
-
join_relative_path
(*paths)¶ Get absolute path using paths that are relative to project root.
-
load_pickle
(fp)¶ Read Pickle file. Return None if file not found.
参数: fp (str) – Path of the Pickle file. 返回: 返回类型: object or None
-
read_json
(fp)¶ Read JSON file to dict. Return None if file not found.
参数: fp (str) – Path of the JSON file. 返回: 返回类型: dict
-
save_json
(serializable, file_name)¶ Save an serializable object to JSON file.
参数: - serializable (object) –
- file_name (str) –
-
save_pickle
(obj, file_name)¶ Save an object to Pickle file.
参数: - obj (object) –
- file_name (str) –
jaqs.util.pdutil module¶
-
fillinf
(df)¶
-
group_df_to_dict
(df, by)¶
-
to_quantile
(df, n_quantiles=5, axis=1)¶ Convert cross-section values to the quantile number they belong. Small values get small quantile numbers.
参数: - df (DataFrame) – index date, column symbols
- n_quantiles (int) – The number of quantile to be divided to.
- axis (int) – Axis to apply quantilize.
返回: res – index date, column symbols
返回类型: DataFrame
jaqs.util.profile module¶
Module contents¶
License¶
Apache 2.0许可协议。版权所有(c)2017 quantOS-org(量化开源会)。