Skip to content

Commit 4095751

Browse files
shinny-packshinny-mayanqiong
authored andcommitted
Update Version 2.8.5
1 parent edee96d commit 4095751

File tree

9 files changed

+394
-57
lines changed

9 files changed

+394
-57
lines changed

PKG-INFO

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
Metadata-Version: 2.1
22
Name: tqsdk
3-
Version: 2.8.4
3+
Version: 2.8.5
44
Summary: TianQin SDK
55
Home-page: https://www.shinnytech.com/tqsdk
66
Author: TianQin

doc/conf.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848
# built documents.
4949
#
5050
# The short X.Y version.
51-
version = u'2.8.4'
51+
version = u'2.8.5'
5252
# The full version, including alpha/beta/rc tags.
53-
release = u'2.8.4'
53+
release = u'2.8.5'
5454

5555
# The language for content autogenerated by Sphinx. Refer to documentation
5656
# for a list of supported languages.

doc/version.rst

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,17 @@
22

33
版本变更
44
=============================
5+
2.8.5 (2021/09/06)
6+
7+
* 增加:TqApi 增加 :py:meth:`~tqsdk.api.TqApi.query_symbol_ranking` 接口,支持查询合约成交排名/持仓排名。
8+
* 增加:TqApi 增加 :py:meth:`~tqsdk.api.TqApi.query_option_greeks` 接口,返回指定期权的希腊指标。
9+
* 修复:pyinstaller 工具由于缺少初始合约文件导致打包失败
10+
* 优化::py:meth:`~tqsdk.tafunc.get_delta`、:py:meth:`~tqsdk.tafunc.get_theta`、:py:meth:`~tqsdk.tafunc.get_rho`、
11+
:py:meth:`~tqsdk.tafunc.get_bs_price`、:py:meth:`~tqsdk.tafunc.get_impv` 接口中 ``option_class`` 参数支持类型扩展为
12+
``str 或者 pandas.Series``,详情见文档
13+
14+
15+
516
2.8.4 (2021/08/31)
617

718
* 修复:由于缺少初始合约文件,TqApi 初始化可能失败的问题
@@ -11,17 +22,17 @@
1122

1223
* 增加:is_changing 接口增加对于委托单 :py:meth:`~tqsdk.objs.Order.is_dead`、:py:meth:`~tqsdk.objs.Order.is_online`、
1324
:py:meth:`~tqsdk.objs.Order.is_error`、:py:meth:`~tqsdk.objs.Order.trade_price` 字段支持判断是否更新
14-
* 修复: TqApi 初始化可能失败的问题
15-
* 优化: 将已知下市合约直接打包在代码中,缩短 TqApi 初始化时间
16-
* docs: 完善主力切换规则说明,将阿里源替换为清华源
25+
* 修复TqApi 初始化可能失败的问题
26+
* 优化将已知下市合约直接打包在代码中,缩短 TqApi 初始化时间
27+
* docs完善主力切换规则说明,将阿里源替换为清华源
1728

1829

1930
2.8.2 (2021/08/17)
2031

2132
* 增加:is_changing 接口增加对于合约 :py:meth:`~tqsdk.objs.Quote.expire_rest_days`,持仓 :py:meth:`~tqsdk.objs.Position.pos_long`、
2233
:py:meth:`~tqsdk.objs.Position.pos_short`、:py:meth:`~tqsdk.objs.Position.pos` 字段支持判断是否更新
2334
* 修复:2.8.1 版本重构后,不支持多线程运行的问题
24-
* docs: 更新合约字段示例说明
35+
* docs更新合约字段示例说明
2536

2637

2738
2.8.1 (2021/08/12)
@@ -46,15 +57,15 @@
4657

4758
* 增加:**支持在回测中使用 query 系列函数,查询结果为回测当天的合约信息**
4859
* 增加:Quote 对象增加 underlying_quote 属性,值是一个 Quote 对象(为 underlying_symbol 属性对应的合约引用)或者是 None
49-
* web_gui: 修复在 safari 和 firefox 无法正常显示的问题
50-
* docs: 完善支持用户自助购买文档
60+
* web_gui修复在 safari 和 firefox 无法正常显示的问题
61+
* docs完善支持用户自助购买文档
5162

5263

5364
2.7.1 (2021/07/21)
5465

55-
* 修复: query 系列查询看跌期权时,未返回指定的实值、平值、虚值序列的问题
56-
* docs: 完善 position 文档说明
57-
* docs: 补充期权示例
66+
* 修复query 系列查询看跌期权时,未返回指定的实值、平值、虚值序列的问题
67+
* docs完善 position 文档说明
68+
* docs补充期权示例
5869

