问题描述
解决方案
在 PTrade 中,查询期货合约的合约乘数(Contract Multiplier)和交易单位(Trading Unit)主要使用 get_instruments 函数。
该函数用于获取合约的上市具体信息,返回一个包含合约详细属性的对象。
核心函数:get_instruments(contract)
- 参数:
contract(str),期货合约代码(例如:"IF2306.CCFX"或"CU2306.XSGE")。 - 返回:
FutureParams对象。 - 关键属性:
.contract_multiplier: 合约乘数 (float 类型).trade_unit: 交易单位 (int 类型)
代码示例
以下是一个完整的策略示例,展示如何在 before_trading_start 阶段查询并打印指定期货合约的乘数和交易单位。
def initialize(context):
# 设置需要查询的期货合约代码
# 示例:沪深300股指期货 (IF) 和 沪铜 (CU)
g.future_list = ["IF2306.CCFX", "CU2306.XSGE"]
set_universe(g.future_list)
def before_trading_start(context, data):
for code in g.future_list:
# 获取合约信息对象
info = get_instruments(code)
if info:
# 获取合约乘数
multiplier = info.contract_multiplier
# 获取交易单位
unit = info.trade_unit
# 获取合约名称
name = info.contract_name
log.info("合约代码: %s, 名称: %s" % (code, name))
log.info("合约乘数: %s" % multiplier)
log.info("交易单位: %s" % unit)
log.info("-" * 30)
else:
log.info("未查询到合约 %s 的信息" % code)
def handle_data(context, data):
pass
返回字段说明
调用 get_instruments 后返回的对象包含以下常用字段:
| 属性名 | 类型 | 说明 |
|---|---|---|
| contract_multiplier | float | 合约乘数 (例如股指期货通常为 300.0 或 200.0) |
| trade_unit | int | 交易单位 (例如铜为 5,表示 5吨/手) |
| contract_code | str | 合约代码 |
| contract_name | str | 合约名称 |
| exchange | str | 交易所代码 (如 CCFX, XSGE 等) |
| margin_rate | float | 保证金比例 |
| delivery_date | str | 交割日期 |
| listing_date | str | 上市日期 |
Q&A
Q: get_instruments 函数可以在回测和实盘中使用吗?
A: 是的,该函数在回测和交易(实盘)模块中均可使用。
Q: 如果传入的合约代码不存在或已过期,函数会返回什么?
A: 如果查询不到对应合约的信息,函数通常会返回 None 或者空对象,因此在代码中建议增加 if info: 的判断逻辑以避免报错。
Q: 合约乘数和交易单位有什么区别?
A: 在大多数商品期货中,交易单位通常指“每手多少吨/克”,合约乘数通常与交易单位数值一致(如沪铜交易单位5吨/手,乘数也是5)。但在股指期货中,交易单位通常指“手”,而合约乘数是指每个指数点代表的金额(如沪深300期货乘数为300元/点)。计算合约价值时通常使用:价格 * 合约乘数。