🚀 AI 一键生成 ptrade 策略代码

PTrade API 如何实现直接还款 (margincash_direct_refund) 与直接还券 (marginsec_direct_refund)?

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

问题描述

我融资账户里有现金,想直接用这些现金还掉一部分融资借款,应该怎么用代码实现?

解决方案

在PTrade中,如果您想使用账户内的可用资金直接归还融资负债(即“直接还款”),可以使用 margincash_direct_refund 函数。

该函数不需要卖出股票,而是直接划扣账户内的现金来偿还融资负债。

核心代码实现

以下是一个完整的策略示例。该策略会在每天盘中检查融资负债,并尝试使用现金归还指定金额的负债。

def initialize(context):
    # 初始化策略,设置股票池(此处仅为示例,直接还款不需要特定股票池)
    g.security = '600570.SS'
    set_universe(g.security)
    
    # 设定想要归还的金额,例如 10000 元
    g.target_repay_amount = 10000.0

def handle_data(context, data):
    # 获取信用账户资产信息
    # get_margin_assert 返回一个字典,包含负债、保证金等信息
    margin_assets = get_margin_assert()
    
    if margin_assets is None:
        log.info("未获取到信用资产信息,请确认是否为两融账户。")
        return

    # 获取当前的融资合约金额(即融资负债总额)
    # fin_compact_balance: 融资合约金额
    current_debt = margin_assets.get('fin_compact_balance', 0.0)
    
    # 获取账户当前可用资金
    available_cash = context.portfolio.cash
    
    log.info("当前融资负债: %.2f, 当前可用现金: %.2f" % (current_debt, available_cash))
    
    # 只有当有负债时才进行还款操作
    if current_debt > 0:
        # 确定实际还款金额:
        # 1. 不超过设定的目标金额
        # 2. 不超过剩余负债总额
        # 3. 不超过当前可用现金
        actual_repay = min(g.target_repay_amount, current_debt, available_cash)
        
        # 如果计算出的还款金额大于0,则执行还款
        if actual_repay > 0:
            log.info("正在执行直接还款,金额: %.2f" % actual_repay)
            
            # 调用直接还款接口
            margincash_direct_refund(actual_repay)
        else:
            log.info("可用资金不足或无需还款。")
    else:
        log.info("当前无融资负债,无需还款。")

代码解析

  1. get_margin_assert():

    • 这是一个查询类函数,用于获取信用账户的资产详情。
    • 我们主要关注返回值中的 'fin_compact_balance' 字段,它代表当前的融资合约金额(即您欠券商的融资款)。
  2. context.portfolio.cash:

    • 获取当前账户里的可用资金。
  3. margincash_direct_refund(value):

    • 这是核心执行函数。
    • 参数: value (float),代表您要还款的金额。
    • 功能: 系统会直接扣除相应的现金来减少融资负债。

注意事项

  • 交易环境: 该函数仅在两融交易模块(实盘或仿真两融)中可用,普通股票账户无法使用。
  • 还款规则: 券商通常采用“先借先还”或“按合约归还”的规则。margincash_direct_refund 通常是按照券商默认的顺序(如归还最早到期的合约)进行还款。
  • 金额限制: 请确保传入的还款金额不超过您的可用资金,否则可能会导致委托失败或报错。
  • 执行频率: 在 handle_data 中调用意味着每个周期(如每天或每分钟)都会尝试执行。如果您只想执行一次,建议使用全局变量(如 g.has_repaid)来控制状态,或者在 run_daily 指定的时间点执行。

Q&A

Q: margincash_direct_refundmargincash_close 有什么区别?
A: margincash_direct_refund直接还款,即用账户里的现金还钱,不涉及卖股票。而 margincash_close卖券还款,即卖出持仓的股票,用卖出所得的资金来还钱。

Q: 如果我想还清所有负债,代码怎么写?
A: 您可以将 actual_repay 的计算逻辑修改为 min(current_debt, available_cash),这样就会尝试用所有可用现金去覆盖负债,直到还清或现金用完。

Q: 这个函数能用来还融券(借股票)的负债吗?
A: 不能。margincash_direct_refund 仅用于归还融资(借钱)的负债。如果您想归还融券负债(借股票),需要使用 marginsec_direct_refund(直接还券,需要您持有相应的股票)或 marginsec_close(买券还券)。

Q: 调用这个函数后,负债是马上更新吗?
A: 委托发出后通常会立即报送柜台,但 get_margin_assert() 获取的数据可能有几秒钟的延迟。建议在下一笔交易或下一个时间切片再查询确认负债是否减少。