tqsdk.TqSim - 本地模拟交易

class tqsdk.TqSim(init_balance: float = 10000000.0, account_id: str | None = None)

天勤模拟交易类

该类实现了一个本地的模拟账户,并且在内部完成撮合交易,在回测和复盘模式下,只能使用 TqSim 账户来交易。

限价单要求报单价格达到或超过对手盘价格才能成交, 成交价为报单价格, 如果没有对手盘(涨跌停)则无法成交

市价单使用对手盘价格成交, 如果没有对手盘(涨跌停)则自动撤单

模拟交易不会有部分成交的情况, 要成交就是全部成交

Args:

init_balance (float): [可选]初始资金, 默认为一千万

account_id (str): [可选]帐号, 默认为 TQSIM

Example:

# 修改TqSim模拟帐号的初始资金为100000
from tqsdk import TqApi, TqSim, TqAuth
api = TqApi(TqSim(init_balance=100000), auth=TqAuth("快期账户", "账户密码"))
set_commission(symbol: str, commission: float = nan)

设置指定合约模拟交易的每手手续费。

Args:

symbol (str): 合约代码

commission (float): 每手手续费

Returns:

float: 设置的每手手续费

Example:

from tqsdk import TqSim, TqApi, TqAuth

sim = TqSim()
api = TqApi(sim, auth=TqAuth("快期账户", "账户密码"))

sim.set_commission("SHFE.cu2112", 50)

print(sim.get_commission("SHFE.cu2112"))
set_margin(symbol: str, margin: float = nan)

设置指定合约模拟交易的每手保证金。

Args:

symbol (str): 合约代码 (只支持期货合约)

margin (float): 每手保证金

Returns:

float: 设置的每手保证金

Example:

from tqsdk import TqSim, TqApi, TqAuth

sim = TqSim()
api = TqApi(sim, auth=TqAuth("快期账户", "账户密码"))

sim.set_margin("SHFE.cu2112", 26000)

print(sim.get_margin("SHFE.cu2112"))
get_margin(symbol: str)

获取指定合约模拟交易的每手保证金。

Args:

symbol (str): 合约代码

Returns:

float: 返回合约模拟交易的每手保证金

Example:

from tqsdk import TqSim, TqApi, TqAuth

sim = TqSim()
api = TqApi(sim, auth=TqAuth("快期账户", "账户密码"))

quote = api.get_quote("SHFE.cu2112")
print(sim.get_margin("SHFE.cu2112"))
get_commission(symbol: str)

获取指定合约模拟交易的每手手续费

Args:

symbol (str): 合约代码

Returns:

float: 返回合约模拟交易的每手手续费

Example:

from tqsdk import TqSim, TqApi, TqAuth

sim = TqSim()
api = TqApi(sim, auth=TqAuth("快期账户", "账户密码"))

quote = api.get_quote("SHFE.cu2112")
print(sim.get_commission("SHFE.cu2112"))
get_account() Account

获取用户账户资金信息

Returns:

Account: 返回一个账户对象引用. 其内容将在 wait_update() 时更新

Example1:

# 获取当前浮动盈亏
from tqsdk import TqApi, TqAuth

tqacc = TqAccount("N南华期货", "123456", "123456")
api = TqApi(account=tqacc, auth=TqAuth("快期账户", "账户密码"))
account = tqacc.get_account()
print(account.float_profit)

# 预计的输出是这样的:
2180.0
...

Example2:

# 多账户模式下, 分别获取各账户浮动盈亏
from tqsdk import TqApi, TqAuth, TqMultiAccount, TqAccount, TqKq, TqSim

account = TqAccount("N南华期货", "123456", "123456")
tqkq = TqKq()
tqsim = TqSim()
api = TqApi(TqMultiAccount([account, tqkq, tqsim]), auth=TqAuth("快期账户", "账户密码"))
account1 = account.get_account()
account2 = tqkq.get_account()
account3 = tqsim.get_account()
print(f"账户 1 浮动盈亏 {account1.float_profit}, 账户 2 浮动盈亏 {account2.float_profit}, 账户 3 浮动盈亏 {account3.float_profit}")
api.close()
get_order(order_id: str | None = None) Order | Entity

获取用户委托单信息

Args:

order_id (str): [可选]单号, 不填单号则返回所有委托单

Returns:

Order: 当指定了 order_id 时, 返回一个委托单对象引用。 其内容将在 wait_update() 时更新。

不填 order_id 参数调用本函数, 将返回包含用户所有委托单的一个 tqsdk.objs.Entity 对象引用, 使用方法与dict一致, 其中每个元素的key为委托单号, value为 Order

