Skip to content

Commit a3f5db4

Browse files
committed
warrant filter
1 parent 2fbf035 commit a3f5db4

File tree

7 files changed

+353
-5
lines changed

7 files changed

+353
-5
lines changed

tigeropen/common/consts/service_types.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,8 @@
6565
STOCK_BROKER = "stock_broker" # 港股股票实时经纪队列
6666
CAPITAL_DISTRIBUTION = "capital_distribution" # 股票当日资金分布
6767
CAPITAL_FLOW = "capital_flow" # 股票资金流向
68+
WARRANT_FILTER = "warrant_filter"
69+
WARRANT_REAL_TIME_QUOTE = "warrant_real_time_quote"
6870

6971
# 期权行情
7072
OPTION_EXPIRATION = "option_expiration"

tigeropen/quote/domain/filter.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,3 +197,44 @@ def _build_items(self, items):
197197

198198
def __repr__(self):
199199
return "ScannerResult(%s)" % self.__dict__
200+
201+
202+
class WarrantFilterItem:
203+
def __init__(self, page=None, total_page=None, total_count=None, items=None, bounds=None):
204+
self.page = page
205+
self.total_page = total_page
206+
self.total_count = total_count
207+
self.items = items
208+
self.bounds = bounds
209+
210+
def __repr__(self):
211+
return "WarrantFilterItem(%s)" % self.__dict__
212+
213+
214+
class WarrantFilterBounds:
215+
def __init__(self, issuer_name=None, expire_date=None, lot_size=None, entitlement_ratio=None,
216+
leverage_ratio=None, strike=None, premium=None, outstanding_ratio=None,
217+
implied_volatility=None, effective_leverage=None, call_price=None):
218+
if entitlement_ratio is None:
219+
entitlement_ratio = []
220+
if lot_size is None:
221+
lot_size = []
222+
if expire_date is None:
223+
expire_date = []
224+
if issuer_name is None:
225+
issuer_name = []
226+
self.issuer_name = issuer_name
227+
self.expire_date = expire_date
228+
self.lot_size = lot_size
229+
self.entitlement_ratio = entitlement_ratio
230+
self.leverage_ratio = leverage_ratio
231+
self.strike = strike
232+
self.premium = premium
233+
self.outstanding_ratio = outstanding_ratio
234+
self.implied_volatility = implied_volatility
235+
self.effective_leverage = effective_leverage
236+
self.call_price = call_price
237+
238+
def __repr__(self):
239+
return "FilterBounds(%s)" % self.__dict__
240+

tigeropen/quote/quote_client.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from tigeropen.common.consts.filter_fields import FieldBelongType
1717
from tigeropen.common.consts.service_types import GRAB_QUOTE_PERMISSION, QUOTE_DELAY, GET_QUOTE_PERMISSION, \
1818
HISTORY_TIMELINE, FUTURE_CONTRACT_BY_CONTRACT_CODE, TRADING_CALENDAR, FUTURE_CONTRACTS, MARKET_SCANNER, \
19-
STOCK_BROKER, CAPITAL_FLOW, CAPITAL_DISTRIBUTION
19+
STOCK_BROKER, CAPITAL_FLOW, CAPITAL_DISTRIBUTION, WARRANT_REAL_TIME_QUOTE, WARRANT_FILTER
2020
from tigeropen.common.consts.service_types import MARKET_STATE, ALL_SYMBOLS, ALL_SYMBOL_NAMES, BRIEF, \
2121
TIMELINE, KLINE, TRADE_TICK, OPTION_EXPIRATION, OPTION_CHAIN, FUTURE_EXCHANGE, OPTION_BRIEF, \
2222
OPTION_KLINE, OPTION_TRADE_TICK, FUTURE_KLINE, FUTURE_TICK, FUTURE_CONTRACT_BY_EXCHANGE_CODE, \
@@ -40,7 +40,7 @@
4040
from tigeropen.quote.request.model import MarketParams, MultipleQuoteParams, MultipleContractParams, \
4141
FutureQuoteParams, FutureExchangeParams, FutureContractParams, FutureTradingTimeParams, SingleContractParams, \
4242
SingleOptionQuoteParams, DepthQuoteParams, OptionChainParams, TradingCalendarParams, MarketScannerParams, \
43-
StockBrokerParams, CapitalParams
43+
StockBrokerParams, CapitalParams, WarrantFilterParams
4444
from tigeropen.quote.response.capital_distribution_response import CapitalDistributionResponse
4545
from tigeropen.quote.response.capital_flow_response import CapitalFlowResponse
4646
from tigeropen.quote.response.future_briefs_response import FutureBriefsResponse
@@ -72,6 +72,8 @@
7272
from tigeropen.quote.response.symbol_names_response import SymbolNamesResponse
7373
from tigeropen.quote.response.symbols_response import SymbolsResponse
7474
from tigeropen.quote.response.trading_calendar_response import TradingCalendarResponse
75+
from tigeropen.quote.response.warrant_briefs_response import WarrantBriefsResponse
76+
from tigeropen.quote.response.warrant_filter_response import WarrantFilterResponse
7577
from tigeropen.tiger_open_client import TigerOpenClient
7678
from tigeropen.tiger_open_config import LANGUAGE
7779

