原创 +1银贝 期货量化系列———天勤代码的梳理

小小的夏天 2024-2-23 223

前言:

在期货量化领域里,免费的而且使用python交易的其实总结就那么的几个,天勤,VNPY、CTP接口,无限易的python-go。天勤的特点就是简单,而且不需要做穿透就能实盘,对于中低频策略完全够用,这里先分享一下天勤的使用代码,虽然官网有,但有些东西经过优化汇总,更简单实用。里面带有模拟号可以直接测试使用。

TqSdk中文文档 https://doc.shinnytech.com/tqsdk/latest/intro.html

1、登录实盘、模拟账号

# 模拟交易
from tqsdk import TqAuth, TqSim, TqReplay, TqApi, TqAccount, TqBacktest
from datetime import date

# 创建API
api = TqApi(TqAccount('T铜冠金源', '公司账号', '密码'), auth=TqAuth("1264369172", "HMX147258369"))  # 使用实盘交易,期货公司的第一个字的拼音加大写字母
api = TqApi(TqAccount('simnow', '218493', 'HMX147258369@'), auth=TqAuth("336120", "HMX147258369"))

2、获取实时行情数据

from tqsdk import TqAccount, TqApi, TqAuth, tafunc, TqSim, TqKq, TargetPosTask
'''
SHFE    上海期货交易所
DCE     大连商品交易所
CZCE    郑州商品交易所


上海期货交易所:各有色金属,贵金属,钢材,原油,低硫燃油,燃料油,20号胶期货,纸浆。

郑州商品期货交易所:钛合金,苹果,尿素,棉纱,甲醇,花生,红枣,短纤,动力煤,纯碱,菜系,玻璃,白糖,PTA。

大连商品交易所:玉米,玉米淀粉,黄大豆,豆粕,豆油,棕榈油,鸡蛋,胶合板,纤维板期货,粳稻。
tick 最小周期约为0.5S

'''
# 创建API
api = TqApi(TqAccount('simnow', '218493', 'HMX147258369@'), auth=TqAuth("336120", "HMX147258369"))
quote = api.get_quote("DCE.cs2403")    # SHFE交易所代码简称,ni2310合约本身的代码简称,输出字典类型
print(quote.price_tick)
print(quote)
api.close()

3、获取K线数据

from tqsdk import TqApi, TqAuth, TqAccount
import datetime
import pandas as pd
# 如果文本对齐发生报错就注释掉,只是优化df显示,不影响代码运行
pd_display_rows = 200
pd_display_cols = 1000
pd_display_width = 1000
pd.set_option('display.max_rows', pd_display_rows)
pd.set_option('display.min_rows', pd_display_rows)
pd.set_option('display.max_columns', pd_display_cols)
pd.set_option('display.width', pd_display_width)
pd.set_option('display.max_colwidth', pd_display_width)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('expand_frame_repr', False)  # 当列太多时不换行
'''
TqSdk中, K线周期以秒数表示,支持不超过1日的任意周期K线,
tick和kline函数的数据长度默认值为200,最大为8964
kline的长度可以自定义,但是如超过日线即86400s,需要是日线的的整数倍,最大值为28天,(86400*28))
'''
# 创建API
api = TqApi(TqAccount('simnow', '218493', 'HMX147258369@'), auth=TqAuth("336120", "HMX147258369"))

klines1 = api.get_kline_serial('DCE.c2403', 10)  # 订阅某个品种的10秒线
klines1['candle_begin_time'] = pd.to_datetime(klines1['datetime'], unit='ns')
klines1['candle_begin_time_GMT8'] = klines1['candle_begin_time'] + datetime.timedelta(hours=8)
klines1['trade_time'] = klines1['candle_begin_time_GMT8'].astype('str').str[-8:]
# print(klines1)
# api.close()
# exit()