注意: 在刚下单后, tqsdk 还没有收到回单信息时, 此对象中各项内容为空

Example1:

# 获取当前总挂单手数
from tqsdk import TqApi, TqAuth

tqacc = TqAccount("N南华期货", "123456", "123456")
api = TqApi(account=tqacc, auth=TqAuth("快期账户", "账户密码"))
orders = tqacc.get_order()
while True:
    api.wait_update()
    print(sum(order.volume_left for oid, order in orders.items() if order.status == "ALIVE"))

# 预计的输出是这样的:
3
3
0
...

Example2:

# 多账户模式下, 分别获取各账户挂单手数
from tqsdk import TqApi, TqAuth, TqMultiAccount, TqAccount, TqKq, TqSim

account = TqAccount("N南华期货", "123456", "123456")
tqkq = TqKq()
tqsim = TqSim()
api = TqApi(TqMultiAccount([account, tqkq, tqsim]), auth=TqAuth("快期账户", "账户密码"))
orders1 = account.get_order()
orders2 = tqkq.get_order()
orders3 = tqsim.get_order()
print(f"账户 1 挂单手数 {sum(order.volume_left for order in orders1.values() if order.status == "ALIVE")}, ",
      f"账户 2 挂单手数 {sum(order.volume_left for order in orders2.values() if order.status == "ALIVE")}, ",
      f"账户 3 挂单手数 {sum(order.volume_left for order in orders3.values() if order.status == "ALIVE")}")

order = account.get_order(order_id="订单号")
print(order)
api.close()
get_position(symbol: str | None = None) Position | Entity

获取用户持仓信息

Args:

symbol (str): [可选]合约代码, 不填则返回所有持仓

Returns:

Position: 当指定了 symbol 时, 返回一个持仓对象引用。 其内容将在 wait_update() 时更新。

不填 symbol 参数调用本函数, 将返回包含用户所有持仓的一个 tqsdk.objs.Entity 对象引用, 使用方法与dict一致, 其中每个元素的 key 为合约代码, value 为 Position

注意: 为保留一些可供用户查询的历史信息, 如 volume_long_yd(本交易日开盘前的多头持仓手数) 等字段, 因此服务器会返回当天已平仓合约( pos_long 和 pos_short 等字段为0)的持仓信息

Example1:

# 获取 DCE.m2109 当前浮动盈亏
from tqsdk import TqApi, TqAuth, TqAccount

tqacc = TqAccount("N南华期货", "123456", "123456")
api = TqApi(account=tqacc, auth=TqAuth("快期账户", "账户密码"))
position = tqacc.get_position("DCE.m2109")
print(position.float_profit_long + position.float_profit_short)
while api.wait_update():
    print(position.float_profit_long + position.float_profit_short)

# 预计的输出是这样的:
300.0
330.0
...

Example2:

# 多账户模式下, 分别获取各账户浮动盈亏
from tqsdk import TqApi, TqAuth, TqMultiAccount, TqAccount, TqKq, TqSim

account = TqAccount("N南华期货", "123456", "123456")
tqkq = TqKq()
tqsim = TqSim()
api = TqApi(TqMultiAccount([account, tqkq, tqsim]), auth=TqAuth("快期账户", "账户密码"))
position1 = account.get_position("DCE.m2101")
position2 = tqkq.get_position("DCE.m2101")
position3 = tqsim.get_position("DCE.m2101")
print(f"账户 1 'DCE.m2101' 浮动盈亏 {position1.float_profit_long + position1.float_profit_short}, ",
      f"账户 2 'DCE.m2101' 浮动盈亏 {position2.float_profit_long + position2.float_profit_short}, ",
      f"账户 3 'DCE.m2101' 浮动盈亏 {position3.float_profit_long + position3.float_profit_short}")
api.close()
get_trade(trade_id: str | None = None) Trade | Entity

获取用户成交信息

Args:

trade_id (str): [可选]成交号, 不填成交号则返回所有委托单

Returns:

Trade: 当指定了trade_id时, 返回一个成交对象引用. 其内容将在 wait_update() 时更新.

不填trade_id参数调用本函数, 将返回包含用户当前交易日所有成交记录的一个tqsdk.objs.Entity对象引用, 使用方法与dict一致, 其中每个元素的key为成交号, value为 Trade

推荐优先使用 trade_records() 获取某个委托单的相应成交记录, 仅当确有需要时才使用本函数.

Example:

