案例简介
本案例将以S&P500指数为例,考虑多周期内的股票回报率和市场回报率,从股票池中选取股票来构建追踪市场指数的最优投资组合。本案例将在Python中调用杉数求解器COPT实现该问题的求解,并展示COPT建模中Indicator约束构建器和绝对值约束构建器。
案例重点
- 理论层面:基于金融领域的指数追踪模型,运用数学语言描述模型的三要素:变量、目标和约束,并抽象构建混合整数凸二次规划(MIQP)的数学模型;
- 代码实践:实践如何在Python中调用COPT建模求解相关的函数及辅助功能。
- 0-1变量在建模中的使用;
Model.addGenConstrAbs()
:添加形如 y=|ax+b|的绝对值约束;Model.addGenConstrIndicator()
:添加 If-Then 条件约束。
问题背景
在本案例背景中,指数/市场指数(Index/ Market Index)是由一系列股票、债券或其他资产的价格或收益构成的,这些资产覆盖了市场或行业内的主要公司,因此它是衡量金融市场或特定行业整体表现的一种重要工具。本案例选取的标准普尔500指数(S&P500指数)是由500家大型美国公司的股票组成,该指数覆盖了多个行业,是衡量美国股票市场健康状况的一个指标。
指数追踪是一种被动的投资策略,其目标是通过投资目标指数中的所有或部分成分股,来复制该指数的表现。指数追踪常见的实现方式包括“完全复制法”、“抽样复制法”、“合成复制法”:“完全复制法”指直接购买目标指数中的所有成分股,按相同权重进行配置;“抽样复制法”则是购买目标指数中的部分成分股;“合成复制法”指通过金融衍生工具而非直接持有成分股来实现指数追踪。因指数包含的成分股数量众多,通过"完全复制法"投资指数中所有的成分股需要较高的管理费用和交易成本,而"合成复制法"虽然能降低交易成本但增加了对衍生工具对手方的信用风险,"抽样复制法"可以降低交易成本和管理复杂性,但可能存在跟踪误差,因此使用数学模型选择成分股来减少对指数的跟踪误差尤为重要。
另外,股票交易时会产生再平衡成本(Rebalance Cost)。再平衡成本包括股票交易成本、买卖价差、市场冲击成本、税务成本、机会成本等。在大规模交易股票中产生的再平衡成本会对投资回报率和风险有显著影响,因此在构建数学模型选择部分成分股来构建投资组合时,应将符合场景的再平衡成本纳入考虑范畴。
问题描述
我们将通过构建混合整数二次规划数学模型来选择S&P500内的部分成分股追踪S&P500指数。指数的数值与其包含的各个成分股占比相关,占比越大的成分股对指数的影响越大。在S&P500内的503支股票中,按占比从高到低排序,前50支股票占59.62%。在本案例中,我们将选取占比较大的这50支股票作为股票池来提高模型的求解速度。
本案例中数学模型设定的目标为:在保证投资组合的预期回报率不小于市场的预期回报率(指数)的同时,最小化投资组合的预期回报率和市场的预期回报率的差的平方。同时,为考虑交易股票时产生的再平衡成本,我们将通过限制股票的换手率来控制再平衡成本。本案例使用的数据为在2020年12月31日~2023年12月31日底股票池中50支股票的月回报率和市场的月回报率。在实际应用中,投资者可以通过更换股票池中的股票和相对应的股票数据来追踪特定的指数。
数学模型
集合与参数定义
- S T O C K STOCK STOCK : 可选的股票集合,在此案例中我们选用S&P500中占比最大的前50支股票
- I N I T I A L INITIAL INITIAL : 初始的投资组合内股票选取情况的集合
- R E T U R N RETURN RETURN : 各股票在各周期的回报率的集合
- r e t u r n t , i return_{t, i} returnt,i : 股票i在周期t内的回报率,取值在[0,1]内
- r e t u r n t , S P return_{t, SP} returnt,SP : S&P500指数在周期t内的回报率,取值在[0,1]内
- i n i t i a l i initial_i initiali : 代表股票i是否在初始的投资组合中,取值为{0,1},如果在初始的投资组合中,值为1,否则为0
- N P E R I O D NPERIOD NPERIOD:周期数量,为整数,在此案例中为36个月
- N S T O C K NSTOCK NSTOCK : 可选的股票数量,为非负整数,在此案例中为50个股票
- N S E L E C T NSELECT NSELECT : 自定义的投资组合中的股票数量,为非负数整数
- T U R N R A T E TURNRATE TURNRATE : 自定义的换手率上限,取值在[0,1]之间
- U P _ B O U N D UP\_BOUND UP_BOUND: 自定义的投资组合中每种股票的最高占比比率(注:值不能小于 1 / N S E L E C T 1/NSELECT 1/NSELECT,同时需注意与 T U R N R A T E TURNRATE TURNRATE的关系,避免不可行解的情况)
决策变量
-
w i w_i wi : 股票i在投资组合中的占比,是一个连续变量,取值在[0,1]之间
-
z i z_i zi : 股票i是否在投资组合中被选取,是一个二元变量
z i ∈ { 0 , 1 } z_i \in \{0,1\} zi∈{0,1}z i = { 1 , 选择股票i 0 , 未选择股票i z_{i} = \begin{cases} 1, & \text{选择股票i}\\ 0, & \text{未选择股票i} \end{cases} zi={1,0,选择股票i未选择股票i
-
d u m m y _ a b s i dummy\_abs_i dummy_absi : 是一个辅助构建绝对值约束的辅助变量,是一个连续变量,无取值限制
数学形式
求解此问题的数学形式如下:
-
目标函数:
为最小化追踪误差,我们的目标函数是最小化多个周期内所选投资组合的预期回报率和市场回报率的差的平方:
M i n i m i z e ∑ t ∈ N P E R I O D ( ∑ i ∈ S T O C K r e t u r n t , i ⋅ w i − r e t u r n t , s p ) 2 / N P E R I O D Minimize \sum_{t \in NPERIOD} (\sum_{i \in STOCK} return_{t,i}\cdot w_i-return_{t,sp})^2 /NPERIOD Minimizet∈NPERIOD∑(i∈STOCK∑returnt,i⋅wi−returnt,sp)2/NPERIOD
- 约束条件:
- 所有股票在投资组合中的占比总和为1:
∑ i ∈ S T O C K w i = 1 \sum_{i \in STOCK} w_i = 1 i∈STOCK∑wi=1
- 选取的股票总数不超过自定义的投资组合中的股票数量:
∑ i ∈ S T O C K z i ≤ N S E L E C T \sum_{i \in STOCK} z_i \leq NSELECT i∈STOCK∑zi≤NSELECT
- 如果股票i未被选择,股票i在投资组合中的占比为0:
w i ≤ z i , ∀ i ∈ S T O C K w_i \le z_i, \hspace{1cm} \forall i \in STOCK wi≤zi,∀i∈STOCK
- 投资组合的月平均回报率需不少于市场的月平均回报率:
( ∑ t ∈ N P E R I O D ( ∑ i ∈ S T O C K r e t u r n t , i ⋅ w i ) ) / N P E R I O D ≥ ( ∑ t ∈ N P E R I O D r e t u r n t , s p ) / N P E R I O D (\sum_{t \in NPERIOD}(\sum_{i \in STOCK} return_{t,i}\cdot w_i))/NPERIOD \ge (\sum_{t \in NPERIOD}return_{t,sp})/NPERIOD (t∈NPERIOD∑(i∈STOCK∑returnt,i⋅wi))/NPERIOD≥(t∈NPERIOD∑returnt,sp)/NPERIOD
我们可以将此约束简化为:
∑
t
∈
N
P
E
R
I
O
D
(
∑
i
∈
S
T
O
C
K
r
e
t
u
r
n
t
,
i
⋅
w
i
)
≥
∑
t
∈
N
P
E
R
I
O
D
r
e
t
u
r
n
t
,
s
p
\sum_{t \in NPERIOD}(\sum_{i \in STOCK} return_{t,i}\cdot w_i)\ge \sum_{t \in NPERIOD}return_{t,sp}
t∈NPERIOD∑(i∈STOCK∑returnt,i⋅wi)≥t∈NPERIOD∑returnt,sp
-
考虑控制组合平衡成本,设置换手率的约束,由于一支股票的买进会对应另一支股票的卖出,我们需在更换股票的数量上除以2:
∑ i ∈ S T O C K ∣ z i − i n i t i a l i ∣ / 2 ≤ T U R N R A T E ⋅ N S E L E C T \sum_{i \in STOCK} |z_i - initial_i|/2 \le TURNRATE \cdot NSELECT i∈STOCK∑∣zi−initiali∣/2≤TURNRATE⋅NSELECT
在Python中添加模型时,我们可以使用辅助变量dummy_absi 将此约束转换为以下两个约束:
d u m m y _ a b s i = ∣ z i − i n i t i a l i ∣ , ∀ i ∈ S T O C K dummy\_{abs}_i = |z_i - initial_i|, \hspace{1cm} \forall i \in STOCK dummy_absi=∣zi−initiali∣,∀i∈STOCK∑ i ∈ S T O C K d u m m y _ a b s i ≤ 2 ⋅ T U R N R A T E ⋅ N S E L E C T \sum_{i \in STOCK} dummy\_abs_i \le 2 \cdot TURNRATE \cdot NSELECT i∈STOCK∑dummy_absi≤2⋅TURNRATE⋅NSELECT
通过以上建模分析后完整的数学模型如下:
Minimize ∑ t ∈ N P E R I O D ( ∑ i ∈ S T O C K r e t u r n t , i ⋅ w i − r e t u r n t , s p ) 2 / N P E R I O D \text{Minimize} \sum_{t \in NPERIOD} (\sum_{i \in STOCK} return_{t,i}\cdot w_i-return_{t,sp})^2 / NPERIOD\\ Minimizet∈NPERIOD∑(i∈STOCK∑returnt,i⋅wi−returnt,sp)2/NPERIOD
s.t. ∑ i ∈ S T O C K w i = 1 ∑ i ∈ S T O C K z i ≤ N S E L E C T w i ≤ z i , ∀ i ∈ S T O C K ∑ t ∈ N P E R I O D ( ∑ i ∈ S T O C K r e t u r n t , i ⋅ w i ) N P E R I O D ≥ ∑ t ∈ N P E R I O D r e t u r n t , s p N P E R I O D d u m m y _ a b s i = ∣ z i − i n i t i a l i ∣ , ∀ i ∈ S T O C K ∑ i ∈ S T O C K d u m m y _ a b s i ≤ 2 ⋅ T U R N R A T E ⋅ N S E L E C T \begin{aligned} \text{s.t.} \quad\quad\quad\quad\quad\quad\quad\quad \sum_{i \in STOCK} w_i &= 1\\ \sum_{i \in STOCK} z_i &\leq NSELECT\\ w_i &\le z_i, \hspace{1cm} \forall i \in STOCK\\ \frac{\sum_{t \in NPERIOD}(\sum_{i \in STOCK} return_{t,i}\cdot w_i)}{NPERIOD} &\ge \frac{\sum_{t \in NPERIOD}return_{t,sp}}{NPERIOD}\\ dummy\_{abs}_i &= |z_i - initial_i|, \hspace{1cm} \forall i \in STOCK\\ \sum_{i \in STOCK} dummy\_abs_i &\le 2 \cdot TURNRATE \cdot NSELECT\\ \end{aligned} s.t.i∈STOCK∑wii∈STOCK∑ziwiNPERIOD∑t∈NPERIOD(∑i∈STOCKreturnt,i⋅wi)dummy_absii∈STOCK∑dummy_absi=1≤NSELECT≤zi,∀i∈STOCK≥NPERIOD∑t∈NPERIODreturnt,sp=∣zi−initiali∣,∀i∈STOCK≤2⋅TURNRATE⋅NSELECT
z i ∈ { 0 , 1 } , ∀ i ∈ S T O C K w i ∈ [ 0 , 1 ] , ∀ i ∈ S T O C K d u m m y _ a b s i ∈ R , ∀ i ∈ S T O C K \begin{aligned} z_i \in \{0,1\}, &\hspace{1cm} \forall i \in STOCK\\ w_i \in [0,1], &\hspace{1cm} \forall i \in STOCK\\ dummy\_{abs}_i \in R, &\hspace{1cm} \forall i \in STOCK\\ \end{aligned} zi∈{0,1},wi∈[0,1],dummy_absi∈R,∀i∈STOCK∀i∈STOCK∀i∈STOCK
代码实现
以上数学模型的完整代码实现详见:COPT优化应用:指数追踪模型
参考资料
[1] Yahoo Finance - Stock Market Live, Quotes, Business & Finance News
[2] 《COPT用户手册文档》