5970

6071
2.7.0 (2021/07/15)
@@ -66,14 +77,14 @@
6677
* 修复:某些参数可能造成 twap 无法执行的问题
6778
* 修复:客户端发送的 variables 中变量值不支持空字符串、空列表或者列表中包括空字符串
6879
* 删除:为期权持仓、成交、委托单对象添加部分期权合约信息的功能(2.6.5 增加功能)
69-
* doc: 添加隔夜开盘抢单示例,不再建议用户自定义次席连接
80+
* doc添加隔夜开盘抢单示例,不再建议用户自定义次席连接
7081

7182

7283
2.6.6 (2021/07/05)
7384

74-
* 修复: 支持 pandas 1.3.0 版本
85+
* 修复支持 pandas 1.3.0 版本
7586
* 修复:回测中某些有夜盘的合约,报夜盘时间不在可交易时间段的问题
76-
* web_gui: 成交列表中成交价格默认显示4位小数
87+
* web_gui成交列表中成交价格默认显示4位小数
7788
* doc:完善钉钉推送文档
7889

7990

@@ -96,10 +107,10 @@
96107
* 修复:回测中某些有夜盘的合约,报夜盘时间不在可交易时间段的问题
97108
* 修复:回测报告中,在有期权交易时,每日收益值有错误
98109
* 修复:回测中限制 :py:meth:`~tqsdk.api.TqApi.get_quote_list` 参数列表长度,最多支持 100 合约
99-
* web_gui: 修复部分成交记录箭头标注位置不对的问题
100-
* web_gui: 修复报告页面日期没有显示的问题
101-
* web_gui: 支持代码运行中可以修改指标颜色
102-
* web_gui: 成交列表中,部分成交价格没有按照最小变动价格保留小数位数的问题
110+
* web_gui修复部分成交记录箭头标注位置不对的问题
111+
* web_gui修复报告页面日期没有显示的问题
112+
* web_gui支持代码运行中可以修改指标颜色
113+
* web_gui成交列表中,部分成交价格没有按照最小变动价格保留小数位数的问题
103114
* doc:完善期权文档
104115
* doc:完善回测文档
105116

@@ -109,21 +120,21 @@
109120
* 修复:twap 策略某些参数组合无法执行的问题,修改后生成随机手数可能最后一笔的下单手数小于设置的最小手数
110121
* 修复:TqSim 模拟交易期权时,某些情况下标的行情不更新的问题
111122
* 完善文档:增加指数、主连行情、期权使用文档说明
112-
* web_gui: 增加回测报告图表页面(增加每日资金、每日盈亏、滚动夏普比率、滚动索提诺比率图表)
113-
* web_gui: 指标线可以绘制虚线
123+
* web_gui增加回测报告图表页面(增加每日资金、每日盈亏、滚动夏普比率、滚动索提诺比率图表)
124+
* web_gui指标线可以绘制虚线
114125

115126

116127
2.6.2 (2021/06/03)
117128

118129
* 修复:在回测某些时间段时,指数无法交易的问题
119130
* 重构:TqSim 回测统计函数重构,增加 sortino_ratio 索提诺比率指标
120131
* 重构:算法模块中产生随机序列的方法
121-
* 优化: target_pos_task 报错提示文字
122-
* 优化: 网络链接建立、断连时的报错提示文字
132+
* 优化target_pos_task 报错提示文字
133+
* 优化网络链接建立、断连时的报错提示文字
123134
* 优化:单线程创建多个异步任务文档完善,参考文档::ref:`multi_async_task`
124-
* web_gui: 修复成交量图在高分屏下高度错误的问题
125-
* web_gui: k线文字标注为开高低收
126-
* web_gui: 图表不显示 BoardId
135+
* web_gui修复成交量图在高分屏下高度错误的问题
136+
* web_guik线文字标注为开高低收
137+
* web_gui图表不显示 BoardId
127138

128139

129140
2.6.1 (2021/05/27)
@@ -152,8 +163,8 @@
152163

