Модуль quotes. Парсим котировки.


Модуль quotes – задумывался мною как библиотека (или пакет), но взвесив все как следует решил что это будет программный пакет на основе модуля (или, опять же, пакета) quotes. Поэтому несколько изменим структуру продукта:

В папке quotes будет располагаться библиотека, а в корневой папке проекта будут находиться скрипты, использующие эту библиотеку.

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

Функцию загрузки котировок скопипастим из предыдущей статьи, а над остальным придется потрудиться. Оформим структуру данных для работы с котировками в виде класса. Назовем его stock.

Итак, исходники quotes.py с комментариями:

# -*- coding: utf-8

import string
import urllib

# загрузка котировок
def get_quotes(df, mf, yf, dt, mt, yt, simb, period):
    f = urllib.urlopen('http://195.128.78.52/GAZP_080201_100208.txt?d=d&market=1&em=' +
        str(simb)+'&df='+str(df)+'&mf='+str(mf)+'&yf='+str(yf)+'&dt='+str(dt)+'&mt='
        +str(mt)+'&yt='+str(yt)+'&p='+str(period)
       	+'&f=GAZP_080201_100208&e=.txt&cn=GAZP&dtf=4&tmf=4&MSOR=0&sep=1&sep2=1&datf=5&at=1')
    quot = f.read()
    return string.split(quot, '\n')[1:-1]

# класс quote - котировки
class quote(object):
	# инициализация: по умолчанию грузим газпром часовик
	# обозначения периодов 1 - тики, 2 - минуты, 3 - 5 минут, 7 - 1 час, 8 - день
	def __init__(self, period=7, simb=16842):
		# "сырые" данные которовок - массив строк
		self.raw_data = []
		# развернутые данные - open, high, low, close, volume
		self.open, self.high, self.low, self.close, self.volume = [], [], [], [], []
		# номер торгового инструмента (по финаму)
		self.simb = simb
		# период
		self.period = period

	# распаковка "сырых" данных
	def decomp(self):
		self.open, self.hight, self.low, self.close, self.volume = [], [], [], [], []
		for line in self.raw_data:
			mix = string.split(line, ',')[2:7]
			self.open.append(float(mix[0]))
			self.high.append(float(mix[1]))
			self.low.append(float(mix[2]))
			self.close.append(float(mix[3]))
			self.volume.append(int(mix[4]))

	# грузим котировки из инета
	def load_quotes(self, df, mf, yf, dt, mt, yt):
		self.raw_data = get_quotes(df, mf, yf, dt, mt, yt, self.simb, self.period)
		self.decomp()

	# записываем котировки в файл (сырые)
	def save(self, fname):
		f = open(fname, 'w')
		for line in self.raw_data:
			f.write(line+'\n')
		f.close()

	# грузим "сырые" котировки из файла
	def load(self, fname):
		f = open(fname, 'r')
		quot = f.read()
		f.close()
		self.raw_data = string.split(quot, '\n')[:-1]
		self.decomp()

А вот пример использования класса quote:

# -*- coding: utf-8
# загружаем модуль quotes
import quotes.quotes as quotes

# инициализируем объект класса quotes
# 8 - период сутки, по умолчанию ГАЗПРОМ
q = quotes.quote(8)
# период: с 1.01.2010 по 30.01.2010
# (напомню, нумерация месяцев здесь начинается с 0)
q.load_quotes(1, 0, 2010, 30, 0, 2010)
# выводим "сырые" данные
print q.raw_data
# вывод объемов по дням
print q.volume
# сохраняем котировки в файл
q.save('zzz.txt')
# делаем новый объект класса quotes
q2 = quotes.quote(8)
# загружаем котировки из только что сохраненного файла
q2.load('zzz.txt')
# выводим объемы по дням - все в норме
print q.volume

Все изменения внесены в репозиторий. Жду вопросов, комментариев, советов и предложений.

,



  1. #1 by Александр on 30 Ноябрь 2010 - 2:17

    ># период: с 1.01.2010 по 30.01.2010
    ># (напомню, нумерация месяцев здесь начинается с 0)
    >q.load_quotes(1, 0, 2010, 30, 0, 2010)

    Ну зачем же так себя утруждать, можно в функции «load_quotes» отнимать единицу от параметра месяца и больше не следить за тем, что надо вписывать 0, а не 1.

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