Python 为什么不';这些Beta不匹配吗?

Python 为什么不';这些Beta不匹配吗?,python,python-3.x,linear-regression,statsmodels,quantitative-finance,Python,Python 3.x,Linear Regression,Statsmodels,Quantitative Finance,我也询问了Quant Finance,但我认为有人可以在这里提供帮助: 我希望我的投资组合贝塔在回归市场时与我的单个组成部分贝塔乘以投资组合权重相匹配。我在下面创建了一个简单的示例。如果能帮我解释一下我哪里出了错,我将不胜感激 import pandas as pd import numpy as np import statsmodels.api as sm from statsmodels import regression def beta(x, y):

我也询问了Quant Finance,但我认为有人可以在这里提供帮助:

我希望我的投资组合贝塔在回归市场时与我的单个组成部分贝塔乘以投资组合权重相匹配。我在下面创建了一个简单的示例。如果能帮我解释一下我哪里出了错,我将不胜感激

import pandas as pd
    import numpy as np
    import statsmodels.api as sm
    from statsmodels import regression

    def beta(x, y):
        x = sm.add_constant(x)
        model = regression.linear_model.OLS(y, x).fit()
        # Remove the constant now that we're done
        x = x[:, 1]
        return model.params[1]


    bond_one = [100, 96, 102, 88, 96, 101, 120, 110, 105, 107, 106]
    bond_two = [98, 102, 88, 95, 105, 100, 101, 99, 104, 108, 112]
    mkt = [1000, 1004, 1000, 1010, 1020, 1000, 990, 995, 1005, 1025, 1035]

    df_mkt = pd.DataFrame(mkt, columns = ['mkt'])
    df_mkt = df_mkt.pct_change().dropna()
    df = pd.DataFrame(bond_one, columns = ['bond_one'])
    df['bond_two'] = bond_two

    df_price = df.copy()
    df = df.pct_change().dropna()

    notionals = {'bond_one': 2500000,
                    'bond_two': 6500000}

    mkt_values = {key: value*(df_price[key].iloc[-1]/100)
                  for (key, value) in notionals.items()}

    #create portfolio market value
    tot_port = sum(list(mkt_values.values()))
    #generate weights
    wts = {key: value/tot_port for (key, value) in mkt_values.items()}

    #create portfolio returns
    df_port = df.copy()*0
    df_port = df.mul(list(wts.values()), axis=1)
    df_port['port'] = df_port.sum(axis=1)

    #add port and market into original dataframe
    df['port'] = df_port['port'].copy()
    df['mkt'] = df_mkt['mkt'].copy()

    #run OLS on individuals and portfolio
    b1_beta = regression.linear_model.OLS(x = df['bond_one'].values, y=df['mkt'].values).fit()
    b2_beta = beta(x=df['bond_two'].values, y=df['mkt'].values)
    port_beta = beta(x=df['port'].values, y=df['mkt'].values)

    calc_beta = wts['bond_one']*b1_beta + wts['bond_two']*b2_beta
    ###why don't calc_beta and port_beta match?

这种差异与回归中投资组合权重的存在(或缺乏)有关。因为你的投资组合成分的价值每天都在变化,权重也是如此
port_beta
是您的投资组合价值在
market
期间的贝塔值,而
calc_beta
是投资组合组成部分贝塔值的加权和。产生差异的主要原因是,
calc_beta
是使用当前权重计算的,而
port_beta
是跨历史权重计算的。

因此,更合理的方法是每天计算组成权重,并使用这些权重计算每日历史投资组合回报。我想得对吗?取决于你的目标是什么。如果您的目标是从组成部分beta中聚合投资组合beta,我建议您计算每个组成部分的滚动beta,然后根据每日权重每日聚合。