Двойная бета в питоне - множественная линейная регрессия с фиктивной переменной в statsmodel - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь вычислить двойную бета-версию в python, используя регрессию statsmodel.К сожалению, я получаю сообщение об ошибке.

Уравнение регрессии для двойных бета-версий дано здесь

Формула двойного бета

Пока я пренебрегаю безрисковой ставкой (rf), но после ее добавления реализация должна быть аналогичной.На данный момент мой код выглядит следующим образом, где мой простой файл 'spx.xlsx' содержит два столбца с возвратами, называемые 'SPXrets' и 'AAPLrets' (+ один столбец с датами):

import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile

import statsmodels.api as sm
import statsmodels.formula.api as smf
import numpy as np


df = pd.read_excel('spx.xlsx')
print(df.columns)

mod = smf.ols(formula='AAPLrets ~ SPXrets', data=df)
res = mod.fit()
print(res.summary())

Подсказкаошибка:

PatsyError: термин перехват не может взаимодействовать ни с чем другим AAPLrets ~ SPXrets: c (D) + SPXrets: (1-c (D))

Благодарен за любую помощь - большое спасибо!

1 Ответ

0 голосов
/ 14 февраля 2019

Редактировать:

После моих первоначальных предложений ОП изменил как заголовок, так и предоставленный фрагмент кода.С тех пор мои предложения были соответствующим образом отредактированы.


Новое предложение:

Я подозреваю, что у вас возникли проблемы с набором данных.Я предлагаю вам рассказать нам немного больше об источнике данных, о том, как вы загрузили данные, как они выглядят (структура) и каков тип ваших столбцов (строка, число с плавающей запятой и т. Д.).

Что яможет сказать вам прямо сейчас, что ваш фрагмент отлично работает с некоторыми примерами данных, как это:

Код:

               CONret  DAXret:c(D)  DAXret:(1-c(D))  AAPLrets  SPXrets  dummy
2017-01-08     109          107              122       101      100      0
2017-01-09     117          108              124       113      147      0
2017-01-10     142          108              130       107      103      1
2017-01-11     106          121              149       103      104      1
2017-01-12     124          149              143       112      126      0

Вывод:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:               AAPLrets   R-squared:                       0.095
Model:                            OLS   Adj. R-squared:                  0.004
Method:                 Least Squares   F-statistic:                     1.044
Date:                Thu, 14 Feb 2019   Prob (F-statistic):              0.331
Time:                        16:00:01   Log-Likelihood:                -48.388
No. Observations:                  12   AIC:                             100.8
Df Residuals:                      10   BIC:                             101.7
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
Intercept     84.3198     31.143      2.708      0.022      14.929     153.711
SPXrets        0.2635      0.258      1.022      0.331      -0.311       0.838
==============================================================================
Omnibus:                        5.649   Durbin-Watson:                   1.882
Prob(Omnibus):                  0.059   Jarque-Bera (JB):                2.933
Skew:                           1.202   Prob(JB):                        0.231
Kurtosis:                       3.290   Cond. No.                         872.
==============================================================================

Вот и все:

# imports
import statsmodels.formula.api as smf
import pandas as pd
import numpy as np
import statsmodels.api as sm

# sample data
np.random.seed(1)
rows = 12
listVars= ['CONret','DAXret:c(D)', 'DAXret:(1-c(D))', 'AAPLrets', 'SPXrets']
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars) 
df = df.set_index(rng)
df['dummy'] = np.random.randint(2, size=df.shape[0])

mod = smf.ols(formula='AAPLrets ~ SPXrets', data=df)
res = mod.fit()
res.summary()

Еще одно предложение:


Лично я бы чувствовал себя гораздо комфортнее без трусиков.

Фрагмент ниже позволит вам запустить линейную регрессию и выбрать, возвращать ли сводку модели или кадр данных с другими деталями, такими как значения коэффициента p и rв квадрате.

# Imports
import pandas as pd
import numpy as np
import statsmodels.api as sm

