问题描述
解决方案
在PTrade中,查询融资合约的实时盈亏主要使用 get_margin_contract() 函数。
该函数用于获取信用账户中当前持有的合约详情。返回的数据是一个 DataFrame,其中包含了每一个合约的具体信息。
关键字段说明
要获取融资合约的实时盈亏,你需要关注返回 DataFrame 中的以下字段:
fin_income: 融资合约盈亏。这是你最核心需要的字段。compact_type: 合约类别。'0'代表融资合约,'1'代表融券合约。stock_code: 证券代码。compact_id: 合约编号。
代码实现
以下是一个完整的策略示例,展示如何在交易过程中获取所有融资合约,并打印其代码、合约编号及实时盈亏金额。
def initialize(context):
# 初始化策略,设置一个标的用于演示(实际查询合约不需要特定标的)
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# 获取当前所有的两融合约信息
# 注意:该函数仅在两融交易模块(实盘/模拟盘)可用,回测中可能无法获取真实数据
df_contracts = get_margin_contract()
# 判断是否获取到了数据
if df_contracts is not None and not df_contracts.empty:
# 筛选出融资合约 (compact_type 为 '0')
# 注意:返回的字段类型通常为字符串(str),比较时需注意
financing_contracts = df_contracts[df_contracts['compact_type'] == '0']
if not financing_contracts.empty:
log.info("当前融资合约实时盈亏如下:")
# 遍历融资合约并打印盈亏信息
# iterrows() 返回 (index, Series)
for index, row in financing_contracts.iterrows():
stock_code = row['stock_code']
compact_id = row['compact_id']
fin_income = row['fin_income'] # 融资合约盈亏
log.info("标的: %s, 合约编号: %s, 融资盈亏: %s" % (stock_code, compact_id, fin_income))
else:
log.info("当前没有持仓的融资合约。")
else:
log.info("未查询到合约信息或接口返回为空。")
注意事项
- 适用环境:
get_margin_contract()函数仅支持 Ptrade客户端 可用,且仅在 两融交易模块(实盘或仿真交易)中有效。普通股票回测或交易无法调用此接口。 - 数据类型:PTrade 返回的 DataFrame 中,数字字段(如
fin_income)通常是字符串类型 (str)。如果需要进行数学计算(如计算总盈亏),请使用float()进行转换。 - 盈亏计算:
fin_income通常反映的是浮动盈亏,具体计算逻辑以券商柜台返回的数据为准。
Q&A
Q: get_margin_contract 返回的 slo_income 是什么意思?
A: slo_income 代表 融券合约盈亏。如果你进行的是融券卖出操作,需要关注这个字段而不是 fin_income。
Q: 如何查询融资合约的负债总额?
A: 在 get_margin_contract 返回的数据中,total_debit 字段代表该合约的负债总额。此外,也可以使用 get_margin_assert() 函数查询整个账户的负债总额。
Q: 为什么在回测中调用此函数报错或返回 None?
A: 该函数是交易专用接口,依赖于柜台的实时数据。在纯回测环境中,通常没有真实的合约流水数据,因此该函数主要用于实盘或连接了柜台的模拟交易环境。