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