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


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

Метод скользящего среднего (MA, moving average) является самым простым из эконометрических методов но пользоваться им нежелательно в связи с низкой точность прогноза. Скользящее среднее порядка N для i-го элемента временного ряда X рассчитывается следующим образом:   Экспоненциальное сглаживание (EMA, exponetial moving average) учитывает все предыдущие значения числового ряда, а не последние N, как в случае со скользящим средним. Однако, чем «старее» значение, тем с меньшим весом оно учитывается. Соответственно и вычисляется оно по другому:   , где a – коэффициент сглаживания, лежащий в пределах от 0 до 1. Выбор коэффициента сглаживания в определенной мере влияет на значения экспоненциального сглаживания.

С теорией все ясно, теперь определимся каким образом добавить данный функционал непосредственно в пакет quotes. Создадим отдельный модуль ekonom.py с классом quotes наследующим свойсва и методы класса quotes из модуля quotes.py. Так как каждый период характеризуется четырьмя ценами (открытие, максимум, минимум и закрытие), а скользящие рассчитываются по одной цене за период, сделаем возможность выбора рассчитываемой цены, но по умолчанию оставим цену закрытия. Исходный код модуля ekonom.py:

# -*- coding: utf-8
import quotes

# наследуем ранее созданный класс quote
class quote(quotes.quote):
	# moving average (скользящее среднее)
	def MA(self, period=7, price='c'):
		# массив для подготовки результатов
		res = []
		# выбор цены для рассчета
		if price == 'c':
			x = self.cl
		elif price == 'o':
			x = self.op
		elif price == 'h':
			x = self.hi
		elif price == 'l':
			x = self.lo
		else:
			x = []
		#  рассчитываем среднее
		for i in xrange(len(x)):
			if i < period:
				res.append(x[i])
			else:
				s = 0
				for j in range(i-period, i):
					s += x[j]
				res.append(s/period)
		return res

        # экспоненциальное сглаживание
	def EMA(self, a=0.1, price='c'):
		# массив для подготовки результатов
		res = []
		# выбор цены для рассчета
		if price == 'c':
			x = self.cl
		elif price == 'o':
			x = self.op
		elif price == 'h':
			x = self.hi
		elif price == 'l':
			x = self.lo
		else:
			x = []
		#  рассчитываем экспоненциальные сглаживающие
		for i in xrange(len(x)):
			if i == 0:
                		res.append(x[i])
            		else:
                		ema = a * x[i] + (1.0 - a) * res[-1]
                		res.append(ema)
        	return res

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

# -*- 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')

# формируем массивы цен закрытия,
# скользящих средних и экспоненциальных 
cl = q.hi
ma7 = q.MA()
ema01 = q.EMA()

# выводим на график
plt.plot(cl, label = 'Close price')
plt.plot(ma7, label = 'MA, T=7')
plt.plot(ema01, label='EMA, a=0.1')

plt.legend(loc='upper left')
plt.show()

В результате работы скрипта получим следующую картинку:

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

Видно, что чем ближе коэффициент a к 1, тем выше степень сглаживания и тем нечувствительнее к шумам экспоненциальное сглаживание.

Точно так же можно поэкспериментировать с периодами скользящего среднего:

Очевидно, что большая величина периода сильнее сглаживает данные.

Данные методы (особенно экспоненциальный) применяются для определения тренда, но использовать их как основу торговой системы довольно рискованно.

, , , ,



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