153164
* 增加:负责策略执行工具 :py:class:`~tqsdk.lib.target_pos_scheduler.TargetPosScheduler`,帮助用户完成复杂的下单策略,同时提供给用户极大的调整空间。文档参考 :ref:`target_pos_scheduler`
154165
* 增加:TqSim 支持用户设置期权手续费
155-
* 修复: 协程中调用 get_quote 可能超时的问题
156-
* 修复: 首次登录期货账户可能会抛错的问题
166+
* 修复协程中调用 get_quote 可能超时的问题
167+
* 修复首次登录期货账户可能会抛错的问题
157168
* 优化:修改文档,增加测试脚本日志输出
158169

159170

@@ -177,10 +188,10 @@
177188
2.4.0 (2021/03/30)
178189

179190
* 增加::py:class:`~tqsdk.algorithm.twap` 增加 trades,average_trade_price 属性,用于获取成交记录和成交均价
180-
* 增加: query_cont_quotes 接口增加 has_night 参数,详情参考 :py:meth:`~tqsdk.api.TqApi.query_cont_quotes`
191+
* 增加query_cont_quotes 接口增加 has_night 参数,详情参考 :py:meth:`~tqsdk.api.TqApi.query_cont_quotes`
181192
* 增加:**支持用户回测中设置 TqSim 的保证金和手续费**,详情参考 :py:meth:`~tqsdk.sim.TqSim.set_margin`、:py:meth:`~tqsdk.sim.TqSim.set_commission`、:py:meth:`~tqsdk.sim.TqSim.get_margin`、:py:meth:`~tqsdk.sim.TqSim.get_commission`
182193
* 增加:**支持用户回测中使用 quote.underlying_symbol 获取主连对应的主力合约**,详情参考 :ref:`backtest_underlying_symbol`
183-
* 修复: 回测时大于日线周期的 K 线的收盘时间错误
194+
* 修复回测时大于日线周期的 K 线的收盘时间错误
184195

185196

186197
2.3.5 (2021/03/19)
@@ -196,7 +207,7 @@
196207
2.3.4 (2021/03/11)
197208

198209
* 增加:**TargetPosTask 增加 min_volume, max_volume 参数,支持大单拆分模式**,详情参考 :py:class:`~tqsdk.lib.TargetPosTask`
199-
* 重构 TqSim 模拟交易模块,修复了 TqSim 模拟交易时账户、持仓部分资金字段计算错误的 bug
210+
* 重构TqSim 模拟交易模块,修复了 TqSim 模拟交易时账户、持仓部分资金字段计算错误的 bug
200211
* 修复::py:meth:`~tqsdk.api.TqApi.query_options`, :py:meth:`~tqsdk.api.TqApi.query_atm_options` 接口中 `has_A` 参数不生效的 bug
201212
* 修复:在使用 TargetPosTask 时,主动调用 api.close() 程序不能正常退出的错误的 bug
202213
* 修复:回测时使用多合约 Kline 可能引起的 bug

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def get_tag(self):
3636

