技术分享 2025-02-11

正负数序列的归一化-基于投资组合管理的实践

对于同时含有正负数据的序列,如何进行归一化?

投资组合管理 归一化

如何对同时含有正负数的序列进行归一化?

本文主要讨论如何对同时含有正负数的序列进行归一化,基于投资组合管理的实践。

1. 问题背景

在资产组合管理中,我们需要对序列进行归一化,以保证组合的总价值。

比如,在一个端到端的agent学习场景中,agent接受的输入为(n,m,l)张量,表示n个证券,m个月,l个因子,使用神经网络f(tensor)来处理,输出一个(n+1)维的向量,表示n个证券 + 现金的决策。

假设总资产规模为 1,那么agent的输出向量(w1,w2,w3,...,wn,w0)需要满足w1+w2+w3+...+wn+w0=1,并且w1,w2,w3,...,wn,w0>=0

如果wi > 0,则非常方便,可以用softmax函数,或者\(\frac{e^{wi}}{\sum_{j=1}^{n+1} e^{wj}}\)来得到目标权重。

但是,如果允许wi < 0,就出现问题了。

2. 问题分析

2.1 序列类型

这是一个允许带有负数的序列,在某一次决策中,可能得到的序列有:

(0.1, 0.3, 0.2, 0.4)  # 只有正数   
(0.1, -0.2, 0.2, -0.3, 0.1)  # 正负数都有  
(-0.1, -0.2, -0.3, -0.1)   # 只有负数  
... 

金融含义

带有负数的序列,在金融领域中,通常表示允许做空/杠杆。

# 提供如下的权重序列  
# 其中,最后一项为现金权重,其余项为证券权重       
(0.1, -0.2, 0.4, -0.1)     

# 0.1,可以理解为将10%的资金买入证券1  
# -0.2,可以理解为做空当前资金20%的证券2  
# 0.4,可以理解为将40%的资金买入证券3  
# -0.1 现金项为负,表示需要杠杆借入10%的资金  

计算中,使用\(\sum_{i=1}^{n} return_i \times weight_i\)来计算各证券的收益,然后加总得到总收益。
如果权重为负,则收益反向,符合做空的语义。
如果现金的权重为负,则表示以无风险利率借入资金,符合杠杆的语义。

归一化目标

对于一个有正有负的序列,对其的归一化目标为:

1.所有权重和为1   
2.需要保证方向,输入的权重为负数,则输出仍需要是负数(表示做空)   

常见归一化问题

softmax归一化:
softmax的计算方式为\(\frac{e^{w_i}}{\sum_{i}^{n} e^{w_i}}\),其中\(w_i\)为输入的权重。 由于指数函数恒为正,对于任何输入,其输出都为正数,无法表示做空/杠杆。

线性归一化:
使用线性归一化,计算方式为\(\frac{w_i}{\sum_{i}^{n} w_i}\)
该方法有几个重要的缺陷,
1.在有正有负的序列,分母求和后可能为0,无法计算。
2.分母求和可能小于0,导致每一项w都被反转,不符合语义。

minmax归一化:
将序列进行平移,移动到正数区间,再进行归一化。
同样,输出都为正数。

线性归一化 + 分母绝对值求和:
计算方式为\(\frac{w_i}{\sum_{i}^{n} |w_i|}\)
可以保证方向,但是无法保证和为1

综上,上述方法都无法满足归一化目标。

3. 解决方案

为了解决这个问题,可以预先引入一个约束 + 一个极端情况处理

约束: 引入做空/杠杆的总额约束(如 -0.3,表示做空/杠杆的总额不超过总资金的 30%)     
极端情况处理: 如果输入序列为全负,应该将现金项修正为一个正数(如 1)     

算法: 两段式归一化:
1.先将负数部分归一化到和为做空/杠杆约束
2.再将剩余部分归一化到和为 1 - 做空/杠杆约束

# 例子,如下序列  
# 做空约束为 -0.1
(0.1, -0.2, 0.4, -0.1)   

1.先对负数部分进行归一化,使和等于 -0.1    
-0.2 -> -0.2 * [ -0.1 / (-0.2 + -0.1) ] = - 0.067
-0.1 -> -0.1 * [ -0.1 / (-0.2 + -0.1) ] = - 0.033

2.再对正数部分进行归一化,使和等于 1 - -0.1 = 1.1      
0.1 -> 0.1 * [ 1.1 / (0.1 + 0.4) ] = 0.22 
0.4 -> 0.4 * [ 1.1 / (0.1 + 0.4) ] = 0.88  

序列为 (-0.067, -0.033, 0.22, 0.88),总和为1   

如果序列为全负,如(-0.1, -0.2, -0.3, -0.1),则修正现金项为1,如(-0.1, -0.2, -0.3, 1),然后进行归一化。  

公式

记输入权重序列为 \(w_1, w_2, \ldots, w_n\),做空/杠杆约束为 \(c\)\(c \leq 0\),如 \(c = -0.1\) 表示做空总额不超过 10%)。定义:

  • 正权重下标集:\(\mathcal{I}^+ = \{ i : w_i > 0 \}\),负权重下标集:\(\mathcal{I}^- = \{ i : w_i < 0 \}\)
  • 正部之和:\(S^+ = \sum_{i \in \mathcal{I}^+} w_i\),负部之和:\(S^- = \sum_{i \in \mathcal{I}^-} w_i\)(故 \(S^- < 0\)
  • 零权重保持不变:若 \(w_i = 0\)\(w'_i = 0\)

两段式归一化后的权重为:

\[ w'_i = \begin{cases} \displaystyle w_i \cdot \frac{c}{S^-}, & i \in \mathcal{I}^- \\[8pt] \displaystyle w_i \cdot \frac{1 - c}{S^+}, & i \in \mathcal{I}^+ \end{cases} \]

解释:
1.使用两段式归一化,引入了约束,相当于预先保证了多头与空头部分的权重和为约束值
2.极端情况处理,一般来说,不应该出现全负的情况,此时表示做空所有证券的前提下还借入资金,与现实情况不符合(即便是需要控制波动率,该情况也不合实际),如果做空所有的证券,应该将资金用于无风险资产,获取无风险收益。此时,将现金项设置为任意一个正数,都可以归一化到 1 - 约束值 的仓位。