В этой статье продолжим разговор об эффективной торговле на бирже. Как уже говорилось, статистический анализ котировок является залогом успешной торговли акциями. Но перед тем как обрабатывать котировки необходимо их получить.
В качестве источника биржевых цен я выбрал сайт инвестиционной компании "Финам" (ну как сказать выбрал... других ресурсов, где можно получить котировки через веб-интерфейс и без пароля я не нашел).
Анатомия finam.ru
Для работы предпочтительно сохранить файл с котировками на компьютер. На сайте есть удобный инструмент для этих целей, расположенный по адресу http://www.finam.ru/analysis/export/default.asp. Здесь можно выбрать секцию рынка, наименование акции (контракт), требуемый период и другие параметры. Сразу определимся со значениями передаваемых параметров:
Естественно, даты, временной интервал и наименование акции будут изменяемыми.
Понаблюдаем механизм обмена данными при получении котировок. Для этого используем сетевой анализатор WireShark.
секцию рынка, наименование акции (контракт), требуемый период и другие параметры. Сразу определимся со значениями передаваемых параметров:
Как видим - ничего сложного: обычный GET-запрос. Ознакомившись с HTML-кодом формы все становится предельно ясным.
Строка запроса: /GAZP_100716_100716.txt?d=d&market=1&em=16842 &df=16&mf=6&yf=2010&dt=16&mt=6&yt=2010 &p=7&f=GAZP_100716_100716&e=.txt&cn=GAZP&dtf=1 &tmf=1&MSOR=0&sep=3&sep2=1&datf=5
Итак изменяемые параметры:em - номер финансового инструмента (в нашем случае Газпром - 16842)
df, mf, yf - день, месяц, год даты начиная с которой выдавать котировки
dt, mt, yt - дата по которую выдаются котировки
p - временной интервал (7 означает, что временной интервал 1 час)
Функция quotes
Теперь напишем функцию для получения котировок.
def 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()
f.close()
return string.split(quot, '\\n')[1:-1]
Остановлюсь подробнее на параметрах simb и period.
simb - номер торгового инструмента (см. скриншот) :
period - периодичность котировок. Из фрагмента HTML-кода формы экспорта котировок видно как выбирать этот параметр:
<tr valign="top">
<td><label for="p">Периодичность</label></td>
<td>
<select tabindex="9" id="p" name="p" onChange='javascript:rebuildDataFormat(document.chartform.datf, this.options[this.selectedIndex].value)'>
<option value=1>тики<option value=2>1 мин.
<option value=3>5 мин.
<option value=4>10 мин.
<option value=5>15 мин.
<option value=6>30 мин.
<option value=7 selected>1 час
<option value=11>1 час (с 10:30)
<option value=8>1 день
<option value=9>1 неделя
<option value=10>1 месяц
</select>
</td>
</tr>
Пример запроса котировок Газпрома (январь 2010)
Следующий код получает и построчно выводит дневные котировки акций Газпрома за январь 2010 года (так как месяца на finam.ru нумеруются с нуля, в качестве номера месяца указываем 0):
qq = quotes(1, 0, 2010, 30, 0, 2010, 16842, 8)
for q in qq:
print q[:-1]
После запуска смотрим на экран:
секцию рынка, наименование акции (контракт), требуемый период и другие параметры. Сразу определимся со значениями передаваемых параметров:
Убедившись, что все работает как надо, для дальнейшей работы сохраняем файл с функцией как модуль "quotes.py ".