问题描述
解决方案
在聚宽(JoinQuant)的融资融券账户中,查询当前的可用保证金余额,需要通过访问 context.subportfolios 对象中的 available_margin 属性来实现。
以下是具体的实现步骤和代码示例:
核心步骤
- 初始化账户类型:在
initialize函数中,必须使用set_subportfolios将账户类型设置为'stock_margin'(融资融券账户)。如果不设置,默认是普通股票账户('stock')。 - 获取属性:在策略运行过程中(如
handle_data或定时函数中),通过context.subportfolios[账户索引].available_margin获取数值。
代码示例
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 1. 设定初始资金
init_cash = 100000
# 2. 重要:必须将账户类型设定为 'stock_margin' (融资融券账户)
# 如果不设置,默认为 'stock',无法进行融资融券操作
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='stock_margin')])
# 开启真实价格模式(建议)
set_option('use_real_price', True)
# 每天开盘时运行查询
run_daily(check_margin, '09:30')
def check_margin(context):
# 3. 获取融资融券账户对象
# 如果您只设置了一个账户,索引通常为 0
margin_account = context.subportfolios[0]
# 4. 获取可用保证金余额
# available_margin: 融资融券可用保证金
current_available_margin = margin_account.available_margin
# 获取可用现金 (注意区分:available_cash 是账户里的现金余额,available_margin 是计算了杠杆后的可用保证金)
current_cash = margin_account.available_cash
# 打印日志
log.info("当前账户可用现金: %.2f" % current_cash)
log.info("当前融资融券可用保证金: %.2f" % current_available_margin)
def handle_data(context, data):
pass
关键属性说明
-
context.subportfolios[i].available_margin:- 含义:融资融券可用保证金。
- 用途:这是您在开立融资(买入)或融券(卖出)仓位时,系统用来判断您是否有足够资金作为保证金的依据。
- 计算逻辑:通常等于
现金 + 担保品折算价值 - 已占用保证金(具体计算受交易所规则及聚宽回测引擎逻辑影响)。
-
context.subportfolios[i].available_cash:- 含义:账户内的可用现金余额。
- 区别:
available_cash是实打实的钱,而available_margin包含了担保品折算后的购买力。
常见问题 (Q&A)
Q1: 为什么我获取到的 available_margin 和 available_cash 一样?
A: 这通常发生在您没有持仓(没有担保品)且没有负债的情况下。此时可用保证金主要由现金构成。如果您持有股票作为担保品,available_margin 通常会高于 available_cash。
Q2: 如果我不调用 set_subportfolios 设置为 stock_margin 会怎样?
A: 默认账户类型为 stock(普通股票账户)。普通账户不支持融资融券交易,且其 available_margin 属性可能无法正确反映融资融券的逻辑,或者在调用融资融券专用API(如 margincash_open)时会报错。
Q3: 如何查询当前的维持担保比例?
A: 可以通过 context.subportfolios[i].maintenance_margin_rate 获取当前的维持担保比例。