【问题标题】:Calculation of floating weights based on weight and return DataFrame根据权重计算浮动权重并返回DataFrame
【发布时间】:2022-01-16 04:17:39
【问题描述】:

我有两个DataFramesreturnsweights 我尝试将它们组合成 floating_weights DataFrame。这背后的想法是我想在t 期间动态调整权重,并在t-1 期间返回。因此,如果有正回报,则权重会增加,反之亦然。

这里我创建了一个简单的例子:

weights:
    Dates       01K W   02K W   03K W   04K W
0   2021-01-01  0.0     0.2     0.3     0.5
1   2021-01-02  0.0     0.2     0.3     0.5
2   2021-01-03  0.5     0.2     0.3     0.0
3   2021-01-04  0.5     0.2     0.3     0.0
4   2021-01-05  0.5     0.0     0.2     0.3
5   2021-01-06  0.5     0.0     0.2     0.3


returns:
Dates           01K W   02K W   03K W   04K W
0   2021-01-01  0.01    0.01    -0.03   0.05
1   2021-01-02  -0.02   0.02    0.04    -0.02
2   2021-01-03  0.03    -0.03   0.01    -0.02
3   2021-01-04  -0.03   0.01    0.02    0.01
4   2021-01-05  0.02    0.02    0.01    0.01
5   2021-01-06  0.01    -0.01   0.03    0.02

floating_weightsDataFrame 是根据上一期收益调整的正常权重:

floating_weights (2021-01-01, 02K W):0.2(以正常重量开始)

floating_weights (2021-01-02, 02K W):0.202 = 0.2 * (1+0.01)

floating_weights (2021-01-03, 02K W):0.206 = 0.2 * (1+0.01) * (1+0.02)

floating_weights (2021-01-04, 02K W):0.19986 = 0.2 * (1+0.01) * (1+0.02) * (1-0.03)

floating_weights 看起来像这样。

    Dates       01K W   02K W   03K W   04K W
0   2021-01-01  0.0000  0.20000 0.30000 0.500
1   2021-01-02  0.0000  0.20200 0.29100 0.525
2   2021-01-03  0.5000  0.20604 0.30264 0.000
3   2021-01-04  0.5150  0.19986 0.30567 0.000
4   2021-01-05  0.4995  0.00000 0.20785 0.300
5   2021-01-06  0.5095  0.00000 0.20993 0.303

为了重现性:

import pandas as pd
returns = pd.DataFrame({
    'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06'],
    '01K W':[0.01, -0.2, 0.03, -0.03, 0.02, 0.01], 
    '02K W':[0.01, 0.02, -0.03, 0.01, 0.02, -0.01], 
    '03K W':[-0.03, 0.04, 0.01, 0.02, 0.01, 0.03], 
    '04K W':[0.05, -0.02, -0.02, 0.01, 0.01, 0.02]}) 
returns = returns.set_index('Dates')

weights = pd.DataFrame({
    'Dates':['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04', '2021-01-05', '2021-01-06'],
    '01K W':[0, 0, 0.5, 0.5, 0.5, 0.5], 
    '02K W':[0.2, 0.2, 0.2, 0.2, 0, 0], 
    '03K W':[0.3, 0.3, 0.3, 0.3, 0.2, 0.2], 
    '04K W':[0.5, 0.5, 0, 0, 0.3, 0.3]}) 
weights = weights.set_index('Dates')

非常感谢您的帮助!

【问题讨论】:

    标签: python pandas dataframe back-testing


    【解决方案1】:

    我们可以使用cumprod 计算累积收益,然后shiftmultiplyweights 数据框的累积收益得到所需的结果

    r = returns.add(1).cumprod().shift()
    floating_weights = weights.mul(r, fill_value=1)
    

    如果您想在每次将权重分配为零时重置cumprod,在这种情况下,我们必须单独考虑每一列

    floating_weights = weights.copy()
    
    for col in weights:
        g = weights[col].eq(0).cumsum()
        r = returns[col].add(1).groupby(g).cumprod()
        floating_weights[col] = weights[col].mul(r.shift(1), fill_value=1)
    

    >>> floating_weights
    
                   01K W     02K W     03K W  04K W
    Dates                                          
    2021-01-01  0.000000  0.200000  0.300000  0.500
    2021-01-02  0.000000  0.202000  0.291000  0.525
    2021-01-03  0.500000  0.206040  0.302640  0.000
    2021-01-04  0.515000  0.199859  0.305666  0.000
    2021-01-05  0.499550  0.000000  0.207853  0.300
    2021-01-06  0.509541  0.000000  0.209932  0.303
    

    【讨论】:

    • 这是一个很好的解决方案!来自我的 +1
    • 非常感谢您的解决方案!有没有一种简单的方法可以确保我们总是从“01K W”列中的初始重量开始?这样 cumprod() 在我们获得分配权重时开始,并在权重再次为零时结束。
    • @fjurt 不确定我是否理解,请您详细说明一下?
    • @fjurt 感谢您的解释。我已经编辑了答案。
    • @fjurt 编码愉快!您能否编辑您的问题以使 Dates 列成为两个数据框中的默认索引?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多