Модуль quotes. Загружаем котировки.


Введение

В этой статье продолжим разговор об эффективной торговле на бирже. Как уже говорилось, статистический анализ котировок является залогом успешной торговли акциями. Но перед тем как обрабатывать котировки необходимо их получить. В качестве источника биржевых цен я выбрал сайт инвестиционной компании «Финам» (ну как сказать выбрал… других ресурсов, где можно получить котировки через веб-интерфейс и без пароля я не нашел).

Анатомия 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 час&nbsp;(с 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 «.

На сегодня все.

P.S. Если кто-нибудь из читателей знает другой веб-ресурс с возможностью загрузки предыдущих цен акций – сообщайте. Тогда можно будет сделать скрипт загрузки истории котировок из несколькои источников.

, ,



  1. #1 by Alexey Grischenko on 27 Апрель 2012 - 11:31

    Есть, < какой-то сайт> сделал автоматическую подкачку по более чем 300 бумаг)

  2. #2 by Serzh on 12 Октябрь 2013 - 13:10

    Спасибо за код!)
    Немного доработал, чтобы загружать данные сразу в pandas dataframe

    def quotes(df, mf, yf, dt, mt, yt, simb, period):
    url = (‘http://195.128.78.52/GAZP_080201_100208.csv?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′)
    df = pd.read_csv(url, sep=’,', index_col=0, parse_dates={‘Date’:[0]}, dayfirst=True)
    df = df[ ['', '', '', '', ''] ]

    adj_close = df[['']]
    adj_close.columns = ['Adj Close']
    df = df.combine_first(adj_close)

    df.columns = ['Close', 'High', 'Low', 'Open', 'Volume', 'Adj Close']

    return df

    df1 = quotes(1, 0, 2010, 30, 0, 2010, 16842, 8)

    print df1

    Столбец Adj Close добавил для того, чтобы потом добавлять в данные в QSTK.

    • #3 by Никита on 20 Июнь 2015 - 16:27

      read_csv выдаёт ошибку, если файл пустой… Это довольно естественно, но нельзя ли как-то это проверить до вызова read_csv? Хочется получить несколько котировок с помощью цикла по simb, но если какой-то инструмент в интересующих промежуток времени не торговался – программа падает с ValueError: no colums to parse from file.

      • #4 by toly on 20 Июнь 2015 - 21:03

        Обернуть в try..except можно

        • #5 by Никита on 24 Июнь 2015 - 11:26

          Спасибо! Сделал сначала выверт с запоминанием места, где программа падает, и циклом в терминале х)

  3. #6 by ЛЛ on 17 Апрель 2014 - 13:38

    на http://finance.yahoo.com/ данные ещё хорошо добывать

  4. #7 by RABBITSV on 23 Апрель 2014 - 11:51

    Огромнейшее спасибо автору за статью! Невероятно полезная информация! :)

  5. #8 by Dmitry on 28 Апрель 2016 - 16:29

    Да, статья отличная! Спасибо, очень выручил!

  6. #9 by Pacifik80 on 11 Февраль 2017 - 19:48

    Не раскрыта только тема как находить em параметр

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