Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 14 additions & 14 deletions PKG-INFO
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
Metadata-Version: 2.1
Name: tqsdk
Version: 3.9.9
Version: 3.10.1
Summary: TianQin SDK
Home-page: https://www.shinnytech.com/tqsdk
Author: TianQin
Expand All @@ -10,7 +10,7 @@ Platform: UNKNOWN
Classifier: Programming Language :: Python :: 3
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Requires-Python: >=3.8
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE

Expand All @@ -20,7 +20,7 @@ License-File: LICENSE
<p align="center">
<img src ="https://img.shields.io/pypi/v/tqsdk?color=blueviolet">
<img src ="https://img.shields.io/badge/platform-windows|linux|macos-green.svg"/>
<img src ="https://img.shields.io/badge/python-3.8+-blue.svg" />
<img src ="https://img.shields.io/badge/python-3.9+-blue.svg" />
<img src ="https://img.shields.io/pypi/dm/tqsdk?color=yellowgreen">
<img src ="https://img.shields.io/github/license/shinnytech/tqsdk-python.svg?color=orange"/>
</p>
Expand All @@ -37,23 +37,23 @@ TqSdk 支持用户使用极少的代码量构建各种类型的量化交易策
from tqsdk import TqApi, TqAuth, TqAccount, TargetPosTask

api = TqApi(TqAccount("H海通期货", "4003242", "123456"), auth=TqAuth("快期账户", "账户密码")) # 创建 TqApi 实例, 指定交易账户
q_2309 = api.get_quote("SHFE.rb2309") # 订阅近月合约行情
t_2309 = TargetPosTask(api, "SHFE.rb2309") # 创建近月合约调仓工具
q_2401 = api.get_quote("SHFE.rb2401") # 订阅远月合约行情
t_2401 = TargetPosTask(api, "SHFE.rb2401") # 创建远月合约调仓工具
q_2610 = api.get_quote("SHFE.rb2610") # 订阅近月合约行情
t_2610 = TargetPosTask(api, "SHFE.rb2610") # 创建近月合约调仓工具
q_2701 = api.get_quote("SHFE.rb2701") # 订阅远月合约行情
t_2701 = TargetPosTask(api, "SHFE.rb2701") # 创建远月合约调仓工具

while True:
api.wait_update() # 等待数据更新
spread = q_2309["last_price"] - q_2401["last_price"] # 计算近月合约-远月合约价差
spread = q_2610["last_price"] - q_2701["last_price"] # 计算近月合约-远月合约价差
print("当前价差:", spread)
if spread > 250:
print("价差过高: 空近月,多远月")
t_2309.set_target_volume(-1) # 要求把2309合约调整为空头1手
t_2401.set_target_volume(1) # 要求把2401合约调整为多头1手
t_2610.set_target_volume(-1) # 要求把近月合约调整为空头1手
t_2701.set_target_volume(1) # 要求把远月合约调整为多头1手
elif spread < 200:
print("价差回复: 清空持仓") # 要求把 2309 和 2401合约都调整为不持仓
t_2309.set_target_volume(0)
t_2401.set_target_volume(0)
print("价差回复: 清空持仓") # 要求把近月和远月合约都调整为不持仓
t_2610.set_target_volume(0)
t_2701.set_target_volume(0)
```

要快速了解如何使用TqSdk,请访问我们的 [十分钟快速入门指南](https://doc.shinnytech.com/tqsdk/latest/quickstart.html)。
Expand Down Expand Up @@ -102,7 +102,7 @@ TqSdk提供的功能可以支持从简单到复杂的各类策略程序:

## 安装方法

TqSdk 仅支持 Python 3.8 及更高版本。要安装 TqSdk,可使用 pip:
TqSdk 仅支持 Python 3.9 及更高版本。要安装 TqSdk,可使用 pip:

```bash
pip install tqsdk
Expand Down
24 changes: 12 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<p align="center">
<img src ="https://img.shields.io/pypi/v/tqsdk?color=blueviolet">
<img src ="https://img.shields.io/badge/platform-windows|linux|macos-green.svg"/>
<img src ="https://img.shields.io/badge/python-3.8+-blue.svg" />
<img src ="https://img.shields.io/badge/python-3.9+-blue.svg" />
<img src ="https://img.shields.io/pypi/dm/tqsdk?color=yellowgreen">
<img src ="https://img.shields.io/github/license/shinnytech/tqsdk-python.svg?color=orange"/>
</p>
Expand All @@ -21,23 +21,23 @@ TqSdk 支持用户使用极少的代码量构建各种类型的量化交易策
from tqsdk import TqApi, TqAuth, TqAccount, TargetPosTask

