Модуль quotes. Локальная база котировок.

Интернет всвязи с отдаленностью есть не всегда, поэтому для беспрепятственного продолжения работы над модулем quotes было решено создать локальную базу котировок. В модуле quotes на настоящий момент вроде все для сегодняшней задумки есть, но... Но было бы неплохо дополнить его функцией получения символьного наименования торгового инструмента (акции) по его "финамовскому" номеру . Полный список этих номеров для акций ММВБ можно получить если на странице http://www.finam.ru/analysis/quoteonline/default.asp слева выбрать сектор (ММВБ), чуть правее нажать "Выбрать все", и уже внизу клацнуть по "Показать". Тогда и увидим картинку как на скриншоте ниже:


Сохраним html-код в файл mmvb.txt в папку модуля (в UTF-8, конечно), посмотрим на него и подумаем - как его можно распарсить для составления массива типа <номер-имя>, если типовой элемент выглядит следующим образом:


Ну конечно с помощью регулярных выражений:
import re

# загрузка соответствий "финамовский номер" - "название акции"
def get_symbols(fname):
	f = open(fname, 'r')
	txt = f.read()
	f.close()
	symbols = re.findall(r'<a href="/analysis/charts/default.asp\\?id=([^"]+)" target=_blank>([^<]+)</a>', txt)
	return symbols
Так как данный код понадобится нам в дальнейшем, поместим его в модуль quotes. В результате выполнения этой функции мы получим список 2-х элементных списков (во сказанул :) ), где 1-й элемент - номер ценной бумаги, а 2-й - ее наименование (если быть точным, 0-й и 1-й). Напишем функцию определения наименования акции по ее номеру (отмечу, что в случае передачи несуществующего "финамовского" номера, функцией будет возвращена пустая строка):
# определяем наименование акции по ее "финамовскому" номеру
def get_symb_name(symbols, number):
	res = ''
	for symb in symbols:
		if int(symb[0]) == number:
			res = symb[1]
			break
	return res
Эту функцию тоже поместим в модуль quotes и проверим ее работоспособность файлом test.py :
# -*- coding: utf-8
# загружаем модуль quotes
import quotes.quotes as quotes

# файл сохраненный с сайта "Финам"
fname = 'quotes/mmvb.txt'
# получаем массив инструментов с номерами
symbols = quotes.get_symbols(fname)
# определяем инструмент с номером 16842 - Газпром
print quotes.get_symb_name(symbols, 16842)
Функция работает исправно, а значит настало время написать скрипт создания локальной базы котировок. Изменяемыми параметрами скрипта являются путь к каталогу, в который будут сохраняться файлы котировок, путь к файлу с соответствиями "номер акции" - "название акции", временной период, а так же интервал. Исполняться скрипт будет относительно долго, поэтому в качестве индикации будем выводить наименование загружаемой акции, какая она по счету и сколько их (акций) всего.
# -*- coding: utf-8
# загружаем модуль quotes
import quotes.quotes as quotes

# каталог для хранения файлов котировок
folder = 'data/'
# файл с сайта "Финам"
qlist = 'quotes/mmvb.txt'
# выгребаем данные с 1.01.2009 по 31.12.2009
df, mf, yf, dt, mt, yt = 1, 0, 2009, 31, 11, 2009
# работаем с днями
period = 8

symbols = quotes.get_symbols(qlist)
i, n  = 0, len(symbols)
for symb in symbols:
	i += 1
	q = quotes.quote(period, int(symb[0]))
	print 'Загружаем', symb[1], ' (', i, 'из', n, ')'
	q.load_quotes(df, mf, yf, dt, mt, yt)
	q.save(folder + symb[0] + '_' + str(period) + '.csv')
Запускаем скрипт:

Скрипт в работе


Оформляем код в виде функции (она будет называться make_data_quotes ) и отправляем туда же :) (в модуль quotes). Тогда скрипт загрузки котировок будет таким:
# -*- coding: utf-8
# загружаем модуль quotes
import quotes.quotes as quotes

# каталог для хранения файлов котировок
folder = 'data/'
# файл с сайта "Финам"
qlist = 'quotes/mmvb.txt'
# выгребаем данные с 1.01.2009 по 31.12.2009
#df, mf, yf, dt, mt, yt = 1, 0, 2009, 31, 11, 2009
period = (1, 0, 2009, 31, 11, 2009)
# работаем с днями
interval = 8

# делаем локальную базу котировок
quotes.make_data_quotes(folder, qlist, interval, period)
Обновленные исходники закинуты на GitHub. Собственно говоря, на сегодня все.

Источник: toly-blog.ru