3737
setuptools.setup(
3838
name='tqsdk',
39-
version="2.8.4",
39+
version="2.8.5",
4040
description='TianQin SDK',
4141
author='TianQin',
4242
author_email='tianqincn@gmail.com',

tqsdk/__pyinstaller/hook-tqsdk.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
from PyInstaller.utils.hooks import collect_data_files
2-
datas = collect_data_files('tqsdk', includes=['ctpse', 'web'])
2+
datas = collect_data_files('tqsdk', includes=['ctpse', 'web', 'expired_quotes.json.lzma'])

tqsdk/__version__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = '2.8.4'
1+
__version__ = '2.8.5'

tqsdk/api.py

Lines changed: 119 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,8 @@
7171
from tqsdk.log import _get_log_name, _clear_logs
7272
from tqsdk.objs import Quote, Kline, Tick, Account, Position, Order, Trade, QuotesEntity, RiskManagementRule, RiskManagementData
7373
from tqsdk.objs import SecurityAccount, SecurityOrder, SecurityTrade, SecurityPosition
74-
from tqsdk.objs_not_entity import QuoteList, TqDataFrame, TqSymbolDataFrame, SymbolList, SymbolLevelList
74+
from tqsdk.objs_not_entity import QuoteList, TqDataFrame, TqSymbolDataFrame, SymbolList, SymbolLevelList, \
75+
TqSymbolRankingDataFrame, TqOptionGreeksDataFrame
7576
from tqsdk.sim import TqSim
7677
from tqsdk.symbols import TqSymbols
7778
from tqsdk.tqwebhelper import TqWebHelper
@@ -261,6 +262,7 @@ def __init__(self, account: Union[TqMultiAccount, TqAccount, TqSim, None] = None
261262
self._security_prototype = self._gen_security_prototype() # 股票业务数据原型
262263
self._dividend_cache = {} # 缓存合约对应的复权系数矩阵,每个合约只计算一次
263264
self._send_chan, self._recv_chan = TqChan(self), TqChan(self) # 消息收发队列
265+
self._ws_md_recv_chan = None # 记录 ws_md_recv_chan 引用
264266

265267
# slave模式的api不需要完整初始化流程
266268
self._is_slave = isinstance(account, TqApi)
@@ -2042,6 +2044,74 @@ def query_graphql(self, query: str, variables: dict, query_id: Optional[str] = N
20422044
})
20432045
return _get_obj(self._data, ["symbols", query_id])
20442046

2047+
def query_symbol_ranking(self, symbol: str, ranking_type: str, days: int = 1, start_dt: date = None, broker: str = None):
2048+
"""
2049+
查询合约成交排名/持仓排名
2050+
2051+
本接口仅限专业版用户使用,如需购买专业版或者申请试用,请访问 https://www.shinnytech.com/tqsdk_professional/。
2052+
2053+
该函数返回的对象不会更新,不建议在循环内调用该方法。
2054+
2055+
Args:
2056+
2057+
symbol (str): [必填] 合约代码
2058+
2059+
ranking_type (str):[必填] 表示返回结果以哪一项为排名基准,VOLUME 成交量排名,LONG 多头持仓排名, SHORT 空头持仓排名
2060+
2061+
days (int): [必填] 返回结果中包含的天数,默认为 1
2062+
2063+
start_dt (date): [可选] 查询时间段开始日期,默认为 None
2064+
* 如果开始日期为 date 类型,则返回从开始日期之后 days 个交易日的有效数据
2065+
* 如果开始日期为 None,则返回最近 days 个交易日的持仓排名情况
2066+
2067+
broker (str): [可选] 指定期货公司,以各家交易所列出的期货公司名称为准来进行查询,各家交易所可能期货公司名称不一致,如果对应这一天这家交易所没数据则返回对应数值为nan
2068+
2069+
Returns:
2070+
pandas.DataFrame: 本函数返回 pandas.DataFrame 实例。行数为 days * 20,每行为一条成交量/多头持仓量/空头持仓量的排名信息。返回值不会再更新。包含以下列:
2071+
2072+
* datetime (查询日期)
2073+
* symbol (合约代码,以交易所列出的期货公司名称为准)
2074+
* exchange_id (交易所)
2075+
* instrument_id (交易所内合约代码)
2076+
* broker (期货公司)
2077+
* volume (成交量)
2078+
* volume_change (成交量变化)
2079+
* volume_ranking (成交量排名)
2080+
* long_oi (多头持仓量)
2081+
* long_change (多头持仓增减量)
2082+
* long_ranking (多头持仓量排名)
2083+
* short_oi (空头持仓量)
2084+
* short_change (空头持仓增减量)
2085+
* short_ranking (空头持仓量排名)
2086+
2087+
注意:
2088+
1. 返回值中 datetime、symbol、exchange_id、instrument_id、broker 这几列一定为有效值。其他列会根据不同的 ranking_type 参数值,可能返回 nan:
2089+
* 例如:当 ranking_type 参数值为 volume_ranking 时,volume、volume_change、volume_ranking 这三列为有效值;
2090+
如果该期货公司的 long_ranking 在前 20 名内,long_oi、long_change、long_ranking 这三列为有效值,否则为 nan。
2091+
如果该期货公司的 short_ranking 在前 20 名内,short_oi、short_change、short_ranking 这三列为有效值,否则为 nan。
2092+
2093+
2. 数据更新时间: 18:30~19:00。 用户在交易日 19:00 之前可以查询当前交易日之前的所有数据,19:00 之后可以查询包括当前交易日的数据。
2094+
2095+
3. 数据支持范围:从 20200720 开始的期货数据。
2096+
2097+
"""
2098+
if not isinstance(symbol, str) or symbol == "":
2099+
raise Exception(f"symbol 参数应该填入有效的合约代码。")
2100+
if ranking_type not in ['VOLUME', 'LONG', 'SHORT']:
2101+
raise Exception(f"ranking_type 参数只支持以下值: 'VOLUME', 'LONG', 'SHORT'。")
2102+
if not (start_dt is None or isinstance(start_dt, date)):
2103+
raise Exception(f"start_dt 参数类型 {type(start_dt)} 错误。")
2104+
if not (isinstance(days, int) or days <= 1):
2105+
raise Exception(f"days 参数 {days} 错误。")
2106+
if not (broker is None or isinstance(broker, str)):
2107+
raise Exception(f"str 参数类型 {type(str)} 错误。")
2108+
df = TqSymbolRankingDataFrame(self, symbol, ranking_type, days=days, start_dt=start_dt, broker=broker)
2109+
deadline = time.time() + 30
2110+
while not self._loop.is_running() and not df.__dict__["_task"].done():
2111+
if not self.wait_update(deadline=deadline, _task=df.__dict__["_task"]):
2112+
raise TqTimeoutError(f"获取 {symbol}, {ranking_type} 持仓排名信息信息超时,请检查客户端及网络是否正常")
2113+
return df
2114+
20452115
def query_quotes(self, ins_class: str = None, exchange_id: str = None, product_id: str = None, expired: bool = None,
20462116
has_night: bool = None) -> List[str]:
20472117
"""
@@ -2748,6 +2818,52 @@ def _get_options_sorted(self, options, underlying_price, option_class):
27482818
options.sort(key=lambda x: x['strike_price'], reverse=True) # 看跌期权按照行权价倒序排序, 保证实值在前虚值在后
27492819
return options, options.index(mid_option)
27502820

2821+
def query_option_greeks(self, symbol: Union[str, List[str]], v: Union[float, List[float], None] = None, r=0.025):
2822+
"""
2823+
返回指定期权的希腊指标
2824+
2825+
Args:
2826+
symbol (str / list of str): 指定合约代码或合约代码列表
2827+
* str: 一个合约代码
2828+
* list of str: 合约代码列表
2829+
2830+
v (float / list of float): 合约对应的波动率
2831+
* float: 一个波动率值,symbol 为 str 类型时,可以只传入一个波动率值
2832+
* list of float: 波动率序列,symbol 为 list 类型时,必须传入与 symbol 数量相同,顺序一一对应的波动率序列
2833+
* None: 默认使用隐含波动率计算
2834+
2835+
r (float): [可选] 无风险利率
2836+
2837+
Returns:
2838+
pandas.DataFrame: 行数与参数 symbol 的合约数量相同,包含以下列:
2839+
2840+
* instrument_id: 合约代码
2841+
* instrument_name: 合约中文名
2842+
* option_class: 期权方向
2843+
* expire_rest_days: 距离到期日的剩余天数
2844+
* expire_datetime: 到期具体日,以秒为单位的 timestamp 值
2845+
* underlying_symbol: 标的合约
2846+
* strike_price: 期权行权价
2847+
* delta: 期权希腊指标 detla 值
2848+
* gamma: 期权希腊指标 gamma 值
2849+
* theta: 期权希腊指标 theta 值
2850+
* vega: 期权希腊指标 vega 值
2851+
* rho: 期权希腊指标 rho 值
2852+
2853+
"""
2854+
symbol_list = [symbol] if isinstance(symbol, str) else symbol
2855+
if len(symbol_list) <= 0 or any([s == "" or s is None for s in symbol_list]):
2856+
raise Exception(f"symbol 参数 {symbol} 不能为空列表,以及不能有空字符串或者 None。")
2857+
v_list = [v] if isinstance(v, float) else v
2858+
if not (v_list is None or len(v_list) == len(symbol_list)):
2859+
raise Exception(f"v 参数 {v} 数量与 symbol 参数 {symbol} 数量不同。")
2860+
df = TqOptionGreeksDataFrame(self, symbol_list, v_list=v_list, r=r)
2861+
deadline = time.time() + 30
2862+
while not self._loop.is_running() and not df.__dict__["_task"].done():
2863+
if not self.wait_update(deadline=deadline, _task=df.__dict__["_task"]):
2864+
raise TqTimeoutError(f"获取 {symbol} 的行情信息超时,请检查客户端及网络是否正常")
2865+
return df
2866+
27512867
def _setup_connection(self):
27522868
"""初始化"""
27532869
tq_web_helper = TqWebHelper(self)
@@ -2808,6 +2924,8 @@ def _setup_connection(self):
28082924
"data": [{"quotes": quotes}]
28092925
}) # 获取合约信息
28102926

2927+
self._ws_md_recv_chan = ws_md_recv_chan # 记录 ws_md_recv_chan 引用
2928+
28112929
conn = TqConnect(md_logger)
28122930
self.create_task(conn._run(self, self._md_url, ws_md_send_chan, ws_md_recv_chan))
28132931

0 commit comments

Comments
 (0)