3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在进行量化投资组合优化时,流动性管理是非常关键的一环。如果大额订单占标的股票日均成交量的比例过高,不仅容易产生较大的市场滑点,还可能无法完全成交。JoinQuant(聚宽)平台提供了 portfolio_optimizer 模块,其中的 LiquidityBound 函数可以帮助我们限制组合中单只标的的买入数量不超过其历史平均成交量的一定比例。
LiquidityBound 是 JoinQuant 组合优化器中的边界限制函数(Bound),用以对组合中单个标的的权重或购买数量进行流动性约束。
LiquidityBound(limit, capital, count=1, subset=None)
limit: 成交量百分比限制(例如 0.5 表示交易量不超过历史平均成交量的 50%)。capital: 当前可用资金总额(单位:元)。count: 参考前几个交易日的平均成交量,默认为 1。subset: 股票代码列表,指定仅对哪些股票生效;若为 None,则对传入优化器的所有股票生效。在实际交易中,大型股流动性好,可能不需要特殊的流动性限制;而小盘股或小众 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("组合优化失败!")
Bound(如全局 Bound(0, 0.3) 与 LiquidityBound),优化器会对同一只股票的权重上限取所有 Bound 中的最小值,下限取最大值。capital 参数精度:capital 需传入当前实际可用于配置的资产总额(例如 context.portfolio.total_value),确保优化器能将成交量限制精准换算为权重限制。count 参数会参考前 N 个交易日的历史成交量,需确保优化发生的日期(context.previous_date)之前有足够的历史交易数据。