3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在量化投资与组合优化中,针对大资金策略或小盘股交易,控制单只股票的买入金额不超过其总市值的特定比例是极其关键的流动性风控手段。JoinQuant(聚宽)平台提供了 CapBound 边界函数,可以在使用 portfolio_optimizer 进行投资组合优化时,轻松设置标的金额的市值占比上限。
CapBound 用于对组合中单只标的的购买金额进行市值百分比限制,确保策略不会因持仓过大而产生严重的流动性风险或引发过度冲击成本。
CapBound(limit, capital, count=1, subset=None)
limit (float): 市值百分比限制上限(例如 0.025 代表购买金额不超过总市值的 2.5%)。capital (float): 当前账户的总可用资金或拟投资本金(如 100000000)。count (int, 默认 1): 计算平均市值时向前参考的交易日天数。subset (list, 默认 None): 限制作用的股票代码列表。若为 None,则股票池中的所有股票均须满足此限制。以下示例展示了如何在聚宽策略中,利用 portfolio_optimizer 结合 CapBound 限制单股买入金额不超过总市值的 2.5%:
import pandas as pd
from jqdata import *
from jqlib.optimizer import *
def initialize(context):
# 设置基准与真实价格模式
set_benchmark('000300.XSHG')
set_option('use_real_price', True)
# 定时按月调仓
run_monthly(rebalance, monthday=1, time='09:30')
def rebalance(context):
# 设定候选股票池(例如上证50成分股)
securities = get_index_stocks('000016.XSHG')[:20]
# 获取当前账户资产金额
current_capital = context.portfolio.total_value
# 设置市值占比边界:限制购买金额不超过标的总市值的 2.5%
# 针对部分特定股票设置流动性风控限制
cap_bound = CapBound(limit=0.025, capital=current_capital, count=5, subset=securities)
# 运行组合优化器:目标为最小化组合方差
optimized_weight = portfolio_optimizer(
date=context.previous_date,
securities=securities,
target=MinVariance(count=250),
constraints=[WeightConstraint(low=0.9, high=1.0)],
bounds=[cap_bound, Bound(low=0.0, high=0.1)], # 同时叠加单股最大权重10%的限制
default_port_weight_range=[0.0, 1.0],
return_none_if_fail=True
)
# 按照优化权重调仓
if optimized_weight is not None:
for stock, weight in optimized_weight.items():
target_value = current_capital * weight
order_target_value(stock, target_value)
else:
log.warn("组合优化失败,保持当前持仓")
CapBound 限制的是总市值占比,若需限制日均成交量占比,建议配合使用 LiquidityBound(limit, capital, count),实现全方位的流动性风控。bounds(如 Bound 和 CapBound)时,优化器会自动取所有边界限制中上限的最小值与下限的最大值作为最终约束。CapBound 的 capital 参数建议传入当前策略的最新总权益(context.portfolio.total_value)或拟调配资金,确保计算出的占比权重精准无误。