Files
2026-01-17 21:21:30 +08:00

190 lines
7.2 KiB
Python

from google.protobuf import json_format
from tushare.subs.model.min import TsMin
from tushare.subs.model.tick import TsTick, TsTickIdx, TsTickOpt, TsTickFuture
datatype_map = {
"TICK": 1,
"TRANSACTION": 2,
"ORDER": 3,
"1MIN": 20,
"5MIN": 21,
"15MIN": 22,
"30MIN": 23,
"60MIN": 24,
"1DAY": 25,
"15SECOND": 26
}
datatype_map1 = {v: k for k, v in datatype_map.items()}
def _to_float(value):
try:
return float(value) / 10000
except:
return value
def recursive_to_price_float(data):
if isinstance(data, dict):
for k, v in data.items():
if k.endswith('Px'):
data[k] = _to_float(v)
elif k.endswith('PriceQueue'):
data[k] = [_to_float(v) for v in v]
elif isinstance(v, dict):
recursive_to_price_float(v)
def convert_ts_model(inst_data):
recursive_to_price_float(inst_data)
ts_inst = None
if 'MIN' in inst_data.get('marketDataType'):
ts_inst = convert_min_model(inst_data['marketDataType'].split('_')[-1].lower(), inst_data.get('mdKLine'))
elif '15S' in inst_data.get('marketDataType'):
ts_inst = convert_min_model(inst_data['marketDataType'].split('_')[-1].lower(), inst_data.get('mdKLine'))
elif 'TICK' in inst_data.get('marketDataType') and 'mdStock' in inst_data:
ts_inst = convert_tick_stock(inst_data.get('mdStock'))
elif 'TICK' in inst_data.get('marketDataType') and 'mdFund' in inst_data:
ts_inst = convert_tick_stock(inst_data.get('mdFund'))
elif 'TICK' in inst_data.get('marketDataType') and 'mdBond' in inst_data:
ts_inst = convert_tick_stock(inst_data.get('mdBond'))
elif 'TICK' in inst_data.get('marketDataType') and 'mdIndex' in inst_data:
ts_inst = convert_tick_index(inst_data.get('mdIndex'))
elif 'TICK' in inst_data.get('marketDataType') and 'mdOption' in inst_data:
ts_inst = convert_tick_option(inst_data.get('mdOption'))
return ts_inst and dict(ts_inst) or None
def convert_min_model(freq, md_kline) -> TsMin:
ds = str(md_kline.get('MDDate'))
ts = str(md_kline.get('MDTime'))
inst: TsMin = TsMin(
ts_code=md_kline.get('HTSCSecurityID'),
freq=freq,
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}',
open=md_kline.get('OpenPx'),
close=md_kline.get('ClosePx'),
high=md_kline.get('HighPx'),
low=md_kline.get('LowPx'),
vol=md_kline.get('TotalVolumeTrade'),
amount=md_kline.get('TotalValueTrade'),
open_int=md_kline.get('KLineCategory', None)
)
return inst
def convert_tick_stock(md_stock) -> TsTick:
ds = str(md_stock.get('MDDate'))
ts = str(md_stock.get('MDTime'))
inst: TsTick = TsTick(
ts_code=md_stock.get('HTSCSecurityID'),
name='',
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
pre_price=md_stock.get('PreClosePx'),
price=md_stock.get('LastPx'),
open=md_stock.get('OpenPx'),
high=md_stock.get('HighPx'),
low=md_stock.get('LowPx'),
close=md_stock.get('ClosePx'),
vol=md_stock.get('TotalVolumeTrade'),
amount=md_stock.get('TotalValueTrade'),
count=md_stock.get('NumTrades')
)
for i, v in enumerate(md_stock.get('SellPriceQueue')):
setattr(inst, f'ask_price{i+1}', v)
for i, v in enumerate(md_stock.get('SellOrderQtyQueue')):
setattr(inst, f'ask_volume{i+1}', v)
for i, v in enumerate(md_stock.get('BuyPriceQueue')):
setattr(inst, f'bid_price{i+1}', v)
for i, v in enumerate(md_stock.get('BuyOrderQtyQueue')):
setattr(inst, f'bid_volume{i+1}', v)
return inst
def convert_tick_index(md_index) -> TsTickIdx:
ds = str(md_index.get('MDDate'))
ts = str(md_index.get('MDTime'))
inst: TsTickIdx = TsTickIdx(
ts_code=md_index.get('HTSCSecurityID'),
name='',
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
pre_close_price=md_index.get('PreClosePx'),
last_price=int(md_index.get('LastPx', 0)),
open_price=md_index.get('OpenPx'),
high_price=md_index.get('HighPx'),
low_price=md_index.get('LowPx'),
close_price=md_index.get('ClosePx'),
volume=md_index.get('TotalVolumeTrade'),
amount=md_index.get('TotalValueTrade')
)
return inst
def convert_tick_option(md_option) -> TsTickOpt:
ds = str(md_option.get('MDDate'))
ts = str(md_option.get('MDTime'))
inst: TsTickOpt = TsTickOpt(
ts_code=md_option.get('HTSCSecurityID'),
instrument_id='',
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
pre_price=md_option.get('PreClosePx'),
price=md_option.get('LastPx'),
open=md_option.get('OpenPx'),
high=md_option.get('HighPx'),
low=md_option.get('LowPx'),
close=md_option.get('ClosePx'),
open_int=md_option.get('OpenInterest'),
vol=md_option.get('TotalVolumeTrade'),
amount=md_option.get('TotalValueTrade'),
num=md_option.get('NumTrades'),
ask_price1=md_option.get('BuyPriceQueue')[0],
ask_volume1=md_option.get('BuyOrderQtyQueue')[0],
bid_price1=md_option.get('SellPriceQueue')[0],
bid_volume1=md_option.get('SellOrderQtyQueue')[0],
pre_delta=md_option.get('PreDelta'),
curr_delta=md_option.get('CurrDelta'),
dif_price1=md_option.get('DiffPx1'),
dif_price2=md_option.get('DiffPx2'),
high_limit_price=md_option.get('MaxPx'),
low_limit_price=md_option.get('MinPx'),
refer_price=md_option.get('ReferencePx'),
)
return inst
def convert_tick_future(md_future) -> TsTickFuture:
ds = str(md_future.get('MDDate'))
ts = str(md_future.get('MDTime'))
inst: TsTickFuture = TsTickFuture(
ts_code=md_future.get('HTSCSecurityID'),
trade_time=f'{ds[:4]}-{ds[4:6]}-{ds[6:]} {ts[:-7]}:{ts[-7:-5]}:{ts[-5:-3]}',
pre_price=md_future.get('PreClosePx'),
price=md_future.get('LastPx'),
open=md_future.get('OpenPx'),
high=md_future.get('HighPx'),
low=md_future.get('LowPx'),
close=md_future.get('ClosePx'),
open_int=md_future.get('OpenInterest'),
vol=md_future.get('TotalVolumeTrade'),
amount=md_future.get('TotalValueTrade'),
num=md_future.get('NumTrades'),
ask_price1=md_future.get('BuyPriceQueue')[0],
ask_volume1=md_future.get('BuyOrderQtyQueue')[0],
bid_price1=md_future.get('SellPriceQueue')[0],
bid_volume1=md_future.get('SellOrderQtyQueue')[0],
pre_delta=md_future.get('PreDelta'),
curr_delta=md_future.get('CurrDelta'),
dif_price1=md_future.get('DiffPx1'),
dif_price2=md_future.get('DiffPx2'),
high_limit_price=md_future.get('MaxPx'),
low_limit_price=md_future.get('MinPx'),
refer_price=md_future.get('ReferencePx'),
pre_settle_price=md_future.get('PreSettlePrice'),
settle_price=md_future.get('SettlePrice'),
)
return inst