Скрытая Марковская модель (HMM) в python (hmmlearn) всегда предсказывает одно и то же значение для временного ряда - PullRequest
3 голосов
/ 05 апреля 2020

Я пытался использовать пакет hmmlearn в python для построения модели, предсказывающей значения временного ряда. Я основал свой код на этой статье , подробно описывая, как использовать пакет для временного ряда цены акций.

После подгонки модели к большому сегменту данных временного ряда и попытки построить прогностическую модель для остатка, я столкнулся с проблемой. Модель всегда предсказывает один и тот же результат как наиболее вероятный. - hmm.score возвращает наибольшую логарифмическую вероятность для одного и того же результата для каждого экземпляра в серии испытаний. Более того, прогнозируемый результат является наиболее близким к среднему значению временного ряда, на котором он был установлен. Это никогда не отклоняется. Я действительно не уверен, что делать. Неисправна ли модель или я что-то не так делаю?

Код, который делает прогноз, приведен ниже. Он добавляет все возможные значения (определенные ниже) к последовательности контрольных точек во временном ряду (последние 100 в наборе тестовых данных) и оценивает вероятность (используя hmm.score):


possible_outcomes = np.linspace(-0.1, 0.1, 10)

latency_days = 10

def predict_close_price(time_index):
    open_price = actuals_test[time_index]
    predicted_frac_change = get_most_probable_outcome(time_index)
    return open_price * (1 + predicted_frac_change)


def get_most_probable_outcome(time_index):
    previous_data_start_index = max(0, time_index - latency_days)
    previous_data_end_index = max(0, time_index - 1)
    prev_start = int(previous_data_start_index)
    prev_end = int(previous_data_end_index)
    previous_data = test_data[prev_start: prev_end]

    outcome_score = []
    for possible_outcome in possible_outcomes:
        total_data = np.row_stack((previous_data, possible_outcome))
        outcome_score.append(hmm.score(total_data))
    most_probable_outcome = possible_outcomes[np.argmax(outcome_score)]
    print(most_probable_outcome)
    return most_probable_outcome

predicted_close_prices = []
actuals_vector = []
for time_index in range(len(actuals_test)-100,len(actuals_test)-1):
    predicted_close_prices.append(predict_close_price(time_index))
    actuals_vector.append(actuals_test[(time_index)])

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

timeSeries.reverse()

difference_fracs = []

for i in range(0, len(timeSeries)-1):
    difference_frac = ((timeSeries[i+1] - timeSeries[i])/(timeSeries[i]))
    difference_fracs.append(difference_frac)

differences_array = np.array(difference_fracs)
differences_array = np.reshape(differences_array, (-1,1))

train_data_length = 2000

train_data = differences_array[:train_data_length,:]
test_data = differences_array[train_data_length:len(timeSeries),:]
actuals_test = timeSeries[train_data_length:]

n_hidden_states = 4

hmm = GaussianHMM(n_components = n_hidden_states)
hmm.fit(trainData)

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

...