前言:
在期货量化领域里,免费的而且使用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(
本主题为课程学员专享,成为股票量化投资课程学员后可免费阅读
成为学员