api = TqApi(TqAccount("H海通期货", "4003242", "123456"), auth=TqAuth("快期账户", "账户密码")) # 创建 TqApi 实例, 指定交易账户
q_2309 = api.get_quote("SHFE.rb2309") # 订阅近月合约行情
t_2309 = TargetPosTask(api, "SHFE.rb2309") # 创建近月合约调仓工具
q_2401 = api.get_quote("SHFE.rb2401") # 订阅远月合约行情
t_2401 = TargetPosTask(api, "SHFE.rb2401") # 创建远月合约调仓工具
q_2610 = api.get_quote("SHFE.rb2610") # 订阅近月合约行情
t_2610 = TargetPosTask(api, "SHFE.rb2610") # 创建近月合约调仓工具
q_2701 = api.get_quote("SHFE.rb2701") # 订阅远月合约行情
t_2701 = TargetPosTask(api, "SHFE.rb2701") # 创建远月合约调仓工具

while True:
api.wait_update() # 等待数据更新
spread = q_2309["last_price"] - q_2401["last_price"] # 计算近月合约-远月合约价差
spread = q_2610["last_price"] - q_2701["last_price"] # 计算近月合约-远月合约价差
print("当前价差:", spread)
if spread > 250:
print("价差过高: 空近月,多远月")
t_2309.set_target_volume(-1) # 要求把2309合约调整为空头1手
t_2401.set_target_volume(1) # 要求把2401合约调整为多头1手
t_2610.set_target_volume(-1) # 要求把近月合约调整为空头1手
t_2701.set_target_volume(1) # 要求把远月合约调整为多头1手
elif spread < 200:
print("价差回复: 清空持仓") # 要求把 2309 和 2401合约都调整为不持仓
t_2309.set_target_volume(0)
t_2401.set_target_volume(0)
print("价差回复: 清空持仓") # 要求把近月和远月合约都调整为不持仓
t_2610.set_target_volume(0)
t_2701.set_target_volume(0)
```

要快速了解如何使用TqSdk,请访问我们的 [十分钟快速入门指南](https://doc.shinnytech.com/tqsdk/latest/quickstart.html)。
Expand Down Expand Up @@ -86,7 +86,7 @@ TqSdk提供的功能可以支持从简单到复杂的各类策略程序:

## 安装方法

TqSdk 仅支持 Python 3.8 及更高版本。要安装 TqSdk,可使用 pip:
TqSdk 仅支持 Python 3.9 及更高版本。要安装 TqSdk,可使用 pip:

```bash
pip install tqsdk
Expand Down
6 changes: 6 additions & 0 deletions doc/_includes/tqsdk_ai_agent_intro.rst
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@

请先下载并解压 TqSdk 技能包:https://doc.shinnytech.com/tqsdk/latest/ai_editor/skills/tqsdk-trading-and-data.zip,然后先阅读其中的 SKILL.md,并按里面的说明再回答任何 TqSdk 问题或编写任何 TqSdk 代码。

推荐的 AI Agent 工具下载:

* Trae:https://www.trae.cn/ide/download
* CodeBuddy:https://www.codebuddy.cn/ide/
* Codex:https://openai.com/codex/

.. tqsdk_skills_ref_marker