@@ -733,7 +735,7 @@ def get_option_briefs(self, identifiers):
733735

734736
return None
735737

736-
def get_option_bars(self, identifiers, begin_time=-1, end_time=4070880000000, period=BarPeriod.DAY):
738+
def get_option_bars(self, identifiers, begin_time=-1, end_time=4070880000000, period=BarPeriod.DAY, limit=None):
737739
"""
738740
获取期权日K数据
739741
:param identifiers: 期权代码列表
@@ -742,6 +744,7 @@ def get_option_bars(self, identifiers, begin_time=-1, end_time=4070880000000, pe
742744
:param end_time: 结束时间. 格式同 begin_time
743745
:param period: 时间间隔. 可选值: DAY("day"), ONE_MINUTE("1min"), FIVE_MINUTES("5min"), HALF_HOUR("30min"),
744746
ONE_HOUR("60min");
747+
:param limit: 每个期权的返回k线数量
745748
:return: pandas.DataFrame, 各 column 含义如下:
746749
time: 毫秒级时间戳
747750
open: 开盘价
@@ -768,6 +771,7 @@ def get_option_bars(self, identifiers, begin_time=-1, end_time=4070880000000, pe
768771
param.period = get_enum_value(period)
769772
param.begin_time = date_str_to_timestamp(begin_time, self._timezone)
770773
param.end_time = date_str_to_timestamp(end_time, self._timezone)
774+
param.limit = limit
771775
contracts.append(param)
772776
params.contracts = contracts
773777
request = OpenApiRequest(OPTION_KLINE, biz_model=params)
@@ -1542,6 +1546,42 @@ def get_capital_distribution(self, symbol, market, lang=None):
15421546
if response_content:
15431547
response = CapitalDistributionResponse()
15441548
response.parse_response_content(response_content)
1549+
if response.is_success():
1550+
return response.result
1551+
else:
1552+
raise ApiException(response.code, response.message)
1553+
1554+
def get_warrant_briefs(self, symbols):
1555+
"""
1556+
get warrant/iopt quote
1557+
:param symbols:
1558+
:return:
1559+
"""
1560+
params = MultipleQuoteParams()
1561+
params.symbols = symbols if isinstance(symbols, list) else [symbols]
1562+
params.lang = get_enum_value(self._lang)
1563+
request = OpenApiRequest(WARRANT_REAL_TIME_QUOTE, biz_model=params)
1564+
response_content = self.__fetch_data(request)
1565+
if response_content:
1566+
response = WarrantBriefsResponse()
1567+
response.parse_response_content(response_content)
1568+
if response.is_success():
1569+
return response.result
1570+
else:
1571+
raise ApiException(response.code, response.message)
1572+
1573+
def get_warrant_filter(self, symbol, ):
1574+
"""
1575+
:return:
1576+
"""
1577+
params = WarrantFilterParams()
1578+
params.lang = get_enum_value(self._lang)
1579+
params.symbol = symbol
1580+
request = OpenApiRequest(WARRANT_FILTER, biz_model=params)
1581+
response_content = self.__fetch_data(request)
1582+
if response_content:
1583+
response = WarrantFilterResponse()
1584+
response.parse_response_content(response_content)
15451585
if response.is_success():
15461586
return response.result
15471587
else:

tigeropen/quote/request/model.py

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,3 +1056,214 @@ def to_openapi_dict(self):
10561056
if self.limit:
10571057
params['limit'] = self.limit
10581058
return params
1059+
1060+
1061+
class WarrantFilterParams(BaseParams):
1062+
def __init__(self):
1063+
super().__init__()
1064+
self._symbol = None
1065+
self._page = None
1066+
self._page_size = None
1067+
self._sort_field_name = None
1068+
# sort directions
1069+
self._sort_dir = None
1070+
# 1:Call, 2: Put, 3: Bull,4: Bear, 0: All
1071+
self._warrant_type = None
1072+
self._issuer_name = None
1073+
# expiry date: yyyy-MM
1074+
self._expire_ym = None
1075+
# 0 All, 1 Normal, 2 Terminate Trades, 3 Waiting to be listed
1076+
self._state = None
1077+
# -1:out the money, 1: in the money
1078+
self._in_out_price: set[int] = set()
1079+
self._lot_size: set[int] = set()
1080+
self._entitlement_ratio: set[float] = set()
1081+
1082+
self._strike: tuple[float, float] = tuple()
1083+
self._effective_leverage: tuple[float, float] = tuple()
1084+
self._leverage_ratio: tuple[float, float] = tuple()
1085+
self._call_price: tuple[float, float] = tuple()
1086+
self._volume: tuple[int, int] = tuple()
1087+
self._premium: tuple[float, float] = tuple()
1088+
self._outstanding_ratio: tuple[float, float] = tuple()
1089+
self._implied_volatility: tuple[int, int] = tuple()
1090+
1091+
@property
1092+
def symbol(self):
1093+
return self._symbol
1094+
1095+
@symbol.setter
1096+
def symbol(self, value):
1097+
self._symbol = value
1098+
1099+
@property
1100+
def page(self):
1101+
return self._page
1102+
1103+
@page.setter
1104+
def page(self, value):
1105+
self._page = value
1106+
1107+
@property
1108+
def page_size(self):
1109+
return self._page_size
1110+
1111+
@page_size.setter
1112+
def page_size(self, value):
1113+
self._page_size = value
1114+
1115+
@property
1116+
def sort_field_name(self):
1117+
return self._sort_field_name
1118+
1119+
@sort_field_name.setter
1120+
def sort_field_name(self, value):
1121+
self._sort_field_name = value
1122+
1123+
@property
1124+
def sort_dir(self):
1125+
return self._sort_dir
1126+
1127+
@sort_dir.setter
1128+
def sort_dir(self, value):
1129+
self._sort_dir = value
1130+
1131+
@property
1132+
def warrant_type(self):
1133+
return self._warrant_type
1134+
1135+
@warrant_type.setter
1136+
def warrant_type(self, value):
1137+
self._warrant_type = value
1138+
1139+
@property
1140+
def issuer_name(self):
1141+
return self._issuer_name
1142+
1143+
@issuer_name.setter
1144+
def issuer_name(self, value):
1145+
self._issuer_name = value
1146+
1147+
@property
1148+
def expire_ym(self):
1149+
return self._expire_ym
1150+
1151+
@expire_ym.setter
1152+
def expire_ym(self, value):
1153+
self._expire_ym = value
1154+
1155+
@property
1156+
def state(self):
1157+
return self._state
1158+
1159+
@state.setter
1160+
def state(self, value):
1161+
self._state = value
1162+
1163+
@property
1164+
def strike(self):
1165+
return self._strike
1166+
1167+
@strike.setter
1168+
def strike(self, value):
1169+
self._strike = value
1170+
1171+
@property
1172+
def effective_leverage(self):
1173+
return self._effective_leverage
1174+
1175+
@effective_leverage.setter
1176+
def effective_leverage(self, value):
1177+
self._effective_leverage = value
1178+
1179+
@property
1180+
def leverage_ratio(self):
1181+
return self._leverage_ratio
1182+
1183+
@leverage_ratio.setter
1184+
def leverage_ratio(self, value):
1185+
self._leverage_ratio = value
1186+
1187+
@property
1188+
def call_price(self):
1189+
return self._call_price
1190+
1191+
@call_price.setter
1192+
def call_price(self, value):
1193+
self._call_price = value
1194+
1195+
@property
1196+
def volume(self):
1197+
return self._volume
1198+
1199+
@volume.setter
1200+
def volume(self, value):
1201+
self._volume = value
1202+
1203+
@property
1204+
def premium(self):
1205+
return self._premium
1206+
1207+
@premium.setter
1208+
def premium(self, value):
1209+
self._premium = value
1210+
1211+
@property
1212+
def outstanding_ratio(self):
1213+
return self._outstanding_ratio
1214+
1215+
@outstanding_ratio.setter
1216+
def outstanding_ratio(self, value):
1217+
self._outstanding_ratio = value
1218+
1219+
@property
1220+
def implied_volatility(self):
1221+
return self._implied_volatility
1222+
1223+
@implied_volatility.setter
1224+
def implied_volatility(self, value):
1225+
self._implied_volatility = value
1226+
1227+
def convert_range_param(self, value: tuple):
1228+
if value and len(value) == 2:
1229+
return {'min': value[0], 'max': value[1]}
1230+
return None
1231+
1232+
def to_openapi_dict(self):
1233+
params = super().to_openapi_dict()
1234+
if self.symbol:
1235+
params['symbol'] = self.symbol
1236+
if self.page:
1237+
params['page'] = self.page
1238+
if self.page_size:
1239+
params['page_size'] = self.page_size
1240+
if self.sort_field_name:
1241+
params['sort_field_name'] = self.sort_field_name
1242+
if self.sort_dir:
1243+
params['sort_dir'] = self.sort_dir
1244+
if self.warrant_type:
1245+
params['warrant_type'] = self.warrant_type
1246+
if self.issuer_name:
1247+
params['issuer_name'] = self.issuer_name
1248+
if self.expire_ym:
1249+
params['expire_ym'] = self.expire_ym
1250+
if self.state:
1251+
params['state'] = self.state
1252+
# tuple params
1253+
if self.strike:
1254+
params['strike'] = self.convert_range_param(self.strike)
1255+
if self.effective_leverage:
1256+
params['effective_leverage'] = self.convert_range_param(self.effective_leverage)
1257+
if self.leverage_ratio:
1258+
params['leverage_ratio'] = self.convert_range_param(self.leverage_ratio)
1259+
if self.call_price:
1260+
params['call_price'] = self.convert_range_param(self.call_price)
1261+
if self.volume:
1262+
params['volume'] = self.convert_range_param(self.volume)
1263+
if self.premium:
1264+
params['premium'] = self.convert_range_param(self.premium)
1265+
if self.outstanding_ratio:
1266+
params['outstanding_ratio'] = self.convert_range_param(self.outstanding_ratio)
1267+
if self.implied_volatility:
1268+
params['implied_volatility'] = self.convert_range_param(self.implied_volatility)
1269+
return params
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
# -*- coding: utf-8 -*-
2+
#
3+
# @Date : 2023/4/6
4+
# @Author : sukai
5+
import pandas as pd
6+
7+
from tigeropen.common.response import TigerResponse
8+
from tigeropen.common.util import string_utils
9+
10+
11+
class WarrantBriefsResponse(TigerResponse):
12+
def __init__(self):
13+
super(WarrantBriefsResponse, self).__init__()
14+
self.result = None
15+
self._is_success = None
16+
17+
def parse_response_content(self, response_content):
18+
response = super(WarrantBriefsResponse, self).parse_response_content(response_content)
19+
if 'is_success' in response:
20+
self._is_success = response['is_success']
21+
22+
if self.data and self.data.get('items'):
23+
self.result = string_utils.camel_to_underline_obj(self.data.get('items'))
24+
self.result = pd.DataFrame(self.result)

0 commit comments

Comments
 (0)