Модуль 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. Собственно говоря, на сегодня все.

,



  1. #1 by Юрий on 13 Август 2010 - 13:50

    Здравствуйте,
    Я новичок в Питоне и в регулярных выражениях. По-моему необходимо немного изменить регулярное выражение в функции get_symbols на следующие

    symbols = re.findall(r'<A>([^<]+)</A>',txt, re.IGNORECASE)

    Проблема в том как получен файл mmvb.txt
    Разные программы сохряют по разному.
    Например: Эксполеер добавляет перевод строки между id и taget и теги <A> в верхнем регистре.
    Для firefox что Вы привели подходит.

    • #2 by toly on 13 Август 2010 - 14:23

      Все верно, я согласен с Вами.

      Просто про винду я уже почти месяц не вспоминаю (даже Quik под wine запускаю), а про Explorer еще больше.

  2. #3 by ckazzku on 5 Январь 2012 - 19:52

    from urllib import urlopen
    from re import findall

    def get_symbols():
    «»" Получает список всех доступных эмитентов по ММВБ «»"
    f = urlopen(‘http://www.finam.ru/EmitentSearch2.asp?f=search&t=1&n=’)
    symbols_file = f.read().decode(‘cp1251′)
    symbols = findall(r’]+)>(S+)’, symbols_file)
    return symbols

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