问题描述
解决方案
在 JoinQuant 聚宽平台中,获取当前账户的总负债金额(包含融资、融券及利息),可以通过访问 context.portfolio 对象下的 total_liability 属性来实现。
以下是具体的获取方式和属性说明:
1. 获取总负债金额
直接使用 context.portfolio.total_liability 即可获取总负债。
def handle_data(context, data):
# 获取账户总负债
total_debt = context.portfolio.total_liability
print(f"当前账户总负债: {total_debt}")
2. 获取负债的详细组成
如果您需要分别获取融资负债(借钱)和融券负债(借币/借券),可以使用以下属性:
- 融资负债:
context.portfolio.cash_liability - 融券负债:
context.portfolio.sec_liability - 利息负债:
context.portfolio.interest
关系公式:
$$ \text{total_liability} = \text{cash_liability} + \text{sec_liability} + \text{interest} $$
3. 代码示例
以下是一个完整的示例,展示如何在策略中打印这些信息:
def handle_data(context, data):
# 获取各项负债数据
portfolio = context.portfolio
# 总负债
total_liab = portfolio.total_liability
# 融资负债 (借入资金)
cash_liab = portfolio.cash_liability
# 融券负债 (借入标的证券的价值)
sec_liab = portfolio.sec_liability
# 需偿还的利息
interest_liab = portfolio.interest
log.info(f"总负债: {total_liab}")
log.info(f"其中 -> 融资负债: {cash_liab}, 融券负债: {sec_liab}, 利息负债: {interest_liab}")
注意事项
- 账户类型:要产生负债,您的策略必须初始化为融资融券账户。需要在
initialize函数中设置:def initialize(context): # 设定账户类型为 'stock_margin' (融资融券) set_subportfolios([SubPortfolioConfig(cash=context.portfolio.starting_cash, type='stock_margin')]) - 多仓位情况:如果您使用了
set_subportfolios设置了多个子账户,context.portfolio通常指向汇总信息或默认的第一个仓位。如果需要获取特定子账户的负债,请使用context.subportfolios[i].total_liability(其中i为子账户索引)。
Q&A
Q: 为什么我的 total_liability 一直是 0?
A: 这通常有两个原因:
- 您没有进行融资(借钱买入)或融券(卖出借来的股票)操作。
- 您的账户类型默认为
stock(普通股票账户),普通账户无法进行融资融券。请检查initialize中是否使用set_subportfolios将类型设置为stock_margin。
Q: sec_liability(融券负债)是按什么价格计算的?
A: 融券负债是根据您借入证券的当前市值计算的。如果股价上涨,您的融券负债金额也会相应增加(因为您需要花更多的钱买回股票还券),这体现了做空的风险。
Q: total_liability 包含交易佣金吗?
A: 不包含。total_liability 主要包含融资融券的本金和累计的利息(interest)。交易佣金在交易发生时直接从可用资金(available_cash)中扣除。