详细说明请见 :ref:`tqsdk_skills` 。
1 change: 0 additions & 1 deletion doc/_static/search_zh_dict.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ TqKq 100000
TqKqStock 100000
TqMultiAccount 100000
TqNotify 100000
TqReplay 100000
TqRiskRule 100000
TqRiskRuleError 100000
TqSim 100000
Expand Down
8 changes: 4 additions & 4 deletions doc/advanced/backtest.rst
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ TqSdk 并不提供专门的参数优化机制. 您可以按照自己的需求,
from datetime import date

LONG = 60
SYMBOL = "SHFE.cu1907"
SYMBOL = "SHFE.cu2607"

for SHORT in range(20, 40): # 短周期参数从20-40分别做回测
acc = TqSim() # 每次回测都创建一个新的模拟账户
try:
api = TqApi(acc, backtest=TqBacktest(start_dt=date(2019, 5, 6), end_dt=date(2019, 5, 10)), auth=TqAuth("快期账户", "账户密码"))
api = TqApi(acc, backtest=TqBacktest(start_dt=date(2026, 5, 18), end_dt=date(2026, 5, 22)), auth=TqAuth("快期账户", "账户密码"))
account = api.get_account()
klines = api.get_kline_serial(SYMBOL, duration_seconds=60, data_length=LONG + 2)
target_pos = TargetPosTask(api, SYMBOL)
Expand Down Expand Up @@ -48,10 +48,10 @@ TqSdk 并不提供专门的参数优化机制. 您可以按照自己的需求,

def MyStrategy(SHORT):
LONG = 60
SYMBOL = "SHFE.cu1907"
SYMBOL = "SHFE.cu2607"
acc = TqSim()
try:
api = TqApi(acc, backtest=TqBacktest(start_dt=date(2019, 5, 6), end_dt=date(2019, 5, 10)), auth=TqAuth("快期账户", "账户密码"))
api = TqApi(acc, backtest=TqBacktest(start_dt=date(2026, 5, 18), end_dt=date(2026, 5, 22)), auth=TqAuth("快期账户", "账户密码"))
data_length = LONG + 2
klines = api.get_kline_serial(SYMBOL, duration_seconds=60, data_length=data_length)
target_pos = TargetPosTask(api, SYMBOL)
Expand Down
4 changes: 2 additions & 2 deletions doc/advanced/dingding.rst
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ TqSdk 并不提供专门的服务器来推送消息,但是你可以通过其


api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote = api.get_quote("SHFE.rb2109")
target_pos = TargetPosTask(api, "SHFE.rb2110")
quote = api.get_quote("SHFE.rb2610")
target_pos = TargetPosTask(api, "SHFE.rb2701")
send_msg("策略开始运行")
a = 0
while True:
Expand Down
16 changes: 10 additions & 6 deletions doc/advanced/for_ctp_user.rst
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ Ctp接口不提供K线数据.

TqSdk中的K线序列采用 pandas.DataFrame 格式. pandas 提供了 `非常丰富的数据处理函数 <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_ , 使我们可以非常方便的进行数据处理, 例如::

ks = api.get_kline_serial("SHFE.cu1901", 60)
ks = api.get_kline_serial("SHFE.cu2607", 60)
print(ks.iloc[-1]) # <- 最后一根K线
print(ks.close) # <- 收盘价序列
ks.high - ks.high.shift(1) # <- 每根K线最高价-前一根K线最高价, 形成一个新序列
Expand All @@ -59,7 +59,7 @@ TqSdk中的K线序列采用 pandas.DataFrame 格式. pandas 提供了 `非常丰
TqSdk 也通过 :py:mod:`tqsdk.tafunc` 提供了一批行情分析中常用的计算函数, 例如::

from tqsdk import tafunc
ks = api.get_kline_serial("SHFE.cu1901", 60)
ks = api.get_kline_serial("SHFE.cu2607", 60)
ms = tafunc.max(ks.open, ks.close) # <- 取每根K线开盘价和收盘价的高者构建一个新序列
median3 = tafunc.median(ks.close, 100) # <- 求最近100根K线收盘价的中间值
ss = tafunc.std(ks.close, 5) # <- 每5根K线的收盘价标准差
Expand All @@ -85,8 +85,10 @@ Ctp接口按照事件回调模型设计, 使用 CThostFtdcTraderSpi 的 OnXXX

