问题描述
请教一个问题,为什么get_mtss这个函数只获得融券量,而不是金额?
解决方案
为什么 get_mtss 函数返回的是融券量而不是金额?
在 JoinQuant(聚宽)量化平台中,使用 get_mtss 函数获取融资融券数据时,你会发现融资相关的数据单位是“元”(金额),而融券相关的数据单位是“股”(数量)。这主要是由融券交易的本质以及交易所的数据披露规则决定的。
1. 融券交易的本质:借券还券
- 融资(Margin Trading):本质是借钱买股。你向券商借入的是资金(人民币),因此你的负债是以“金额”来计量的。所以
fin_value(融资余额)、fin_buy_value(融资买入额)等字段的单位都是元。 - 融券(Short Selling):本质是借股卖出。你向券商借入的是特定数量的股票标的,将来你需要买入相同数量的该股票归还给券商。因为股票的价格是实时波动的,你借入的这批股票的“市值金额”每天都在变,但你欠券商的“股票数量”是固定的。因此,以“股数(量)”来计量融券负债是最准确的。
2. 交易所的数据披露标准
get_mtss 函数底层调用的数据来源于沪深交易所每日盘后公布的融资融券交易明细。根据交易所的披露标准:
- 融资披露:融资买入额、融资偿还额、融资余额(单位:元)。
- 融券披露:融券卖出量、融券偿还量、融券余量(单位:股/份)。
聚宽的 API 忠实地还原了交易所的原始数据口径,因此 sec_value(融券余量)、sec_sell_value(融券卖出量)等字段的单位都是股。
如何在策略中计算“融券金额”?
如果你在量化策略中需要评估当前融券的市值(即融券金额),你可以通过融券余量乘以该股票的最新收盘价来动态计算。
Python 代码示例
以下是一个在聚宽研究环境或回测中计算融券金额的示例:
from jqdata import *
def get_short_selling_value(security, date):
"""
计算指定日期某只股票的融券余额(金额)
"""
# 1. 获取融券余量 (单位:股)
mtss_data = get_mtss(security, end_date=date, count=1, fields=['sec_value'])
if mtss_data.empty:
return 0.0
sec_volume = mtss_data['sec_value'].iloc[0]
# 2. 获取该股票在指定日期的收盘价 (单位:元)
# 注意:为了准确计算市值,通常使用不复权价格或前复权价格,这里以获取当日收盘价为例
price_data = get_price(security, end_date=date, count=1, frequency='daily', fields=['close'], fq=None)
if price_data.empty:
return 0.0
close_price = price_data['close'].iloc[0]
# 3. 计算融券金额 = 融券余量 * 收盘价
short_value = sec_volume * close_price
return short_value
# 测试:获取平安银行在 2023-10-10 的融券金额估算值
security_code = '000001.XSHE'
target_date = '2023-10-10'
value = get_short_selling_value(security_code, target_date)
print(f"{security_code} 在 {target_date} 的融券余量市值为: {value:.2f} 元")
总结
get_mtss 返回融券量(股)是符合金融逻辑和交易所规范的。在实际量化建模中,如果需要用到金额,只需结合 get_price 获取同期价格进行乘积换算即可。