一、前言
在期货量化交易中,除了获取行情数据,还需要了解合约的基本信息,包括交易时间、保证金、手续费、合约乘数等。这些信息对于策略开发、风险控制和资金管理都至关重要。
本文将介绍:
- 如何获取期货合约的完整信息
- 各字段的含义和用途
- 实际应用案例
二、为什么选择天勤量化(TqSdk)
在众多期货量化工具中,**天勤量化(TqSdk)**是目前国内最受欢迎的开源期货量化框架之一。本文使用TqSdk获取数据,主要基于以下优势:
| 特点 | 说明 |
|---|---|
| 完全免费 | 开源免费,无需付费即可获取实时行情 |
| 数据全面 | 支持国内所有期货交易所的实时行情和历史数据 |
| 上手简单 | 几行Python代码即可获取数据,无需复杂配置 |
| 文档完善 | 官方文档详细,示例代码丰富 |
| 社区活跃 | GitHub开源,问题响应及时 |
安装方法:
pipinstalltqsdk快期账户:使用TqSdk需要注册快期账户(免费),访问 https://www.shinnytech.com 注册。
三、合约信息概览
TqSdk的get_quote()函数返回的数据不仅包含实时行情,还包含合约的静态信息:
| 信息类别 | 包含字段 |
|---|---|
| 基本信息 | 合约代码、合约名称、交易所、品种代码 |
| 价格信息 | 最新价、涨跌停、开盘收盘价 |
| 交易规则 | 价格变动单位、合约乘数、最大下单量 |
| 成本信息 | 保证金、手续费 |
| 时间信息 | 交易时间、到期日期 |
四、查询合约信息
4.1 基础示例
#!/usr/bin/env python# -*- coding: utf-8 -*-""" 功能:查询期货合约的完整信息 说明:本代码仅供学习参考 """fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))# 获取螺纹钢主力合约信息quote=api.get_quote("SHFE.rb2501")print("="*60)print("【合约基本信息】")print("="*60)print(f"合约代码:{quote.instrument_id}")print(f"合约名称:{quote.instrument_name}")print(f"交易所:{quote.exchange_id}")print(f"品种代码:{quote.product_id}")print(f"合约类型:{quote.ins_class}")print("\n【交易规则】")print("-"*60)print(f"价格变动单位:{quote.price_tick}元")print(f"合约乘数:{quote.volume_multiple}吨/手")print(f"最大限价单手数:{quote.max_limit_order_volume}")print("\n【成本信息】")print("-"*60)print(f"每手保证金:{quote.margin:.2f}元")print(f"每手手续费:{quote.commission:.2f}元")print("\n【价格信息】")print("-"*60)print(f"最新价:{quote.last_price}")print(f"涨停价:{quote.upper_limit}")print(f"跌停价:{quote.lower_limit}")api.close()运行结果示例:
============================================================ 【合约基本信息】 ============================================================ 合约代码: SHFE.rb2501 合约名称: 螺纹钢2501 交易所: SHFE 品种代码: rb 合约类型: FUTURE 【交易规则】 ------------------------------------------------------------ 价格变动单位: 1.0 元 合约乘数: 10.0 吨/手 最大限价单手数: 500 【成本信息】 ------------------------------------------------------------ 每手保证金: 3200.50 元 每手手续费: 3.51 元 【价格信息】 ------------------------------------------------------------ 最新价: 3205.0 涨停价: 3462.0 跌停价: 2948.04.2 完整字段说明
以下是get_quote()返回的主要字段:
合约基本信息
| 字段 | 类型 | 说明 |
|---|---|---|
| instrument_id | str | 合约代码,如 SHFE.rb2501 |
| instrument_name | str | 合约中文名,如 螺纹钢2501 |
| exchange_id | str | 交易所代码,如 SHFE |
| product_id | str | 品种代码,如 rb |
| ins_class | str | 合约类型,FUTURE/OPTION等 |
| expired | bool | 是否已到期下市 |
交易规则
| 字段 | 类型 | 说明 |
|---|---|---|
| price_tick | float | 价格变动最小单位 |
| price_decs | int | 价格小数位数 |
| volume_multiple | float | 合约乘数(每手数量) |
| max_limit_order_volume | int | 最大限价单手数 |
| max_market_order_volume | int | 最大市价单手数 |
| min_limit_order_volume | int | 最小限价单手数 |
成本信息
| 字段 | 类型 | 说明 |
|---|---|---|
| margin | float | 每手保证金(元) |
| commission | float | 每手手续费(元) |
时间信息
| 字段 | 类型 | 说明 |
|---|---|---|
| trading_time | str | 交易时间段(JSON格式) |
| expire_datetime | float | 到期时间戳 |
| delivery_year | int | 交割年份 |
| delivery_month | int | 交割月份 |
| expire_rest_days | int | 距到期日剩余天数 |
五、获取交易时间
交易时间信息存储在trading_time字段,格式为JSON字符串:
fromtqsdkimportTqApi,TqAuthimportjson api=TqApi(auth=TqAuth("快期账户","快期密码"))quote=api.get_quote("SHFE.rb2501")# 解析交易时间trading_time=json.loads(quote.trading_time)print("【螺纹钢交易时间】")print("-"*40)print("日盘交易时段:")forperiodintrading_time.get('day',[]):print(f"{period[0]}-{period[1]}")print("\n夜盘交易时段:")forperiodintrading_time.get('night',[]):print(f"{period[0]}-{period[1]}")api.close()运行结果:
【螺纹钢交易时间】 ---------------------------------------- 日盘交易时段: 09:00:00 - 10:15:00 10:30:00 - 11:30:00 13:30:00 - 15:00:00 夜盘交易时段: 21:00:00 - 23:00:005.1 不同品种的交易时间
不同品种的交易时间有所不同:
| 品种类型 | 夜盘时间 | 示例品种 |
|---|---|---|
| 无夜盘 | 无 | 股指期货、国债期货 |
| 夜盘到23:00 | 21:00-23:00 | 螺纹钢、热卷 |
| 夜盘到23:30 | 21:00-23:30 | 白糖、棉花 |
| 夜盘到01:00 | 21:00-01:00 | 铜、铝、锌 |
| 夜盘到02:30 | 21:00-02:30 | 黄金、白银、原油 |
六、计算交易成本
利用合约信息可以计算具体的交易成本:
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))quote=api.get_quote("SHFE.rb2501")# 计算交易成本trade_lots=10# 交易10手# 保证金total_margin=quote.margin*trade_lots# 手续费(开仓)open_commission=quote.commission*trade_lots# 合约价值contract_value=quote.last_price*quote.volume_multiple*trade_lotsprint(f"【交易{trade_lots}手螺纹钢的成本】")print("-"*40)print(f"最新价:{quote.last_price}元/吨")print(f"合约乘数:{quote.volume_multiple}吨/手")print(f"合约总价值:{contract_value:,.0f}元")print(f"所需保证金:{total_margin:,.2f}元")print(f"开仓手续费:{open_commission:.2f}元")print(f"保证金比例:{total_margin/contract_value*100:.2f}%")api.close()运行结果:
【交易 10 手螺纹钢的成本】 ---------------------------------------- 最新价: 3205.0 元/吨 合约乘数: 10.0 吨/手 合约总价值: 320,500 元 所需保证金: 32,005.00 元 开仓手续费: 35.10 元 保证金比例: 9.99%七、批量查询多个品种
fromtqsdkimportTqApi,TqAuth api=TqApi(auth=TqAuth("快期账户","快期密码"))# 要查询的合约列表symbols=["SHFE.rb2501",# 螺纹钢"DCE.i2501",# 铁矿石"SHFE.au2502",# 黄金"INE.sc2502",# 原油"CFFEX.IF2501",# 沪深300股指]print(f"{'合约':<15}{'乘数':<8}{'保证金':<12}{'手续费':<10}{'最小变动':<10}")print("="*60)forsymbolinsymbols:q=api.get_quote(symbol)print(f"{q.instrument_name:<12}{q.volume_multiple:<8.0f}"f"{q.margin:<12.2f}{q.commission:<10.2f}{q.price_tick:<10}")api.close()运行结果:
合约 乘数 保证金 手续费 最小变动 ============================================================ 螺纹钢2501 10 3200.50 3.51 1.0 铁矿石2501 100 8500.00 4.20 0.5 黄金2502 1000 52000.00 10.00 0.02 原油2502 1000 65000.00 20.00 0.1 沪深300股指2501 300 158000.00 23.00 0.2八、实用函数封装
将合约信息查询封装成实用函数:
fromtqsdkimportTqApi,TqAuthimportjsondefget_contract_info(api,symbol):""" 获取合约详细信息 返回格式化的字典 """quote=api.get_quote(symbol)# 解析交易时间try:trading_time=json.loads(quote.trading_time)except:trading_time={}return{"合约代码":quote.instrument_id,"合约名称":quote.instrument_name,"交易所":quote.exchange_id,"品种代码":quote.product_id,"合约乘数":quote.volume_multiple,"最小变动":quote.price_tick,"每手保证金":round(quote.margin,2),"每手手续费":round(quote.commission,2),"最新价":quote.last_price,"涨停价":quote.upper_limit,"跌停价":quote.lower_limit,"日盘时间":trading_time.get('day',[]),"夜盘时间":trading_time.get('night',[]),"到期天数":quote.expire_rest_days,}defcalculate_trade_cost(api,symbol,lots):""" 计算交易成本 """quote=api.get_quote(symbol)return{"交易手数":lots,"合约价值":quote.last_price*quote.volume_multiple*lots,"所需保证金":quote.margin*lots,"开仓手续费":quote.commission*lots,"平仓手续费":quote.commission*lots,# 平今仓可能不同"总手续费":quote.commission*lots*2,}# 使用示例if__name__=="__main__":api=TqApi(auth=TqAuth("快期账户","快期密码"))# 获取合约信息info=get_contract_info(api,"SHFE.rb2501")print("【合约信息】")forkey,valueininfo.items():print(f"{key}:{value}")print("\n【交易成本计算(10手)】")cost=calculate_trade_cost(api,"SHFE.rb2501",10)forkey,valueincost.items():ifisinstance(value,float):print(f"{key}:{value:,.2f}元")else:print(f"{key}:{value}")api.close()九、常见问题
Q1: 保证金和手续费是固定的吗?
不是。保证金和手续费会根据以下因素变化:
- 交易所调整(节假日前后常调整)
- 期货公司加收(一般在交易所基础上加收)
- 合约临近交割月(通常会提高保证金)
Q2: 如何获取期权合约的信息?
期权合约有额外的字段:
| 字段 | 说明 |
|---|---|
| underlying_symbol | 标的合约 |
| strike_price | 行权价 |
| option_class | CALL看涨/PUT看跌 |
| exercise_type | A美式/E欧式 |
Q3: expire_rest_days 有什么用?
用于判断合约是否接近到期,常用于:
- 避免交易临近到期的合约
- 自动换月(主力合约切换)
- 计算时间价值(期权)
十、总结
本文介绍了使用TqSdk查询期货合约信息的方法:
| 要点 | 内容 |
|---|---|
| 获取信息 | api.get_quote(symbol) |
| 保证金 | quote.margin |
| 手续费 | quote.commission |
| 交易时间 | quote.trading_time |
| 合约乘数 | quote.volume_multiple |
下一步学习:
- Python计算技术指标(均线、MACD等)
- TqSdk模拟交易入门
免责声明:本文仅供学习交流使用,不构成任何投资建议。期货交易有风险,入市需谨慎。
更多资源:
- 天勤量化官网:https://www.shinnytech.com
- GitHub开源地址:https://github.com/shinnytech/tqsdk-python
- 官方文档:https://doc.shinnytech.com/tqsdk/latest