🚀 AI 一键生成 joinquant 策略代码
立即体验

joinquant 平台如何使用 CapBound 限制单股买入金额不超过总市值比例?

joinquant | 发布时间: 2026/7/29
以下内容由 EasyQuant 生成。

问题描述

请根据以下 SEO 主题生成完整页面内容:

Title: joinquant 组合优化流动性风控:CapBound 市值占比限制设置

Question: 在 joinquant 中如何使用 CapBound 限制单个股票买入金额不超过其总市值的特定比例?

解决方案

joinquant 组合优化流动性风控:CapBound 市值占比限制设置

在量化投资与组合优化中,针对大资金策略或小盘股交易,控制单只股票的买入金额不超过其总市值的特定比例是极其关键的流动性风控手段。JoinQuant(聚宽)平台提供了 CapBound 边界函数,可以在使用 portfolio_optimizer 进行投资组合优化时,轻松设置标的金额的市值占比上限。


一、CapBound 概念与参数详解

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("组合优化失败,保持当前持仓")

三、风控与使用注意事项

  1. 结合流动性限制(LiquidityBound)CapBound 限制的是总市值占比,若需限制日均成交量占比,建议配合使用 LiquidityBound(limit, capital, count),实现全方位的流动性风控。
  2. 边界取值逻辑:当针对同一只股票设置多个 bounds(如 BoundCapBound)时,优化器会自动取所有边界限制中上限的最小值与下限的最大值作为最终约束。
  3. 资金参数对应CapBoundcapital 参数建议传入当前策略的最新总权益(context.portfolio.total_value)或拟调配资金,确保计算出的占比权重精准无误。