Следующий код содержит класс ReturnsAnalysis, который при вызове создает атрибут self.df.
Я использую Jupyter Notebook.
Первый раз, когда я его вызываю (для 'mean_historical_return' ), Я получаю заполненный фрейм данных, как и ожидалось.
Однако во второй раз (для 'ema_historical_return') фрейм данных пуст.
import datetime
import pandas as pd
import numpy as np
from pypfopt import expected_returns
from sklearn.linear_model import LinearRegression
# get sample of 200 randomly selected stocks between 2010-01-01 and 2019-12-31 (10 years)
df_sample = pd.read_csv('sample.csv', index_col='trading_date', parse_dates=True)
# split sample into expected and actual prices
df_exp_price = df_sample[df_sample.index <= np.datetime64('2018-12-31')]
df_act_price = df_sample[df_sample.index >= np.datetime64('2019-01-01')]
class ReturnsAnalysis:
def __init__(self, exp_ret, act_ret):
self.df = pd.DataFrame(exp_ret, columns=['expected']).join(
pd.DataFrame(act_ret, columns=['actual'])
)
# results dict to store results in
results = {}
# mean historical return
e = expected_returns.mean_historical_return(df_exp_price)
a = expected_returns.mean_historical_return(df_act_price)
results['mean_historical_return'] = ReturnsAnalysis(
exp_ret=e,
act_ret=a
)
# exponentially weighted mean historical return
e = expected_returns.ema_historical_return(df_exp_price)
a = expected_returns.ema_historical_return(df_act_price)
results['ema_historical_return'] = ReturnsAnalysis(
exp_ret=e,
act_ret=a
)
results['mean_historical_return'].df.head()
results['ema_historical_return'].df.head()
Я проверил эти переменные e
и a
содержат значения. В обоих случаях это Pandas Series.
Я ожидаю, что во второй раз, когда я вызываю ReturnsAnalysis, я должен получить второй заполненный df.
Я подумал, есть ли у него что-то делать с pypfopt, но я проверил репозиторий github и не вижу ничего очевидного.
ОБНОВЛЕНИЕ:
Я упростил код выше, полностью удалив объект ReturnsAnalysis. Вот что у меня осталось:
# imports
import datetime
import pandas as pd
import numpy as np
from pypfopt import expected_returns
from sklearn.linear_model import LinearRegression
# get sample of 200 randomly selected stocks between 2010-01-01 and 2019-12-31 (10 years)
df_sample = pd.read_csv('sample.csv', index_col='trading_date', parse_dates=True)
# split sample into expected and actual prices
df_exp_price = df_sample[df_sample.index <= np.datetime64('2018-12-31')]
df_act_price = df_sample[df_sample.index >= np.datetime64('2019-01-01')]
# mean historical return
e = expected_returns.mean_historical_return(df_exp_price)
a = expected_returns.mean_historical_return(df_act_price)
df_mean = pd.DataFrame(e, columns=['expected']).join(
pd.DataFrame(a, columns=['actual'])
)
# exponentially weighted mean historical return
e = expected_returns.ema_historical_return(df_exp_price)
a = expected_returns.ema_historical_return(df_act_price)
df_ema = pd.DataFrame(e, columns=['expected']).join(
pd.DataFrame(a, columns=['actual'])
)
Я получаю то же поведение, что и раньше: df_mean содержит значения, но df_ema пусто.
Я ожидаю, что df_ema также будет содержать значения.
Но - если я сделаю следующее, я получу df со значениями:
df_ema = pd.DataFrame(tuple(e), index=e.keys(), columns=['expected']).join(
pd.DataFrame(tuple(a), index=a.keys(), columns=['actual'])
)
df_ema.head()