🚀 AI 一键生成 ptrade 策略代码

PTrade 两融实战:使用 get_margin_contract 查询融资合约实时盈亏

ptrade | 发布时间: 2025/12/24
以下内容由 EasyQuant 生成。

问题描述

怎么查询融资合约的实时盈亏?

解决方案

在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("未查询到合约信息或接口返回为空。")

注意事项

  1. 适用环境get_margin_contract() 函数仅支持 Ptrade客户端 可用,且仅在 两融交易模块(实盘或仿真交易)中有效。普通股票回测或交易无法调用此接口。
  2. 数据类型:PTrade 返回的 DataFrame 中,数字字段(如 fin_income)通常是字符串类型 (str)。如果需要进行数学计算(如计算总盈亏),请使用 float() 进行转换。
  3. 盈亏计算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: 该函数是交易专用接口,依赖于柜台的实时数据。在纯回测环境中,通常没有真实的合约流水数据,因此该函数主要用于实盘或连接了柜台的模拟交易环境。