Модуль quotes. EMA vs метод Хольта. Оптимизация.


В предыдущих двух статьях мы познакомились с двумя эконометрическими методами прогнозирования: экспоненциальное сглаживание и метод Хольта. А там где есть хотя бы двое появляется конкуренция. Действительно, какой из методов даст более точный прогноз? Попробую на него ответить.

Перед тем как приниматься за расчеты, напомню, что в обоих методах фигурируют изменяемые коэффициенты сглаживания, от значений которых зависит точность прогноза. Поэтому для начала для каждого из методов подберем оптимальные значения коэффициентов. Но как узнать какой коэффициент (для метода Хольта комбинация коэффициентов) оптимален? Для каждого метода есть специальные методики для выбора оптимальных параметров, но в любом случае необходима оценка точности прогноза в зависимости от выбранных коэффициентов. Для этой цели вычисляют скреднеквадратическую ошибку (СКО, а по-буржуйски RMSRoot Mean Square).

Для вычисления СКО все отдельные ошибки возводятся в квадрат, суммируются, сумма делится на общее число ошибок, затем из всего извлекается квадратный корень. Полученное в результате число характеризует суммарную ошибку.

# -*- coding: utf-8
import time
# подгружаем библиотеки
from quotes.ekonom import *
import matplotlib.pyplot as plt

# начальные параметры
folder = 'data/'
qlist = 'quotes/mmvb.txt'
interval = 8

# финамовский номер газпрома
fnum = 16842

# загружаем котировки Газпрома из локальной базы
q = quote(interval,  fnum)
q.load(folder + str(q.symb) + '_' + str(interval) + '.csv')

# цены закрытия
x = q.cl

# функция вычисления СКО
# на вход подаются два массива одинаковой длинны
def RMS(a, b):
    s = 0.
    for i in xrange(len(a)):
        s += (a[i] - b[i]) ** 2
    return (s/len(a)) ** 0.5

# массивы для хранения коэффициентов и СКО
param, err = [], []
# меняем коэффициент сглаживания от 0 до 1 с шагом 0.02
for i in xrange(50):
    a = float(i)/50.
    y = q.EMA(a)
    param.append(a)
    err.append(RMS(x, y))

# строим график
plt.plot(param, err)
plt.show()

В результате получим график, из которого видно, что оптимальным значением коэффициента сглаживания является единица и точность выше чем ±5 (рублей) при использовании экспоненциального сглаживания мы не получим.

Так как в методе Хольта два изменяемых параметра, построим «карту высот» на плоскости, благо matplotlib это позволяет. Изменять параметры будем от 0.2. до 1, так как от 0 до 0.2 ошибка слишком велика.

# -*- coding: utf-8
import time
# подгружаем библиотеки
from quotes.ekonom import *
#import matplotlib.pyplot as plt
from matplotlib.patches import Patch
from pylab import *

# начальные параметры
folder = 'data/'
qlist = 'quotes/mmvb.txt'
interval = 8

# финамовский номер газпрома
fnum = 16842

# загружаем котировки Газпрома из локальной базы
q = quote(interval,  fnum)
q.load(folder + str(q.symb) + '_' + str(interval) + '.csv')

# цены закрытия
x = q.cl

# функция вычисления СКО
# на вход подаются два массива одинаковой длинны
def RMS(a, b):
    s = 0.
    for i in xrange(len(a)):
        s += (a[i] - b[i]) ** 2
    return (s/len(a)) ** 0.5

# изменяем параметры от 0.2 до 1 с шагом 0.005
da, db = 0.005, 0.005
a = arange(.2, 1.0, da)
b = arange(.2, 1.0, db)
A, B = meshgrid(a, b)

# функция вычисления ошибки при заданных параметрах
def err(a, b):
    global x, q
    y = q.halt(a, b)
    return RMS(x, y)

# вычисляем ошибки для всех комбинаций параметров
E = err(A, B)

# рисуем
axis([0.2, 1., 0.2, 1.])
pcolor(A, B, E)
colorbar()
show()

На карте высот видно, что оптимальные значения для коэффициента a лежат в пределах от 0.5 до 0.8, а коэффициента b – от 0.2 до 0.8. Но даже при оптимальных параметрах средняя ошибка прогноза не опускается ниже 5 (рублей). Напомню, что вышесказанное справедливо только для акций Газпрома и только применительно к 2009 году.

Подведем итог. Несмотря на то, что метод Хольта является усовершенствованием метода экспоненциального сглаживания, его применение на реальных котировках не дает выигрыша в точности прогноза.

, , , ,



  1. Пока нет комментариев.
(никто не узнает)