Я работаю над следующей проблемой: нам дан набор {DateTime, Price} , представляющий цены акции. Некоторые из цен являются нулевыми, и мы должны определить их, интерполируя между ненулевыми записями. Я пробовал различные интерполяторы - линейный, кубический сплайн и т. Д., Но точность интерполированных значений недостаточно хороша.
Итак, я решил использовать ARIMA для моделирования ненулевых записей, а затем использовать эту модель для прогнозирования значений в DateTime записей Null. Вот код:
def fill_in_dataframe_ARIMA( df ):
price_is_not_NaN = df[ 'price' ].notnull()
price_is_NaN = np.logical_not( price_is_not_NaN )
# Convert the datetimes of the index into milliseconds:
datetime_ms = df.index.map( to_ms ) * 1000.0
# Train the ARIMA model:
train_datetime_ms = datetime_ms[ price_is_not_NaN ]
train_price = df.price[ price_is_not_NaN ]
print( "len(train_price)", len(train_price), file = sys.stderr )
arima_model = ARIMA( train_price, ( 5, 1, 2 ), train_datetime_ms ).fit()
# Use model to predict the missing prices:
missing_datetime_ms = datetime_ms[ price_is_NaN ]
print( "len(missing_datetime_ms)", len(missing_datetime_ms), file = sys.stderr )
missing_price = arima_model.predict( exog = missing_datetime_ms, typ = "levels" )
print( "len(missing_price)", len( missing_price ), file = sys.stderr )
Я ожидаю, что вызов predict
вернет одну прогнозируемую цену для каждой нулевой записи. Однако то, что я вижу из утверждений печати:
len(train_price) 126
len(missing_datetime_ms) 20
len(missing_price) 125
Похоже, что вместо того, чтобы возвращать мне интересующие меня значения, он возвращает обучающие значения (меньше одного).
Можете ли вы объяснить, как я ругаю ARIMA, и как я могу заставить ее делать то, что я намереваюсь?