TqSdk则不使用事件回调机制. :py:meth:`~tqsdk.TqApi.wait_update` 函数设计用来获取任意数据更新, 像这样::

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("快期账户", "账户密码"))
x = api.insert_order("SHFE.cu1901", direction="BUY", offset="OPEN", volume=1, limit_price=50000)
x = api.insert_order("SHFE.cu2607", direction="BUY", offset="OPEN", volume=1, limit_price=50000)

while True:
api.wait_update() # <- 这个 wait_update 将尝试更新所有数据. 如果没有任何新信息, 程序会阻塞在这一句. 一旦有任意数据被更新, 程序会继续往下执行
Expand All @@ -95,10 +97,12 @@ TqSdk则不使用事件回调机制. :py:meth:`~tqsdk.TqApi.wait_update` 函数

一次 wait_update 可能更新多个实体, 在这种情况下, :py:meth:`~tqsdk.TqApi.is_changing` 被用来判断某个实体是否有变更::

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("快期账户", "账户密码"))
q = api.get_quote("SHFE.cu1901")
ks = api.get_kline_serial("SHFE.cu1901", 60)
x = api.insert_order("SHFE.cu1901", direction="BUY", offset="OPEN", volume=1, limit_price=50000)
q = api.get_quote("SHFE.cu2607")
ks = api.get_kline_serial("SHFE.cu2607", 60)
x = api.insert_order("SHFE.cu2607", direction="BUY", offset="OPEN", volume=1, limit_price=50000)

while True:
api.wait_update() # <- 这个 wait_update 将尝试更新所有数据. 如果没有任何新信息, 程序会阻塞在这一句. 一旦有任意数据被更新, 程序会继续往下执行
Expand Down
42 changes: 25 additions & 17 deletions doc/advanced/for_vnpy_user.rst
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ TqSdk 则使用基于网络协作的组件设计. 如下图:

SHORT = 30
LONG = 60
SYMBOL = "SHFE.bu1912"
SYMBOL = "SHFE.bu2609"

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

