Питон (Панды) ДЛЯ ЦИКЛОВ «МНОГОКРАТНО» - PullRequest
0 голосов
/ 15 октября 2019

Надеюсь, это мой последний вопрос об этом скрипте. Может быть, лучше сообщить весь код, чтобы дать всем возможность просто вставить и запустить его:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels
from statsmodels.tsa.stattools import coint
from statsmodels.tsa.stattools import adfuller
import yfinance as yf
import pandas_datareader as pdr
import seaborn
import datetime
from sklearn.linear_model import LinearRegression
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()


tickers=['TRN.MI','SRG.MI']
end=datetime.date.today()
gap=datetime.timedelta(days=650)
start=end- gap

Bank=pdr.get_data_yahoo(tickers,start=start,end=end)
bank_matrix=Bank['Adj Close']
bank_matrix=bank_matrix.dropna()

snam=bank_matrix['SRG.MI']
terna=bank_matrix['TRN.MI']
rapporto=terna/snam
zeta=(rapporto-rapporto.mean())/np.std(rapporto)


lookback=20
Hedge=[]
Intercetta=[]
Residuals=[]

for i in range(lookback,len(terna)):
    reg=LinearRegression().fit(bank_matrix[['SRG.MI']][i-lookback+1:i],bank_matrix[['TRN.MI']][i-lookback+1:i])
    Hedge.append(reg.coef_[0])
    Intercetta.append(reg.intercept_)
    y_pred=reg.predict(bank_matrix[['SRG.MI']][i-lookback+1:i])
    Residuals.append(bank_matrix[['TRN.MI']][i-lookback+1:i].to_numpy()-y_pred)
    #alternativa a ultime 2 righe sopra: Residuals.append(reg._residues)
Regressione=pd.DataFrame(list(zip(Intercetta,Hedge,Residuals)),columns=['Intercetta','Hedge','Residuals'])
Regressione.set_index(bank_matrix[['TRN.MI']].index[lookback:],inplace=True)

res=[i.mean() for i in Residuals]
Regressione['Residuals']=res
NormRes=(res -np.mean(res))/np.std(res)
Regressione['NormRes']=NormRes 

А теперь последняя и более проблемная часть:

money = 0
countS1 = 0
countS2 = 0
terna_trading=bank_matrix['TRN.MI'][lookback:]
snam_trading=bank_matrix['SRG.MI'][lookback:]
for i in range(len(Regressione['Hedge'])):
    # Sell short if the z-score is > 1
    if NormRes[i] > 2:
        money+= terna_trading[i] - snam_trading[i]*(Regressione['Hedge'][i])
        countS1 -= 1
        countS2 += Regressione['Hedge'][i]
        print('Selling Ratio %s %s %s %s'%(money, Regressione['Hedge'][i], countS1,countS2))
    elif NormRes[i] < -2:
            money-=terna_trading[i] - snam_trading[i].multiply(Regressione['Hedge'][i])
            countS1 += 1
            countS2 -= Regressione['Hedge'][i]
            print('Buying Ratio %s %s %s %s'%(money,Regressione['Hedge'][i], countS1,countS2))

    elif abs(NormRes[i]) < 1:
            money+= terna_trading[i] * countS1 + snam_trading[i]*countS2
            countS1 = 0
            countS2 = 0
            print('Exit pos %s %s %s %s'%(money,Regressione['Hedge'][i], countS1,countS2))

print(money)    

Python возвращает меняa 'KeyError': 2 и, согласно долгой трассировке, я могу только догадываться, что это что-то относительно индексов. Я пробовал два разных способа вне FOR-LOOP, и они оба работают (код ниже):

CASE A

terna_trading - snam_trading*Regressione['Hedge']

CASE B

terna_trading - snam_trading.multiply(Regressione['Hedge'])

В заключение:Я думаю, что мне не хватает чего-то важного в способе обработки индексов и операций внутри циклов. Надеюсь, кто-нибудь может мне помочь. Спасибо всем

...