# 多账户模式下, 分别获取各账户的成交记录
from tqsdk import TqApi, TqAuth, TqMultiAccount

account = TqAccount("N南华期货", "123456", "123456")
tqkq = TqKq()
tqsim = TqSim()
api = TqApi(TqMultiAccount([account, tqkq, tqsim]), auth=TqAuth("快期账户", "账户密码"))
trades1 = account.get_trade()
trades2 = tqkq.get_trade()
trades3 = tqsim.get_trade()
print(trades1)
print(trades2)
print(trades3)
api.close()

tqsdk.TqSimStock - 本地股票模拟交易

class tqsdk.TqSimStock(init_balance: float = 10000000.0, account_id: str | None = None)

天勤股票模拟交易类

该类实现了一个本地的股票模拟交易账户,并且在内部完成撮合交易,在回测模式下,只能使用 TqSimStock 账户来交易股票合约。

股票模拟交易只支持 ins_class 字段为 'STOCK' 的合约,且不支持 T+0 交易。

限价单要求报单价格达到或超过对手盘价格才能成交, 成交价为报单价格, 如果没有对手盘(涨跌停)则无法成交

市价单使用对手盘价格成交, 如果没有对手盘(涨跌停)则自动撤单

模拟交易不会有部分成交的情况, 要成交就是全部成交

TqSimStock 暂不支持设置手续费

Args:

init_balance (float): [可选]初始资金, 默认为一千万

account_id (str): [可选]帐号, 默认为 TQSIM_STOCK

Example1:

# 修改TqSim模拟帐号的初始资金为100000
from tqsdk import TqApi, TqSimStock, TqAuth
api = TqApi(TqSimStock(init_balance=100000), auth=TqAuth("快期账户", "账户密码"))

Example2:

# 同时使用 TqSim 交易期货,TqSimStock 交易股票
from tqsdk import TqApi, TqAuth, TqMultiAccount, TqSim, TqSimStock

tqsim_future = TqSim()
tqsim_stock = TqSimStock()

api = TqApi(account=TqMultiAccount([tqsim_future, tqsim_stock]), auth=TqAuth("快期账户", "账户密码"))

# 多账户下单,需要指定下单账户
order1 = api.insert_order(symbol="SHFE.cu2112", direction="BUY", offset="OPEN", volume=10, limit_price=72250.0, account=tqsim_future)
order2 = api.insert_order(symbol="SSE.603666", direction="BUY", volume=300, account=tqsim_stock)
while order1.status != 'FINISHED' or order2.status != 'FINISHED':
    api.wait_update()

# 打印账户可用资金
future_account = tqsim_future.get_account()
stock_account = tqsim_stock.get_account()
print(future_account.available, stock_account.available)
api.close()

Example3:

# 在回测模式下,同时使用 TqSim 交易期货,TqSimStock 交易股票

tqsim_future = TqSim()
tqsim_stock = TqSimStock()
api = TqApi(account=TqMultiAccount([tqsim_future, tqsim_stock]),
            backtest=TqBacktest(start_dt=datetime(2021, 7, 12), end_dt=datetime(2021, 7, 14)),
            auth=TqAuth("快期账户", "账户密码"))

future_quote = api.get_quote("SHFE.cu2112")
future_stock = api.get_quote("SSE.603666")

while datetime.strptime(future_stock.datetime, "%Y-%m-%d %H:%M:%S.%f") < datetime(2021, 7, 12, 9, 50):
    api.wait_update()

# 开仓,多账户下单,需要指定下单账户
order1 = api.insert_order(symbol="SHFE.cu2112", direction="BUY", offset="OPEN", volume=10, limit_price=future_quote.ask_price1, account=tqsim_future)
order2 = api.insert_order(symbol="SSE.603666", direction="BUY", volume=300, account=tqsim_stock)
while order1.status != 'FINISHED' or order2.status != 'FINISHED':
    api.wait_update()

future_account = tqsim_future.get_account()
stock_account = tqsim_stock.get_account()
# 打印账户当前可用资金
print(future_account.available, stock_account.available)

# 等待行情回测到第二天
while datetime.strptime(future_stock.datetime, "%Y-%m-%d %H:%M:%S.%f") < datetime(2021, 7, 13, 10, 30):
    api.wait_update()
# 平仓,股票只能 T+1 交易
order3 = api.insert_order(symbol="SHFE.cu2112", direction="SELL", offset="CLOSE", volume=8, limit_price=future_quote.bid_price1, account=tqsim_future)
order4 = api.insert_order(symbol="SSE.603666", direction="SELL", volume=200, account=tqsim_stock)
while order3.status != 'FINISHED' or order4.status != 'FINISHED':
    api.wait_update()