Expand Down Expand Up @@ -122,13 +122,15 @@ TqSdk将每个策略作为一个独立进程运行, 这样就可以:
当近月-远月的价差大于200时做空近月,做多远月
当价差小于150时平仓
'''
from tqsdk import TqApi, TqAuth, TargetPosTask

api = TqApi(auth=TqAuth("快期账户", "账户密码"))
quote_near = api.get_quote("SHFE.rb1910")
quote_deferred = api.get_quote("SHFE.rb2001")
# 创建 rb1910 的目标持仓 task,该 task 负责调整 rb1910 的仓位到指定的目标仓位
target_pos_near = TargetPosTask(api, "SHFE.rb1910")
# 创建 rb2001 的目标持仓 task,该 task 负责调整 rb2001 的仓位到指定的目标仓位
target_pos_deferred = TargetPosTask(api, "SHFE.rb2001")
quote_near = api.get_quote("SHFE.rb2610")
quote_deferred = api.get_quote("SHFE.rb2701")
# 创建 rb2610 的目标持仓 task,该 task 负责调整 rb2610 的仓位到指定的目标仓位
target_pos_near = TargetPosTask(api, "SHFE.rb2610")
# 创建 rb2701 的目标持仓 task,该 task 负责调整 rb2701 的仓位到指定的目标仓位
target_pos_deferred = TargetPosTask(api, "SHFE.rb2701")

while True:
api.wait_update()
Expand Down Expand Up @@ -160,7 +162,7 @@ K线数据与指标计算

TqSdk中的K线序列采用 pandas.DataFrame 格式. pandas 提供了 `非常丰富的数据处理函数 <https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.html>`_ , 使我们可以非常方便的进行数据处理, 例如::

ks = api.get_kline_serial("SHFE.cu1901", 60)
ks = api.get_kline_serial("SHFE.cu2607", 60)
print(ks.iloc[-1]) # <- 最后一根K线
print(ks.close) # <- 收盘价序列
ks.high - ks.high.shift(1) # <- 每根K线最高价-前一根K线最高价, 形成一个新序列
Expand All @@ -169,7 +171,7 @@ TqSdk中的K线序列采用 pandas.DataFrame 格式. pandas 提供了 `非常丰
TqSdk 也通过 :py:mod:`tqsdk.tafunc` 提供了一批行情分析中常用的计算函数, 例如::

from tqsdk import tafunc
ks = api.get_kline_serial("SHFE.cu1901", 60)
ks = api.get_kline_serial("SHFE.cu2607", 60)
ms = tafunc.max(ks.open, ks.close) # <- 取每根K线开盘价和收盘价的高者构建一个新序列
median3 = tafunc.median(ks.close, 100) # <- 求最近100根K线收盘价的中间值
ss = tafunc.std(ks.close, 5) # <- 每5根K线的收盘价标准差
Expand All @@ -192,8 +194,10 @@ vn.py按照事件回调模型设计, 使用 CtaTemplate 的 on_xxx 回调函数

TqSdk则不使用事件回调机制. :py:meth:`~tqsdk.TqApi.wait_update` 函数设计用来获取任意数据更新, 像这样::

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("快期账户", "账户密码"))
ks = api.get_kline_serial("SHFE.cu1901", 60)
ks = api.get_kline_serial("SHFE.cu2607", 60)

while True:
api.wait_update() # <- 这个 wait_update 将尝试更新所有数据. 如果没有任何新信息, 程序会阻塞在这一句. 一旦有任意数据被更新, 程序会继续往下执行
Expand All @@ -202,10 +206,12 @@ TqSdk则不使用事件回调机制. :py:meth:`~tqsdk.TqApi.wait_update` 函数

一次 wait_update 可能更新多个实体, 在这种情况下, :py:meth:`~tqsdk.TqApi.is_changing` 被用来判断某个实体是否有变更::

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("快期账户", "账户密码"))
q = api.get_quote("SHFE.cu1901")
ks = api.get_kline_serial("SHFE.cu1901", 60)
x = api.insert_order("SHFE.cu1901", direction="BUY", offset="OPEN", volume=1, limit_price=50000)
q = api.get_quote("SHFE.cu2607")
ks = api.get_kline_serial("SHFE.cu2607", 60)
x = api.insert_order("SHFE.cu2607", direction="BUY", offset="OPEN", volume=1, limit_price=50000)

while True:
api.wait_update() # <- 这个 wait_update 将尝试更新所有数据. 如果没有任何新信息, 程序会阻塞在这一句. 一旦有任意数据被更新, 程序会继续往下执行
Expand Down Expand Up @@ -235,12 +241,14 @@ TqSdk 提供 :ref:`web_gui` 来供有图形化需求的用户使用:

TqSdk配合web_gui使用时, 还支持自定义绘制行情图表, 像这样::

from tqsdk import TqApi, TqAuth

api = TqApi(auth=TqAuth("快期账户","账户密码"), web_gui=True)
# 获取 cu1905cu1906 的日线数据
klines = api.get_kline_serial("SHFE.cu1905", 86400)
klines2 = api.get_kline_serial("SHFE.cu1906", 86400)
# 获取 cu2607cu2608 的日线数据
klines = api.get_kline_serial("SHFE.cu2607", 86400)
klines2 = api.get_kline_serial("SHFE.cu2608", 86400)

# 算出 cu1906 - cu1905 的价差,并以折线型态显示在副图
# 算出 cu2608 - cu2607 的价差,并以折线型态显示在副图
klines["dif"] = klines2["close"] - klines["close"]
klines["dif.board"] = "DIF"
klines["dif.color"] = 0xFF00FF00
Expand Down
Loading