114 lines
6 KiB
MQL5
114 lines
6 KiB
MQL5
//+------------------------------------------------------------------+
|
|
//| Filter.mq5 |
|
|
//| Eugene |
|
|
//| https://www.mql5.com |
|
|
//+------------------------------------------------------------------+
|
|
#property copyright "Eugene"
|
|
#property link "https://www.mql5.com"
|
|
#property version "1.00"
|
|
#include <CategoricalHMM\CategoricalHMM.mqh>
|
|
//+------------------------------------------------------------------+
|
|
//| Script program start function |
|
|
//+------------------------------------------------------------------+
|
|
void OnStart()
|
|
{
|
|
//--- 1. параметры модели / Model parameters ---
|
|
matrix tr = {{0.95, 0.05},
|
|
{0.10, 0.90}
|
|
};
|
|
matrix e = {{0.16, 0.16, 0.16, 0.16, 0.16, 0.20},
|
|
{0.10, 0.10, 0.10, 0.10, 0.10, 0.50}
|
|
};
|
|
vector y = {1, 6, 6, 6, 2}; // Последовательность наблюдений / Sequence of observations
|
|
|
|
CCategoricalHMM hmm(2, 6);
|
|
hmm.m_TR = tr;
|
|
hmm.m_E = e;
|
|
|
|
//--- Стартовое состояние / Initial state ---
|
|
vector currentFilterState = {1.0, 0.0};
|
|
vector cfs = currentFilterState;
|
|
Print("=== ПОСЛЕДОВАТЕЛЬНЫЙ ОНЛАЙН ПРОГНОЗ ===");
|
|
|
|
for(int i = 0; i < (int)y.Size(); i++)
|
|
{
|
|
int obs = (int)y[i];
|
|
|
|
// --- ШАГ 1: ПРОГНОЗ (до того, как узнали текущее наблюдение) ---
|
|
vector statePrediction = currentFilterState @ hmm.m_TR;
|
|
PrintFormat("Время t=%d:", i+1);
|
|
PrintFormat(" Прогноз состояния : [1]%.4f, [2]%.4f", statePrediction[0], statePrediction[1]);
|
|
|
|
vector obsPrediction = statePrediction @ hmm.m_E; // Умножаем прогноз состояний на матрицу эмиссий
|
|
|
|
ulong maxObsIdx = obsPrediction.ArgMax(); // Находим самое вероятное наблюдение
|
|
PrintFormat(" Самое вероятное след. наблюдение: %d (с вероятностью %.4f)", maxObsIdx + 1, obsPrediction[maxObsIdx]);
|
|
|
|
// --- ШАГ 2: ОБНОВЛЕНИЕ (ФИЛЬТРАЦИЯ) ---
|
|
// --- пришло наблюдение obs, обновляем текущее состояние ---
|
|
currentFilterState = hmm.Filter(currentFilterState, obs);
|
|
|
|
PrintFormat(" РЕАЛЬНОСТЬ: Пришло наблюдение %d. Текущее состояние уточнено (Фильтрация): [1]%.4f, [2]%.4f",
|
|
obs, currentFilterState[0], currentFilterState[1]);
|
|
Print("---------------------------------------");
|
|
}
|
|
|
|
// --- ВАРИАНТ 1: ПОСЛЕДОВАТЕЛЬНЫЙ (ONLINE) ---
|
|
Print("=== 1. ONLINE FILTER (STEP-BY-STEP) ===");
|
|
currentFilterState = cfs;
|
|
for(int i = 0; i < (int)y.Size(); i++)
|
|
{
|
|
currentFilterState = hmm.Filter(currentFilterState, (int)y[i]);
|
|
PrintFormat("Время t = %d (after y = %d): [1]%.4f, [2]%.4f", i+1, (int)y[i], currentFilterState[0], currentFilterState[1]);
|
|
}
|
|
|
|
// --- ВАРИАНТ 2: ПАКЕТНЫЙ (Inference) ---
|
|
Print("\n=== 2. BATCH Inference (Filtering Distribution) ===");
|
|
matrix pStates, fs, bs;
|
|
vector s_vec;
|
|
double logP;
|
|
|
|
if(hmm.Inference(y, tr, e, pStates, logP, fs, bs, s_vec))
|
|
{
|
|
PrintMatrixFormatted(fs,4);
|
|
}
|
|
}
|
|
|
|
//-------------Результаты выполнения скрипта ----------------------
|
|
|
|
// === ПОСЛЕДОВАТЕЛЬНЫЙ ОНЛАЙН ПРОГНОЗ ===
|
|
// Время t=1:
|
|
// Прогноз состояния : [1]0.9500, [2]0.0500
|
|
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.2150)
|
|
// РЕАЛЬНОСТЬ: Пришло наблюдение 1. Текущее состояние уточнено (Фильтрация): [1]0.9682, [2]0.0318
|
|
// ---------------------------------------
|
|
// Время t=2:
|
|
// Прогноз состояния : [1]0.9229, [2]0.0771
|
|
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.2231)
|
|
// РЕАЛЬНОСТЬ: Пришло наблюдение 6. Текущее состояние уточнено (Фильтрация): [1]0.8273, [2]0.1727
|
|
// ---------------------------------------
|
|
// Время t=3:
|
|
// Прогноз состояния : [1]0.8032, [2]0.1968
|
|
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.2590)
|
|
// РЕАЛЬНОСТЬ: Пришло наблюдение 6. Текущее состояние уточнено (Фильтрация): [1]0.6201, [2]0.3799
|
|
// ---------------------------------------
|
|
// Время t=4:
|
|
// Прогноз состояния : [1]0.6271, [2]0.3729
|
|
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.3119)
|
|
// РЕАЛЬНОСТЬ: Пришло наблюдение 6. Текущее состояние уточнено (Фильтрация): [1]0.4022, [2]0.5978
|
|
// ---------------------------------------
|
|
// Время t=5:
|
|
// Прогноз состояния : [1]0.4418, [2]0.5582
|
|
// Самое вероятное след. наблюдение: 6 (с вероятностью 0.3674)
|
|
// РЕАЛЬНОСТЬ: Пришло наблюдение 2. Текущее состояние уточнено (Фильтрация): [1]0.5588, [2]0.4412
|
|
// ---------------------------------------
|
|
// === 1. ONLINE FILTER (STEP-BY-STEP) ===
|
|
// Шаг t = 1 (after y = 1): [1]0.9682, [2]0.0318
|
|
// Шаг t = 2 (after y = 6): [1]0.8273, [2]0.1727
|
|
// Шаг t = 3 (after y = 6): [1]0.6201, [2]0.3799
|
|
// Шаг t = 4 (after y = 6): [1]0.4022, [2]0.5978
|
|
// Шаг t = 5 (after y = 2): [1]0.5588, [2]0.4412
|
|
//
|
|
// === 2. BATCH Inference (Filtering Distribution) ===
|
|
// 1.0000 0.9682 0.8273 0.6201 0.4022 0.5588
|
|
// 0.0000 0.0318 0.1727 0.3799 0.5978 0.4412
|