import itertools from datetime import datetime import pandas as pd from pprint import pprint import pyTSL TINYSOFT_HOSTNAME = 'tsl.tinysoft.com.cn' TINYSOFT_PORT = 443 TINYSOFT_USERNAME = 'xunuo2005' TINYSOFT_PASSWORD = '20220613' class TSLfm: def __init__(self): self.timeout_default=100000 def __enter__(self): print('entering') self.c = pyTSL.Client(TINYSOFT_USERNAME, TINYSOFT_PASSWORD, TINYSOFT_HOSTNAME, 443) self.c.login() return self def __exit__(self, exc_type, exc_val, exc_tb): print('logging out') self.c.logout() del(self.c) def get_code_list(self, bk_name='国债期货'): scpt = """return getbk('{bk_name}'); """.format(bk_name=bk_name) print(scpt) r = self.c.exec(scpt,timeout=self.timeout_default) return r.value() def get_trade_tick(self, start_date, end_date, code_list): """ (source: 天软数据字典 ver 2022-05-25) vol: 周期内的成交量。如果周期为分钟,则表示这分钟的成 交量,并非从开盘累计. 对于期货,高频和日线的单位都是合约数量,如果要建立成交量和成交金额之间的关系,还需考虑合约乘数。 amount: 周期内的成交金额。如果周期为分钟,则表示这分钟的成交金额,并非从开盘累计。 cjbs: 对于期货/期权而言,是周期内的持仓的变动量,日线的话表示当日持仓量,单位为:手。 wb: 公式:委买/委卖(w_buy/w_sale) lb: 由天软计算: 1、对于交易明细: 量比=现成交总手/[(过去 5 个交易日平均每分钟成交 量)×当日累计开市时间(分)] 2、对于秒线/1 分钟线: 量比取周期内最后一条交易明细的数据。 zmm: 对 tradetable 公式:按下面的前后逻辑优先判定 没有成交 -> 0 当前成交价>上一笔买一价 ->主买 1 当前成交价<上一笔卖一价 ->主卖 2 否则->3(一般是集合竞价、涨停、跌停) 对于非交易明细(秒线或分钟线等):没有意义 buy_vol: 主动性买盘成交量:周期内买卖标识为 1 的成交量+买 卖标识为 3 的成交量/2 buy_amount: 主动性买盘成交金额:周期内买卖标识为 1 的成交金额 +买卖标识为 3 的成交金额/2 sale_vol: 主动性卖盘成交量:周期内买卖标识为 2 的成交量之和 +买卖标识为 3 的成交量/2 sale_amount: 主动性卖盘成交金额:周期内买卖标识为 2 的成交金额 +买卖标识为 3 的成交金额/2 w_buy: 一个周期内的委买量 sectional: 从开盘到当前时间的 sectional_yclose: 上一交易日(周期是日)的收盘价,与‘上次价’不一 样。‘上次价’表示前一个周期的收盘价。 sectional_vol: 从开盘到当前时间的成交量之和(主买+主卖) sectional_amount: 从开盘到当前时间的成交金额之和(主买+主卖) sectional_cjbs: 股指期货/期权:市场现有持仓量 sectional_wb: 当日累计委买/当日累计委卖 ['sectional_open'] as 'm_nAccOpen', //时点当日开盘, 没必要存,取上日2059的即刻 """ code_list_input = ', '.join(['\'%s\'' % code_id for code_id in code_list]) scpt = """ stock_list := Array({code_list_input}); r := select ['StockID'] as 'code', DateTimeToStr(['date']) as 'datetime', ['price'] as 'm_nPrice', ['open'] as 'm_nOpen', ['high'] as 'm_nHigh', ['low'] as 'm_nLow', ['close'] as 'm_nClose', ['sectional_high'] as 'm_nAccHigh', ['sectional_low'] as 'm_nAccLow', ['vol'] as 'm_iVolume', //成交量 ['sectional_vol'] as 'm_iAccVolume', //时点当日累计成交量 ['cjbs'] as 'm_nMatchItems', // 成交笔数 周期内的持仓的变动量 ['sectional_cjbs'] as 'm_nAccMatchItems', ['amount'] as 'm_iTurover', //成交金额 ['sectional_amount'] as 'm_iAccTurover', ['yclose'] as 'm_nPreClose', //上一周期的收盘价 ['sectional_yclose'] as 'm_nAccPreClose', // 前日收盘 ['buy1'] as 'm_nBidPrice', //买一价?叫卖价? ['bc1'] as 'm_nBidVolume', //买一量 当前以买一价出价的委买量 ['sale1'] as 'm_nAskPrice', ['sc1'] as 'm_nAskVolume', ['zmm'] as 'm_iABFlag', //买卖标识 ['buy_vol'] as 'm_nBidAvVolume', //主买量 ['sectional_buy_vol'] as 'm_nAccBidAvVolume', //时点当日累计主买量 ['buy_amount'] as 'm_nBidAvTurover', //主买金额 ['sectional_buy_amount'] as 'm_nAccBidAvTurover', ['sale_vol'] as 'm_nAskAvVolume', ['sectional_sale_vol'] as 'm_nAccAskAvVolume', ['sale_amount'] as 'm_nAskAvTurover', ['sectional_sale_amount'] as 'm_nAccAskAvTurover', ['w_buy'] as 'm_nBidOrder', //委买 ['sectional_w_buy'] as 'm_nAccBidOrder', ['w_sale'] as 'm_nAskOrder', ['sectional_w_sale'] as 'm_nAccAskOrder', ['wb'] as 'm_nABOrderRate', //委比 ['sectional_wb'] as 'm_nAccABOrderRate', //时点当日累计委比 ['lb'] as 'm_nMItemsVolRate'//量比 from tradetable datekey {start_date}T to {end_date}T+0.999 of stock_list end; return r; """.format( code_list_input=code_list_input, start_date=start_date, end_date=end_date ) print(scpt) r = self.c.exec(scpt,timeout=self.timeout_default) return r def get_mkt_min_k(self, start_date, end_date, code_list): code_list_input = ', '.join(['\'%s\'' % code_id for code_id in code_list]) scpt = """ SetSysParam(pn_cycle(), cy_1m()); stock_list := Array({code_list_input}); r := select ['StockID'] as 'code', DateTimeToStr(['date']) as 'datetime', ['price'] as 'm_nPrice', ['open'] as 'm_nOpen', ['high'] as 'm_nHigh', ['low'] as 'm_nLow', ['close'] as 'm_nClose', ['sectional_open'] as 'm_nAccOpen', //时点当日开盘 ['sectional_high'] as 'm_nAccHigh', ['sectional_low'] as 'm_nAccLow', ['vol'] as 'm_iVolume', //成交量 ['sectional_vol'] as 'm_iAccVolume', //时点当日累计成交量 ['cjbs'] as 'm_nMatchItems', // 成交笔数 周期内的持仓的变动量 ['sectional_cjbs'] as 'm_nAccMatchItems', ['amount'] as 'm_iTurover', //成交金额 ['sectional_amount'] as 'm_iAccTurover', ['yclose'] as 'm_nPreClose', //上一周期的收盘价 ['sectional_yclose'] as 'm_nAccPreClose', // 前日收盘 ['buy1'] as 'm_nBidPrice', //买一价?叫卖价? ['bc1'] as 'm_nBidVolume', //买一量 当前以买一价出价的委买量 ['sale1'] as 'm_nAskPrice', ['sc1'] as 'm_nAskVolume', ['zmm'] as 'm_iABFlag', //买卖标识 ['buy_vol'] as 'm_nBidAvVolume', //主买量 ['sectional_buy_vol'] as 'm_nAccBidAvVolume', //时点当日累计主买量 ['buy_amount'] as 'm_nBidAvTurover', //主买金额 ['sectional_buy_amount'] as 'm_nAccBidAvTurover', ['sale_vol'] as 'm_nAskAvVolume', ['sectional_sale_vol'] as 'm_nAccAskAvVolume', ['sale_amount'] as 'm_nAskAvTurover', ['sectional_sale_amount'] as 'm_nAccAskAvTurover', ['w_buy'] as 'm_nBidOrder', //委买 ['sectional_w_buy'] as 'm_nAccBidOrder', ['w_sale'] as 'm_nAskOrder', ['sectional_w_sale'] as 'm_nAccAskOrder', ['wb'] as 'm_nABOrderRate', //委比 ['sectional_wb'] as 'm_nAccABOrderRate', //时点当日累计委比 ['lb'] as 'm_nMItemsVolRate'//量比 from markettable datekey {start_date}T to {end_date}T+0.999 of stock_list end; return r; """.format( code_list_input=code_list_input, start_date=start_date, end_date=end_date ) print(scpt) r = self.c.exec(scpt,timeout=self.timeout_default) return r