融资融券函数
融资融券(两融)让策略可以加杠杆和做空。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_price和market_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;平负债用对应的close或direct_refund。 - 下单前先用
get_margincash_open_amount等查额度,避免委托超出可用。 - 风控看
get_margin_asset()的维持担保比例(担保资产 ÷ 负债总额)。下一步做回测验证:策略回测。