try:  # 等到回测结束
    while True:
        api.wait_update()
except BacktestFinished:
    # 打印回测时间内账户交易信息统计结果
    print(tqsim_future.tqsdk_stat)
    print(tqsim_stock.tqsdk_stat)
    api.close()
get_account() SecurityAccount

获取用户账户资金信息

Returns:

SecurityAccount: 返回一个账户对象引用. 其内容将在 wait_update() 时更新

Example1:

# 获取当前浮动盈亏
from tqsdk import TqApi, TqAuth

tqacc = TqAccount("N南华期货", "123456", "123456")
api = TqApi(account=tqacc, auth=TqAuth("快期账户", "账户密码"))
account = tqacc.get_account()
print(account.float_profit)

# 预计的输出是这样的:
2180.0
...

Example2:

# 多账户模式下, 分别获取各账户浮动盈亏
from tqsdk import TqApi, TqAuth, TqMultiAccount, TqAccount, TqKq, TqSim

account = TqAccount("N南华期货", "123456", "123456")
tqkq = TqKq()
tqsim = TqSim()
api = TqApi(TqMultiAccount([account, tqkq, tqsim]), auth=TqAuth("快期账户", "账户密码"))
account1 = account.get_account()
account2 = tqkq.get_account()
account3 = tqsim.get_account()
print(f"账户 1 浮动盈亏 {account1.float_profit}, 账户 2 浮动盈亏 {account2.float_profit}, 账户 3 浮动盈亏 {account3.float_profit}")
api.close()
get_order(order_id: str | None = None) SecurityOrder | Entity

获取用户委托单信息

Args:

order_id (str): [可选]单号, 不填单号则返回所有委托单

Returns:

SecurityOrder: 当指定了 order_id 时, 返回一个委托单对象引用。 其内容将在 wait_update() 时更新。

不填 order_id 参数调用本函数, 将返回包含用户所有委托单的一个 tqsdk.objs.Entity 对象引用, 使用方法与 dict 一致, 其中每个元素的 key 为委托单号, value为 SecurityOrder

注意: 在刚下单后, tqsdk 还没有收到回单信息时, 此对象中各项内容为空

Example:

from tqsdk import TqApi, TqAuth, TqKqStock
tqkqstock = TqKqStock()
api = TqApi(account=tqkqstock, auth=TqAuth("快期账户", "账户密码"))
order = tqkqstock.get_order('委托单Id')
print(f"委托股数 {order.volume_orign}, 剩余股数 {order.volume_left}")
api.close()
get_position(symbol: str | None = None) SecurityPosition | Entity

获取用户持仓信息

Args:

symbol (str): [可选]合约代码, 不填则返回所有持仓

Returns:

SecurityPosition: 当指定了 symbol 时, 返回一个持仓对象引用。 其内容将在 wait_update() 时更新。

不填 symbol 参数调用本函数, 将返回包含用户所有持仓的一个 tqsdk.objs.Entity 对象引用, 使用方法与dict一致, 其中每个元素的 key 为合约代码, value 为 SecurityPosition

Example:

from tqsdk import TqApi, TqAuth, TqKqStock
tqkqstock = TqKqStock()
api = TqApi(account=tqkqstock, auth=TqAuth("快期账户", "账户密码"))
position = tqkqstock.get_position('SSE.10003624')
print(f"建仓日期 {position.create_date}, 持仓数量 {position.volume}")
api.close()
get_trade(trade_id: str | None = None) SecurityTrade | Entity

获取用户成交信息

Args:

trade_id (str): [可选]成交号, 不填成交号则返回所有委托单

Returns:

SecurityTrade: 当指定了trade_id时, 返回一个成交对象引用. 其内容将在 wait_update() 时更新.

不填trade_id参数调用本函数, 将返回包含用户当前交易日所有成交记录的一个 tqsdk.objs.Entity 对象引用, 使用方法与dict一致, 其中每个元素的key为成交号, value为 SecurityTrade

推荐优先使用 trade_records() 获取某个委托单的相应成交记录, 仅当确有需要时才使用本函数.

Example:

from tqsdk import TqApi, TqAuth, TqKqStock
tqkqstock = TqKqStock()
api = TqApi(account=tqkqstock, auth=TqAuth("快期账户", "账户密码"))
trades = tqkqstock.get_trade('委托单Id')
[print(trade.trade_id, f"成交股数 {trade.volume}, 成交价格 {trade.price}") for trade in trades]
api.close()