问题描述
解决方案
在聚宽(JoinQuant)中,获取融资融券账户的总负债和净资产,主要通过 context.portfolio 或 context.subportfolios 对象来实现。
核心步骤
- 初始化账户:必须在
initialize函数中将账户类型设置为stock_margin(融资融券账户)。如果不设置,默认为普通股票账户,无法进行融资融券操作。 - 获取数据:
- 总负债:使用
context.portfolio.total_liability - 净资产:使用
context.portfolio.net_value
- 总负债:使用
代码实现
以下是一个完整的策略示例,展示了如何初始化融资融券账户并在每日交易中打印总负债和净资产。
# -*- coding: utf-8 -*-
from jqdata import *
def initialize(context):
# 1. 设定基准
set_benchmark('000300.XSHG')
# 2. 开启动态复权模式(真实价格)
set_option('use_real_price', True)
# 3. 【关键步骤】初始化融资融券账户
# 获取初始资金
init_cash = context.portfolio.starting_cash
# 设定账户类型为 'stock_margin'
set_subportfolios([SubPortfolioConfig(cash=init_cash, type='stock_margin')])
# 每日打印账户信息
run_daily(print_account_info, time='every_bar')
def print_account_info(context):
# 获取账户对象(如果是单账户模式,context.portfolio 指向 context.subportfolios[0])
account = context.portfolio
# --- 获取核心数据 ---
# 1. 获取总负债 (融资负债 + 融券负债 + 利息总负债)
total_liability = account.total_liability
# 2. 获取净资产 (总资产 - 总负债)
net_value = account.net_value
# 3. 获取总资产 (现金 + 证券市值)
total_value = account.total_value
# 4. 获取可用资金
available_cash = account.available_cash
# --- 打印日志 ---
log.info("=" * 30)
log.info("【账户资金概览】")
log.info(f"总资产 (Total Value): {total_value:.2f}")
log.info(f"总负债 (Total Liability): {total_liability:.2f}")
log.info(f"净资产 (Net Value): {net_value:.2f}")
log.info(f"可用资金 (Available Cash): {available_cash:.2f}")
# 如果需要更细分的负债信息:
# log.info(f"融资负债: {account.cash_liability}")
# log.info(f"融券负债: {account.sec_liability}")
# log.info(f"利息负债: {account.interest}")
字段详解
在 context.portfolio(或 context.subportfolios[i])对象中,相关的属性定义如下:
| 属性名 | 中文含义 | 说明 |
|---|---|---|
total_liability |
总负债 | 等于 cash_liability (融资负债) + sec_liability (融券负债) + interest (利息总负债) 的总和。 |
net_value |
净资产 | 等于 total_value (总资产) 减去 total_liability (总负债)。 |
cash_liability |
融资负债 | 向券商借入资金买入股票产生的负债金额。 |
sec_liability |
融券负债 | 向券商借入证券卖出产生的负债金额。 |
interest |
利息总负债 | 融资融券产生的累计未还利息。 |
maintenance_margin_rate |
维持担保比例 | (现金+信用证券账户内证券市值) / (融资买入金额+融券卖出证券数量×当前市价+利息及费用总和)。 |
常见问题 Q&A
Q1: 为什么我获取到的 total_liability 一直是 0?
A: 可能有两个原因:
- 您没有在
initialize中使用set_subportfolios将账户类型 (type) 设置为'stock_margin'。普通股票账户没有融资融券负债。 - 您还没有进行融资(
margincash_open)或融券(marginsec_open)操作,因此没有产生负债。
Q2: 如果我有多个子账户(例如一个股票账户,一个期货账户),如何获取特定账户的负债?
A: 如果使用了多账户,context.portfolio 是所有账户的汇总。要获取特定账户的信息,请访问 context.subportfolios 列表。
例如,如果您将融资融券账户设置在第二个位置(索引为1):
# 获取第二个子账户的负债
margin_liability = context.subportfolios[1].total_liability
Q3: 净资产(Net Value)和总资产(Total Value)有什么区别?
A:
- 总资产 (
total_value):您账户里所有的钱加上股票的市值。它不扣除您借来的钱。 - 净资产 (
net_value):属于您自己的真实资产。计算公式为:总资产 - 总负债。在没有负债的情况下,两者相等;在有融资融券负债时,净资产更能反映您的真实盈亏情况。