Скользящее среднее не рассчитывается должным образом - PullRequest
2 голосов
/ 16 апреля 2019

Я делаю анализ временных рядов акций Microsoft с использованием данных, полученных из Quandl. Я хочу построить цены закрытия против скользящих средних. Когда я строю скользящие средние, они не доходят до правой части графика.

Я считаю, что наличие разрыва имеет смысл (например, 200-дневная скользящая средняя не может начаться до дня 200), но я обеспокоен тем, что разрыв находится справа. Это означает, что оно начинается с самой последней даты (что имеет некоторый смысл, поскольку самая последняя дата является первой во временном ряду), что, очевидно, не является правильным способом сделать это.

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

#calculate moving averages for Microsoft

roll100 = MSFT_data['Adj. Close'].rolling(100).mean()
roll200 = MSFT_data['Adj. Close'].rolling(200).mean()
roll50 = MSFT_data['Adj. Close'].rolling(50).mean()
roll10 = MSFT_data['Adj. Close'].rolling(10).mean()


roll200.plot(label = '200 Day Moving Average')
roll50.plot(label = '50 Day Moving Average')
roll100.plot(label = '100 Day Moving Average')
MSFT_data['Adj. Close'].plot(label = 'MSFT Closing Price', color = 'blue')
plt.legend(loc = 'upper left')

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

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


MSFT_data['roll100'] = MSFT_data['Adj. Close'].rolling(100).mean()
MSFT_data['roll200'] = MSFT_data['Adj. Close'].rolling(200).mean()
MSFT_data['roll50'] = MSFT_data['Adj. Close'].rolling(50).mean()
MSFT_data['roll10'] = MSFT_data['Adj. Close'].rolling(10).mean()

#plot Microsoft Price along with moving averages

fig = plt.figure()
fig.set_figheight(8)
fig.set_figwidth(10)

MSFT_data['roll200'].plot(label = '200 Day Moving Average')
MSFT_data['roll50'].plot(label = '50 Day Moving Average')
MSFT_data['roll100'].plot(label = '100 Day Moving Average')
MSFT_data['Adj. Close'].plot(label = 'MSFT Closing Price', color = 'blue')
plt.legend(loc = 'upper left')

Graph

Также, если я проверю столбец, например, с помощью:

MSFT_data['roll10'].head(12)

Date
2017-12-29       NaN
2017-12-28       NaN
2017-12-27       NaN
2017-12-26       NaN
2017-12-22       NaN
2017-12-21       NaN
2017-12-20       NaN
2017-12-19       NaN
2017-12-18       NaN
2017-12-15    85.796
2017-12-14    85.711
2017-12-13    85.674
Name: roll10, dtype: float64

Я вижу, что 9 самых последних значений - NaN. И наоборот, если я создаю новый фрейм данных и пытаюсь переиндексировать по возрастанию, мои последние 9 значений в хвосте равны NaN.

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Я не уверен, может ли это помочь вам, но если я попытаюсь воспроизвести это, у меня нет пробела справа.Я думаю, что ваша проблема в том, что вы не добавляете MA к исходному df.Вот мой код

%matplotlib inline
import pandas as pd
import numpy as np
N = 400
dates = pd.date_range(start='2018-01-01', periods=N, freq="T")
df = pd.DataFrame({"Date":dates, "Adj. Close":np.random.rand(N)})
for ma in [10,50, 100,200]:
    df["MA{}".format(ma)] = df["Adj. Close"].rolling(ma).mean()

df.plot(x="Date").legend(bbox_to_anchor=(1, 1));
0 голосов
/ 17 апреля 2019

Я не уверен, что это 100% ответ, но он как-то связан с фреймом данных, который создается от самого последнего до наименьшего и затем индексируется. Сброс индекса, сортировка по возрастанию и повторная индексация до даты позволили мне начать работу.

MSFT1 = MSFT_data.sort_index(ascending = True)
MSFT1 = MSFT1.reset_index()
MSFT1 = MSFT1.set_index('Date')
...