# sample data
np.random.seed(1)
rows = 12
listVars= ['CONret','DAXret:c(D)', 'DAXret:(1-c(D))', 'AAPLrets', 'SPXrets']
rng = pd.date_range('1/1/2017', periods=rows, freq='D')
df = pd.DataFrame(np.random.randint(100,150,size=(rows, len(listVars))), columns=listVars) 
df = df.set_index(rng)
df['dummy'] = np.random.randint(2, size=df.shape[0])

def LinReg(df, y, x, const, results):

    betas = x.copy()

    # Model with out without a constant
    if const == True:
        x = sm.add_constant(df[x])
        model = sm.OLS(df[y], x).fit()
    else:
        model = sm.OLS(df[y], df[x]).fit()

    # Estimates of R2 and p
    res1 = {'Y': [y],
            'R2': [format(model.rsquared, '.4f')],
            'p': [model.pvalues.tolist()],
            'start': [df.index[0]], 
            'stop': [df.index[-1]],
            'obs' : [df.shape[0]],
            'X': [betas]}
    df_res1 = pd.DataFrame(data = res1)

    # Regression Coefficients
    theParams = model.params[0:]
    coefs = theParams.to_frame()
    df_coefs = pd.DataFrame(coefs.T)
    xNames = list(df_coefs)
    xValues = list(df_coefs.loc[0].values)
    xValues2 = [ '%.2f' % elem for elem in xValues ]
    res2 = {'Independent': [xNames],
            'beta': [xValues2]}
    df_res2 = pd.DataFrame(data = res2)

    # All results
    df_res = pd.concat([df_res1, df_res2], axis = 1)
    df_res = df_res.T
    df_res.columns = ['results']


    if results == 'summary':

        return(model.summary())
        print(model.summary())
    else:
        return(df_res)

df_regression = LinReg(df = df, y = 'CONret', x = ['DAXret:c(D)', 'DAXret:(1-c(D))', 'dummy'], const = True, results = 'summary')

print(df_regression)

Тестовый прогон 1:

df_regression = LinReg(df = df, y = 'CONret', x = ['DAXret:c(D)', 'DAXret:(1-c(D))'], const = True, results = '')

Выход 1:

                                                       results
Y                                                       CONret
R2                                                      0.0813
p            [0.13194822614949883, 0.45726622261432304, 0.9...
start                                      2017-01-01 00:00:00
stop                                       2017-01-12 00:00:00
obs                                                         12
X                        [DAXret:c(D), DAXret:(1-c(D)), dummy]
Independent       [const, DAXret:c(D), DAXret:(1-c(D)), dummy]
beta                                [88.94, 0.24, -0.01, 2.20]

Тестовый прогон 2:

df_regression = LinReg(df = df, y = 'CONret', x = ['DAXret:c(D)', 'DAXret:(1-c(D))', 'dummy'], const = True, results = 'summary')

Выход 2:

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                 CONret   R-squared:                       0.081
Model:                            OLS   Adj. R-squared:                 -0.263
Method:                 Least Squares   F-statistic:                    0.2361
Date:                Thu, 14 Feb 2019   Prob (F-statistic):              0.869
Time:                        16:04:02   Log-Likelihood:                -47.138
No. Observations:                  12   AIC:                             102.3
Df Residuals:                       8   BIC:                             104.2
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
===================================================================================
                      coef    std err          t      P>|t|      [0.025      0.975]
-----------------------------------------------------------------------------------
const              88.9438     53.019      1.678      0.132     -33.318     211.205
DAXret:c(D)         0.2350      0.301      0.781      0.457      -0.459       0.929
DAXret:(1-c(D))    -0.0060      0.391     -0.015      0.988      -0.908       0.896
dummy               2.2005      8.973      0.245      0.812     -18.490      22.891
==============================================================================
Omnibus:                        1.025   Durbin-Watson:                   2.354
Prob(Omnibus):                  0.599   Jarque-Bera (JB):                0.720
Skew:                           0.540   Prob(JB):                        0.698
Kurtosis:                       2.477   Cond. No.                     2.15e+03
==============================================================================
...