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

joinquant 平台如何利用 LiquidityBound 对特定股票限制成交量?(附 Python 示例代码)

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

问题描述

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

Title: joinquant 组合优化进阶:利用 LiquidityBound 对特定股票做成交量限制

Question: 在 joinquant 的投资组合优化中,如何对部分股票设置单日成交量占比上限?

解决方案

JoinQuant 组合优化进阶:利用 LiquidityBound 对特定股票做成交量限制

在进行量化投资组合优化时,流动性管理是非常关键的一环。如果大额订单占标的股票日均成交量的比例过高,不仅容易产生较大的市场滑点,还可能无法完全成交。JoinQuant(聚宽)平台提供了 portfolio_optimizer 模块,其中的 LiquidityBound 函数可以帮助我们限制组合中单只标的的买入数量不超过其历史平均成交量的一定比例。


1. 什么是 LiquidityBound?

LiquidityBound 是 JoinQuant 组合优化器中的边界限制函数(Bound),用以对组合中单个标的的权重或购买数量进行流动性约束。

参数说明:

LiquidityBound(limit, capital, count=1, subset=None)
  • limit: 成交量百分比限制(例如 0.5 表示交易量不超过历史平均成交量的 50%)。
  • capital: 当前可用资金总额(单位:元)。
  • count: 参考前几个交易日的平均成交量,默认为 1
  • subset: 股票代码列表,指定仅对哪些股票生效;若为 None,则对传入优化器的所有股票生效。

2. 如何针对『特定股票』设置流动性限制?

在实际交易中,大型股流动性好,可能不需要特殊的流动性限制;而小盘股或小众 ETF 容易受到大额订单冲击,可以通过 subset 参数专门指定这些标的。

示例代码

下面的策略示例展示了如何在月度调仓时,对特定小盘股票设置不超过前5日平均成交量 25% 的流动性约束:

import pandas as pd
from jqdata import *
from jqlib.optimizer import *

def initialize(context):
    set_benchmark('000300.XSHG')
    set_option('use_real_price', True)
    
    # 设定期货/股票手续费
    set_order_cost(OrderCost(close_tax=0.001, open_commission=0.0003, close_commission=0.0003, min_commission=5), type='stock')
    
    # 定时按月调仓
    run_monthly(rebalance, monthday=1, time='09:30', reference_security='000300.XSHG')

def rebalance(context):
    # 假设待优化的股票池
    securities = ['000001.XSHE', '000002.XSHE', '300001.XSHE', '300002.XSHE']
    
    # 假设我们只想对 300001.XSHE 和 300002.XSHE 这两只创业板股票做流动性限制
    restricted_subset = ['300001.XSHE', '300002.XSHE']
    
    # 获取账户当前总资产
    capital = context.portfolio.total_value
    
    # 设定边界条件
    bounds = [
        # 全局单标的权重范围限制为 0% ~ 30%
        Bound(0.0, 0.3),
        # 仅对 restricted_subset 中的股票设置:购买量不超过前5日平均成交量的 25%
        LiquidityBound(limit=0.25, capital=capital, count=5, subset=restricted_subset)
    ]
    
    # 组合风险最小化目标
    target = MinVariance(count=250)
    
    # 执行组合优化
    optimized_weight = portfolio_optimizer(
        date=context.previous_date,
        securities=securities,
        target=target,
        constraints=[WeightConstraint(low=0.9, high=1.0)],
        bounds=bounds,
        return_none_if_fail=True
    )
    
    if optimized_weight is not None:
        print("优化后的组合权重:")
        print(optimized_weight)
        # 根据优化权重调整仓位
        for stock, weight in optimized_weight.items():
            target_value = capital * weight
            order_target_value(stock, target_value)
    else:
        print("组合优化失败!")

3. 注意事项

  1. 多个 Bound 取交集:如果设置了多个 Bound(如全局 Bound(0, 0.3)LiquidityBound),优化器会对同一只股票的权重上限取所有 Bound 中的最小值,下限取最大值。
  2. capital 参数精度capital 需传入当前实际可用于配置的资产总额(例如 context.portfolio.total_value),确保优化器能将成交量限制精准换算为权重限制。
  3. 数据依赖count 参数会参考前 N 个交易日的历史成交量,需确保优化发生的日期(context.previous_date)之前有足够的历史交易数据。