klines2 = api.get_kline_serial("DCE.cs2403", 70)  # 70秒线
klines2['candle_begin_time'] = pd.to_datetime(klines2['datetime'], unit='ns')
klines2['candle_begin_time_GMT8'] = klines2['candle_begin_time'] + datetime.timedelta(hours=8)
klines2['trade_time'] = klines2['candle_begin_time_GMT8'].astype('str').str[-8:]
# print(klines2)
# api.close()
# exit()
klines3 = api.get_kline_serial("DCE.cs2403", 60*60*24)  # 86400秒线, 即日线
klines3['candle_begin_time'] = pd.to_datetime(klines3['datetime'], unit='ns')
klines3['candle_begin_time_GMT8'] = klines3['candle_begin_time'] + datetime.timedelta(hours=8)
klines3['trade_time'] = klines3['candle_begin_time_GMT8'].astype('str').str[-8:]
# print(klines3)
# api.close()
# exit()
klines4 = api.get_kline_serial("DCE.cs2401", 86400 * 28, data_length=28)  # 最大值为28天
klines4['candle_begin_time'] = pd.to_datetime(klines4['datetime'], unit='ns')
klines4['candle_begin_time_GMT8'] = klines4['candle_begin_time'] + datetime.timedelta(hours=8)
klines4['trade_time'] = klines4['candle_begin_time_GMT8'].astype('str').str[-8:]
# print(klines4)
# api.close()
# exit()

klines5 = api.get_kline_serial("DCE.cs2401", 70, data_length=10000) # 70秒线,data_length数据长度
klines5['candle_begin_time'] = pd.to_datetime(klines5['datetime'], unit='ns')
klines5['candle_begin_time_GMT8'] = klines5['candle_begin_time'] + datetime.timedelta(hours=8)
klines5['trade_time'] = klines5['candle_begin_time_GMT8'].astype('str').str[-8:]
print(klines5)
api.close()
exit()

# 最后一根K线的收盘价
# print(klines1.iloc[-1].close)

# 如果只想在新K线出现时收到信号, 可以配合使用 is_changing():
# while api.wait_update():
#     if api.is_changing(klines.iloc[-1], "datetime"):    # 判定最后一根K线的时间是否有变化
#         print(klines.iloc[-1])                          # 当最后一根K线的时间有变(新K线生成)时才会执行到这里
#
#
# 对于每个K线序列, 只需要调用一次 get_kline_serial() . 如果需要监控数据更新, 可以使用 wait_update()
# while True:
#     api.wait_update()   # 是一个阻塞函数, 程序在这行上等待, 直到收到数据包才返回.
#     print(klines.head())

# 识别行情更新
# while True:
#     api.wait_update()  # 是一个阻塞函数, 程序在这行上等待, 直到收到数据包才返回.
#     if api.is_changing(klines):  # 如果数据有任何字段发生变化,is_changing就会返回true
#         print('klines变化', klines.iloc[-1])
#     # 判断最后一根K线的收盘价是否有变化
#     if api.is_changing( klines.iloc[-1], 'close'):  # 如果数据有任何字段发生变化,is_changing就会返回true
#         # datetime返回时间, klines.close返回对应收盘价序列
#         print('klines变化', datetime.datetime.fromtimestamp(klines.iloc[-1]['datetime'] / 1e9), klines.close.iloc[-1])

4、获取账户资金

import time
from tqsdk import TqAccount, TqApi, TqAuth, tafunc, TqSim, TqKq, TargetPosTask
import datetime
import pandas as pd
import os

pd_display_rows = 5000
pd_display_cols = 1000
pd_display_width = 1000
pd.set_option('display.max_rows', pd_display_rows)
pd.set_option('display.min_rows', pd_display_rows)
pd.set_option('display.max_columns', pd_display_cols)
pd.set_option('display.width', pd_display_width)
pd.set_option('display.max_colwidth', pd_display_width)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
pd.set_option('expand_frame_repr', False)  # 当列太多时不换行

# api = TqApi(TqAccount('T铜冠金源', '66885011', ''), auth=TqAuth("1264369172", "HMX147258369"))  #
api = TqApi(TqAccount('simnow', '218493', 'HMX147258369@'), auth=TqAuth("336120", "HMX147258369"))

# account = api.get_account(

本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读

成为学员

上传的附件:

最新回复 ( 0条评论 )


官方微信
码力十足学量化
Powered by Xiuno BBS 4.0.7

官方微信