np.log возвращает фрейм данных, полный NaN - PullRequest
1 голос
/ 19 января 2020

Я выполнил 2 функции: одну для совокупного логарифмического возврата c, а другую для общего относительного возврата.

Совокупного логарифмического возврата c:

# Cumulative logarithmic returns function:
def tlog_r(data, start, end):
    tlog_return = copy.deepcopy(data)
    for t in range(0,len(tlog_return)):
        x = data[t]
        y = data[0]
        tlog_return[t] = x/y
    tlog_return = np.log(tlog_return)
    tlog_return[0] = 0
    return tlog_return`

Итого Относительная доходность:

# Total relative returns function:
def tr_rel(data):
    tlog_return = copy.deepcopy(data)
    for t in range(0,len(tlog_return)):
        x = data[t]
        y = data[0]
        tlog_return[t] = x/y
    tlog_return = np.log(tlog_return)
    tlog_return[0] = 0
    tr_relative = copy.deepcopy(tlog_return)
    for t in range(0,len(tr_relative)):
        tr_relative[t] = 100*(np.exp(tr_relative[t])-1)
    print(tr_relative)
    return tr_relative`

Я хочу рассчитать их на основе данных запаса между двумя датами. Он не выдает никакой ошибки, но если даты не начинаются в 2000, 2005 или 2011 году, он возвращает фрейм данных, полный NaN, за исключением значения в index [0]. Почему это происходит? Как я могу решить это?

Если вам это нужно, это часть кода, где я вызываю функции:

from relative_returns_functions import tlog_r, tr_rel
from pandas_datareader import data
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import copy

ticker='AAPL'
start_date='2000-01-01'
end_date='2019-12-31'
price='Close'

# Program
panel_data = data.DataReader(ticker , 'yahoo', start_date, end_date)[price]
title = '{} {} price'.format(ticker, price) #Plot title
panel_data.plot(title=title)

# Data procesing
all_weekdays = pd.date_range(start=start_date, end=end_date, freq='B')
panel_data = panel_data.reindex(all_weekdays)
panel_data = panel_data.fillna(method='ffill')

# Plot
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10,6))
comp_title = '{} returns comparation'.format(ticker)
fig.suptitle(comp_title)

sum_log_returns = tlog_r(panel_data, start_date, end_date)
ax1.plot(sum_log_returns.index, sum_log_returns, label=ticker)
ax1.set_ylabel('Cumulative log returns')
ax1.legend(loc='best')

tot_logreturns = tr_rel(panel_data)
ax2.plot(tot_logreturns.index, tot_logreturns, label=ticker)
ax2.set_ylabel('Total relative returns (%)')
ax2.legend(loc='best')

plt.show()

Здесь у вас есть минимальный воспроизводимый пример, вы будете должны импортировать функции pandas, numpy и копировать.

ticker='AAPL'
start_date='2000-01-01'
end_date='2019-12-31'
price='Close'
panel_data = data.DataReader(ticker , 'yahoo', start_date, end_date)[price]
all_weekdays = pd.date_range(start=start_date, end=end_date, freq='B')
panel_data = panel_data.reindex(all_weekdays)
panel_data = panel_data.fillna(method='ffill')
sum_log_returns = tlog_r(panel_data, start_date, end_date)
print(sum_log_returns)
tot_logreturns = tr_rel(panel_data)
print(tot_logreturns)
...