融资融券函数

融资融券(两融)让策略可以加杠杆和做空。PTrade 的两融 API 是独立的一组函数,业务类型必须选「融资融券」(get_business_type() 返回 'rzrq')。本章按「担保品 → 融资 → 融券 → 还款还券 → 查询」的顺序梳理。

两融交易的基本概念

两融账户里你以担保品(自有资金和证券)做抵押,向券商借(融资)买入或借(融券)卖出。对应操作:

操作含义函数
担保品买入/卖出用自有资金买卖,计入担保物margin_trade
融资买入借钱买券,形成融资负债margincash_open
卖券还款卖券归还融资负债margincash_close
融券卖出借券卖出,形成融券负债marginsec_open
买券还券买券归还融券负债marginsec_close
直接还款用现金直接还融资margincash_direct_refund
直接还券用持仓券直接还融券marginsec_direct_refund

所有两融函数仅在 PTrade 客户端 + 两融交易模块可用(margincash_direct_refund 等仅交易,不支持回测;担保品买卖和融资/融券买卖支持两融回测)。

一、担保品买卖:margin_trade

margin_trade(security, amount, limit_price=None, market_type=None)
  • amount 正数买入、负数卖出。
  • limit_pricemarket_type 都不传时按最新价限价委托;上证股票用市价委托时 limit_price 作为保护限价(必传)。
margin_trade('600570.SS', 100)                            # 最新价买 100
margin_trade('600570.SS', 100, limit_price=46)            # 限价 46 买
margin_trade('600570.SS', 100, limit_price=46, market_type=1)  # 保护限价市价

二、融资买入:margincash_open

借钱买入证券,形成融资负债:

margincash_open(security, amount, limit_price=None,
                market_type=None, cash_group=None)
  • amount正数(只买不卖)。
  • cash_group:头寸性质,1 普通头寸(默认)、2 专项头寸。
amount = get_margincash_open_amount('600570.SS').get('600570.SS')
margincash_open('600570.SS', amount)

三、卖券还款:margincash_close

卖出证券并以所得资金归还融资负债:

margincash_close(security, amount, limit_price=None,
                 market_type=None, cash_group=None)

amount 正数表示卖出数量。

四、融券卖出:marginsec_open

借券卖出(做空),形成融券负债:

marginsec_open(security, amount, limit_price=None, cash_group=None)
marginsec_open('600030.SS', 100)   # 融券卖出 100 股中信证券

五、买券还券:marginsec_close

买入证券归还此前融券卖出的负债:

marginsec_close(security, amount, limit_price=None,
                market_type=None, cash_group=None)

六、直接还款 / 还券

不经过卖出,直接用现金或持仓券平负债:

# 直接还款:用现金归还融资
margincash_direct_refund(value, cash_group=None)

# 直接还券:用持仓证券归还融券
marginsec_direct_refund(security, amount, cash_group=None)
# 还清全部融资负债
balance = get_margin_asset().get('fin_compact_balance')
margincash_direct_refund(balance)

七、查询函数

函数含义
get_margincash_stocks()可融资标的列表
get_marginsec_stocks()可融券标的列表
get_assure_security_list()担保券列表
get_margincash_open_amount(security, price=None, cash_group=None)融资最大可买数量
get_margincash_close_amount(...)卖券还款最大可卖数量
get_marginsec_open_amount(...)融券最大可卖数量
get_marginsec_close_amount(...)买券还券最大可买数量
get_margin_entrans_amount(security, cash_group=None)现券还券数量
get_margin_asset()信用资产(担保资产、负债总额、可用保证金、融资/融券额度)
get_margin_contract(compact_source=None)合约明细 DataFrame
get_margin_contractreal()实时合约流水 DataFrame
get_enslo_security_info(cash_group=None)融券标的详情(保证金比例、可用数量、状态)
get_crdt_fund(cash_group=None)可融资金信息

get_margin_asset() 返回的字典是最常用的风控依据,关键字段:

字段含义
assure_asset担保资产总值
total_debit负债总额
enable_bail_balance可用保证金
fin_max_quota / fin_enable_quota / fin_used_quota融资额度上限 / 可用 / 已用
slo_enable_quota融券可用额度
fin_compact_balance融资合约金额
def handle_data(context, data):
    asset = get_margin_asset()
    if asset.get('fin_enable_quota', 0) > 100000:
        margincash_open('600570.SS', 1000)
    if asset.get('total_debit', 0) / asset.get('assure_asset', 1) > 2.5:
        log.warning('维持担保比例偏低,注意风险')

八、一个两融双均线示例

def initialize(context):
    g.security = '600570.SS'
    set_universe(g.security)

def before_trading_start(context, data):
    g.buy_flag = False
    g.sell_flag = False

def handle_data(context, data):
    df = get_history(10, '1d', 'close', g.security)
    ma5  = df['close'][-5:].mean()
    ma10 = df['close'][-10:].mean()
    if ma5 > ma10 and not g.buy_flag:
        amount = get_margincash_open_amount(g.security).get(g.security, 0)
        if amount:
            margincash_open(g.security, amount)
            g.buy_flag = True
    elif ma5 < ma10 and get_position(g.security).amount > 0 and not g.sell_flag:
        amount = get_margincash_close_amount(g.security).get(g.security, 0)
        if amount:
            margincash_close(g.security, amount)
            g.sell_flag = True

小结

  • 担保品买卖用 margin_trade;加杠杆用 margincash_open / marginsec_open;平负债用对应的 closedirect_refund
  • 下单前先用 get_margincash_open_amount 等查额度,避免委托超出可用。
  • 风控看 get_margin_asset() 的维持担保比例(担保资产 ÷ 负债总额)。下一步做回测验证:策略回测