Модуль quotes. Эконометрические методы 2.


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

Сезонность представляет собой периодические колебания с периодом 1 год. Для использования такой периодичности необходимы котировки с месячным интервалом и выше. Но думаю играть интереснее на дневных и часовых интервалах, поэтому от учета сезонности придется отказаться. Метод, при котором изменение цены представляется только суммой тренда и микротренда, носит название метод Хольта (Брауна).

Формулы для прогнозирования по методу Хольта довольно просты:

, где Y – прогнозируемое значение, Y’ и – прогнозируемые тренд и микротренд, X – исторические значения, a и b – коэффициенты. Причем в первой точке (в первом периоде) тренд и микротренд не рассчитываются; на втором шаге значение Y’ принимается равным X, а микротренд считается как приращение X; а уже начиная со следующего шага поочередно применяются указанные выше формулы.

Для усвоения материала применим полученные знания на практике. Напишем скрипт, который будет прогнозировать годовые котировки Газпрома за прошлый год с двумя различными наборами параметров. После чего выведем реальные данные и полученные два прогноза на один график.

# -*- coding: utf-8

# подгружаем библиотеки
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

# задаем коэффициенты для первого прогноза
a, b = .5, .8
# формируем массивы тренда, микротренда и прогноза
y1, y2, y = [], [], []
for i in xrange(len(x)):
	if i == 0:
		y.append(x[i])
		y1.append(0.)
		y2.append(0.)
		continue
	if i == 1:
		y.append(x[i])
		y1.append(x[i])
		y2.append(x[i] - x[i-1])
		continue
	y1.append( a*x[i-1] + (1.-a)*( y1[-1] + y2[-1] ) )
	y2.append( b*(y1[-1] - y1[-2]) + (1.-b)*y2[-1] )
	y.append(y1[-1]+y2[-1])
# сохраняем прогноз
z = y

# формируем другой прогноз с другими коэффициентами
a, b = .4, .6
y1, y2, y = [], [], []
for i in xrange(len(x)):
	if i == 0:
		y.append(x[i])
		y1.append(0.)
		y2.append(0.)
		continue
	if i == 1:
		y.append(x[i])
		y1.append(x[i])
		y2.append(x[i] - x[i-1])
		continue
	y1.append( a*x[i-1] + (1.-a)*( y1[-1] + y2[-1] ) )
	y2.append( b*(y1[-1] - y1[-2]) + (1.-b)*y2[-1] )
	y.append(y1[-1]+y2[-1])

# выводим на одном графике реальные значения и пронозы
plt.plot(x, label='real')
plt.plot(y, label='predict1')
plt.plot(z, label='predict2')
plt.legend()
plt.show()

Посмотрим на результат работы программы.

Видно, что коэффициенты влияют на погрешность прогноза, поэтому… поэтому в следующей статье мы выберем критерии качества и программно определим оптимальные коэффициенты.

Ну и напоследок добавим в модуль ekonom.py функцию для расчета прогноза методом Хольта. Теперь исходный скрипт будет намного короче:

# -*- coding: utf-8

# подгружаем библиотеки
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
# по умолчания берутся цены закрытия
y = q.halt(.3, .2)
z = q.halt(.5, .2)

# выводим на одном графике реальные значения и пронозы
plt.plot(x, label='real')
plt.plot(y, label='predict1')
plt.plot(z, label='predict2')
plt.legend()
plt.show()

Жду объективную критику и предложения по развитию проекта.

, , , ,



  1. #1 by Иван on 13 Сентябрь 2010 - 9:58

    Не совсем понятно на какой срок строились предсказания? Только на следующий шаг или на несколько шагов?

(никто не узнает)