Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 500 сообщений
Cообщения с меткой

котировки - Самое интересное в блогах

Следующие 30  »
kekyadinee2

Без заголовка

Понедельник, 25 Сентября 2017 г. 19:09 (ссылка)

Котировки валют на сегодня в Москве - https://vk.com/page-146451225_54983251

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Визуализация данных Московской Биржи с помощью InterSystems DeepSee. Часть I

Вторник, 15 Августа 2017 г. 09:49 (ссылка)

Введение



В стеке технологий InterSystems есть технология для разработки аналитических решений DeepSee. Это встраиваемая аналитическая технология и набор инструментов для создания систем поддержки принятия эффективных решений, в том числе, и с применением прогнозных моделей. DeepSee работает со структурированными и неструктурированными данными. Она предназначена для создания OLAP-решений для баз данных Cach'e и любых реляционных СУБД. InterSystems DeepSee предоставляет разработчикам средства для внедрения в свои приложения аналитической OLAP-функциональности, которая способна работать на оперативных базах данных приложений без создания отдельной инфраструктуры для решения аналитических задач.



В статье рассматривается пример создания в OLAP-куба, работа со средствами аналитики и построение пользовательского интерфейса на примере анализа котировок акций торгуемых на Московской Бирже.



Этапы




  • Получение данных

  • ETL

  • Построение куба

  • Построение сводной таблицы

  • Построение дашборда

  • Визуализация



Получение данных



Для визуализации данных о котировках акций необходимо их сначала загрузить. У Московской Биржи есть публичное задокументированное API, которое предоставляет информацию о торговле акциями в форматах HTML, XML, JSON, CSV.

Вот, к примеру, XML данные за 27 мая 2013 года. Создадим XML-Enabled класс Ticker.Data в платформе InterSystems:



Ticker.Data
Class Ticker.Data Extends (%Persistent, %XML.Adaptor)
{

/// Дата торгов
Property Date As %Date(FORMAT = 3, XMLNAME = "TRADEDATE", XMLPROJECTION = "attribute");

/// Краткое название компании
Property Name As %String(XMLNAME = "SHORTNAME", XMLPROJECTION = "attribute");

/// Тикер
Property Ticker As %String(XMLNAME = "SECID", XMLPROJECTION = "attribute");

/// Количество сделок
Property Trades As %Integer(XMLNAME = "NUMTRADES", XMLPROJECTION = "attribute");

/// Общая сумма сделок
Property Value As %Decimal(XMLNAME = "VALUE", XMLPROJECTION = "attribute");

/// Цена открытия
Property Open As %Decimal(XMLNAME = "OPEN", XMLPROJECTION = "attribute");

/// Цена закрытия
Property Close As %Decimal(XMLNAME = "CLOSE", XMLPROJECTION = "attribute");

/// Цена закрытия официальная
Property CloseLegal As %Decimal(XMLNAME = "LEGALCLOSEPRICE", XMLPROJECTION = "attribute");

/// Минимальная цена акции
Property Low As %Decimal(XMLNAME = "LOW", XMLPROJECTION = "attribute");

/// Максимальная цена акции
Property High As %Decimal(XMLNAME = "HIGH", XMLPROJECTION = "attribute");

/// Средневзвешенная цена акции http://www.moex.com/s1194
/// Может считаться как за день так и не за период.
Property Average As %Decimal(XMLNAME = "WAPRICE", XMLPROJECTION = "attribute");

/// Количество акций участвовавших в сделках
Property Volume As %Integer(XMLNAME = "VOLUME", XMLPROJECTION = "attribute");

}


И напишем загрузчик данных в формате XML. Так как класс у нас XML-Enabled то конвертация из XML в объекты класса Ticker.Data происходит автоматически. Аналогичного поведения можно достичь для данных в форматах JSON (через динамические объекты) и CSV (используя %SQL.Util.Procedures). Так как API отдаёт данные за определённую дату (день) то нам надо итерировать по дням и сохранять поступающие данные. Кроме того данные о котировках акций приходят страницами по 100 записей. Загрузчик может выглядеть так:



Загрузчик данных
/// Загрузить информацию об акциях начиная с From и заканчивая To. Purge - удалить все записи перед началом загрузки
/// Формат From, To - YYYY-MM-DD
/// Write $System.Status.GetErrorText(##class(Ticker.Loader).Populate())
ClassMethod Populate(From As %Date(DISPLAY=3) = "2013-03-25", To As %Date(DISPLAY=3) = {$ZDate($Horolog,3)}, Purge As %Boolean = {$$$YES})
{
#Dim Status As %Status = $$$OK
// Переводим даты во внутренний формат для простоты итерации
Set FromH = $ZDateH(From, 3)
Set ToH = $ZDateH(To, 3)

Do:Purge ..Purge()

For DateH = FromH:1:ToH {
Write $c(13), "Populating ", $ZDate(DateH, 3)
Set Status = ..PopulateDay(DateH)
Quit:$$$ISERR(Status)
}

Quit Status
}

/// Загрузить данные за день. Данные загружаются страницами по 100 записей.
/// Write $System.Status.GetErrorText(##class(Ticker.Loader).PopulateDay($Horolog))
ClassMethod PopulateDay(DateH As %Date) As %Status
{
#Dim Status As %Status = $$$OK

Set Reader = ##class(%XML.Reader).%New()
Set Date = $ZDate(DateH, 3) // Преобразовать дату из внутреннего формата в YYYY-MM-DD
Set Count = 0 // Число загруженных записей

While Count '= $G(CountOld) {
Set CountOld = Count
Set Status = Reader.OpenURL(..GetURL(Date, Count)) // Получаем следующую страницу данных
Quit:$$$ISERR(Status)

// Устанавливаем соответствие нода row == объект класса Ticker.Data
Do Reader.Correlate("row", "Ticker.Data")

// Десериализуем каждую ноду row в объект класса Ticker.Data
While Reader.Next(.Object, .Status) {
#Dim Object As Ticker.Data

// Сохраняем объект
If Object.Ticker '="" {
Set Status = Object.%Save()
Quit:$$$ISERR(Status)
Set Count = Count + 1
}
}
Quit:(Count-CountOld)<100 // На текущей странице меньше 100 записей => эта страница - последняя
}
Quit Status
}

/// Получить URL с информацией о котировках акций за дату Date, пропустить первые Start записей
ClassMethod GetURL(Date, Start As %Integer = 0) [ CodeMode = expression ]
{
$$$FormatText("http://iss.moex.com/iss/history/engines/stock/markets/shares/boards/tqbr/securities.xml?date=%1&start=%2", Date, Start)
}


Теперь загрузим данные командой: Write $System.Status.GetErrorText(##class(Ticker.Loader).Populate())



Весь код доступен в репозитории.



ETL



Как известно, для построения OLAP-куба в первую очередь необходимо сформировать таблицу фактов: таблицу операций, записи которой требуется группировать и фильтровать. Таблица фактов может быть связана с другими таблицами по схеме звезда или снежинка.



Таблица фактов для куба обычно является результатом работы аналитиков и разработчиков по процессу, который называется ETL (extract, transform, load). Т.е. из данных предметной области делается “выжимка” необходимых для анализа данных, и переносится в удобную для хранилища структуру "звезда"/"снежинка": факты и справочники фактов.

В нашем случае этап ETL пропустим т.к. наш класс Ticker.Data уже находятся во вполне удобном для создания куба состоянии.



Построение куба



DeepSee Architect — это веб-приложение для создания OLAP-куба. Для перехода к DeepSee Architect откроем Портал Управления Системой -> DeepSee -> Выбор области -> Architect. Открывается рабочее окно Архитектора.



Возможно нужно будет выбрать область, которая поддерживает DeepSee. В том случае если вы не видите вашей области в списке областей DeepSee перейдите в Портал Управления Системой -> Меню -> Управление веб-приложениями -> /csp/область, и там в поле Включен поставьте галочку DeepSee и нажмите кнопку сохранить. После этого выбранная область должна появиться в списке областей DeepSee.



Создаем новый куб.



Нажав на кнопку "Создать" попадаем на экран создания нового куба, там необходимо установить следующие параметры:




  • Имя куба — название куба используемое в запросах к нему

  • Отображаемое Имя — локализуемое название куба (перевод осуществляется стандартными механизмами InterSystems)

  • Источник Cube — использовать таблицу фактов или другой куб в качестве источника данных

  • Исходный класс — если на предыдущем шаге был выбран класс, то указываем в качестве таблицы фактов класс Ticker.Data.

  • Имя класса для куба — имя класса, в котором будет храниться определение куба. Создаётся автоматически

  • Описание класса — произвольное описание



Вот как выглядит наш новый куб:



Создание куба



Определяем свойства куба



После нажатия кнопки OK будет создан новый куб:



Новый куб



Слева выводятся свойства базового и связанных с ним по “снежинке” классов, которые можно использовать при построении куба.

Центральная часть экрана — это скелет куба. Его можно наполнить свойствами класса с помощью drag-n-drop из области базового класса, либо добавляя элементы вручную. Основными элементами куба являются измерения, показатели и списки.



Измерения (Dimensions)



Измерения — это элементы куба, которые группируют записи таблицы фактов. В измерения обычно относят “качественные” атрибуты базового класса, которые разбивают все записи таблицы фактов по тем или иным срезам. Например нам бы хотелось группировать все факты по названиям инструментов и по датам.



Для разбиения фактов по тикерам прекрасно подойдет свойство Ticker.

Перетянем Ticker на область измерений — в результате Архитектор добавит в куб измерение Ticker с одной иерархией H1 и одним уровнем Ticker. Укажем отображаемые названия в подписях к измерению и уровню.



Измерение



Измерения помимо группировки позволяют строить иерархии вложенности фактов от общего к частному. Типичным примером является измерение по дате, которое обычно часто требуется представить в виде иерархии Год-Месяц-День.

Для свойств типа дата(например как у свойства Date тип %Date) в DeepSee есть специальный тип измерения time, в котором уже предусмотрены часто используемые функции для создания иерархий по дате. Воспользуемся этим и построим трехуровневую иерархию Год-месяц-день с помощью свойства Date.



Измерение 2



Заметим, что в измерении есть элементы: собственно измерение, иерархия и уровни этой иерархии (Level). Любое измерение куба состоит как минимум из одной иерархии в котором в простейшем случае всего один уровень.



Показатели (Measures)



Показатели или метрики это такие элементы куба, куда относят какие-либо "количественные" данные, которые необходимо посчитать для "качественных" измерений куба (Dimensions).

Например в таблице фактов такими показателями могут быть свойства Volume (количество акций) и Average (Средняя цена). Перетянем свойство Volume на область показателей и создадим показатель "Количество" с функцией SUM, которая будет считать общее количество акций в текущем срезе.

Добавим также в показатели свойство Average и укажем в качестве функции расчета MAX — расчет максимального значения. С целью использования цены для визуализации изменения максимальной цены акции во времени.



Показатели



Списки (Listings)



Списки — это элементы куба, описывающие способ доступа к исходным данным куба, позволяя перейти от агрегированных к исходным данным куба. Как правило при работе с кубом, аналитик просматривает агрегированную информацию в различных срезах. Однако, часто возникает необходимость посмотреть на исходные факты, которые вошли в текущий срез. Для этого и создаются листинги — они перечисляют набор полей таблицы фактов, который нужно отобразить при переходе к просмотру фактов Drillthrough. Создадим простой листинг нажав кнопку "Добавить элемент":

Листинг 1



Теперь зададим поля таблицы фактов, которые надо выводить. Например выведем информацию о тикерах и колебаних их цены за день (Name, Ticker, "Open", CloseLegal, Low, Average, High):



Листинг 2



Компиляция куба



Итак мы добавили в куб два показателя, два измерения и один листинг — этого вполне достаточно и уже можно посмотреть, что получилось.

Скомпилируем класс куба (Кнопка "Компилировать"). Если ошибок компиляции нет, значит куб создан правильно и можно наполнить его данными.

Для этого нужно нажать "Построить куб" — в результате DeepSee загрузит данные из таблицы фактов в хранилище данных куба.

Для работы с данными куба нам пригодится другое веб-приложение — DeepSee Analyzer.



Построение сводной таблицы (Pivot)



DeepSee Analyzer — визуальное средство для непосредственного анализа данных кубов и подготовки источников данных для дальнейшей визуализации. Для перехода к DeepSee Analyzer откроем Портал Управления Системой -> DeepSee -> Выбор области -> Analyzer. Открывается рабочее окно Аналайзера.

Analyzer

В рабочем окне Аналайзера слева мы видим элементы созданного куба: показатели и измерения. Комбинируя их мы строим запросы к кубу на языке MDX — аналоге языка SQL для многомерных OLAP кубов.

Рассмотрим интерфейс Аналайзера. Справа — поле сводной таблицы. В поле сводной таблицы Аналайзера всегда показывается результат выполнения MDX-запроса. Посмотреть текущий MDX-запрос можно если нажать кнопку Source. При первом открытии куба в поле сводной таблицы по умолчанию показывается количество записей в таблице фактов — в нашем случае это количество записей в классе Ticker.Data. Этому соответствует MDX: SELECT FROM [TICKER].



Чтобы создать сводную таблицу перетянем в поле колонок измерение “Год”. Показателем выберем "Объём". В результате получим таблицу количества проданных акций по годам.

Pivot 1

Далее перетянем измерение “Тикер” в поле колонок и получим уже сводную таблицу количества акций по инструментам, с разбиением по годам:

Pivot 2



Сейчас для каждой ячейки полученной таблицы рассчитывается одна величина — суммарное количество акций участвовавших в сделках (в случае если не выбран ни один показатель, считается количество фактов — в данном случае это можно интерпретировать как количество дней торговли инструмента). Это можно изменить. Добавим показатель "Средняя цена". В результате можно видеть уже более интересную картину: сводная таблица отображает среднюю максимум цены по каждому инструменту за год.



Pivot 3



Как мы помним, в определении куба у нас заложена иерархия по датам. Это значит что по измерению Дата возможна операция DrillDown (переход по иерархии измерения от общего к частному). В Аналайзере двойной щелчок по заголовку измерения приводит переходу к следующему по иерархии измерению (DrillDown). В данном случае двойной клик по году приведет к переходу к месяцам этого года, а двойной клик на месяце — к переходу на уровень дней. В итоге можно посмотреть как менялась средняя цена акции для дней или месяцев.



Pivot 4



На предыдущем этапе мы создали листинг — инструмент перехода от агрегированных данных к исходным фактам. Выберем любую строку сводной таблицы и нажмём кнопку Drillthrough для перехода к листингу:

Drillthrough 2



Следующий этап — визуализация. Перед сохранением упростим сводную таблицу и сохраним её под именем TickersByYears.

Pivot 5



Построение дашборда (Dashboard)



Портал Пользователя — это веб-приложение для создания и использования дашбордов (панелей индикаторов). Дашборды содержат виждеты: таблицы, графики и карты на основе сводных таблиц, созданных аналитиками в Аналайзере.

Для перехода к Порталу Пользователя DeepSee откроем Портал Управления Системой -> DeepSee -> Выбор области -> Портал Пользователя.

Portal

Создадим новый дашборд нажав на стрелку справа -> добавить -> Добавить индикаторную панель

Portal2



Создадим виджет нажав на стрелку справа -> Виджеты -> "+" -> Линейная диаграмма с маркерами. В качестве источника данных выберем TickersByYears:

Widget



Однако читатель возразит — это же средняя температура по больнице. И будет прав. Добавим фильтрацию по инструменту. Для этого нажмём стрелку справа -> Виджеты -> Виджет 1 -> Элементы управления -> "+". Форма создания нового фильтра выглядит следующим образом:

Filter



А вот так выглядит наш виджет с фильтром. Пользователь может изменить значение фильтра на любое другое.

Widget 2



После этого сохраним дашборд.



Установка MDX2JSON и DeepSeeWeb



Для визуализации созданного дашборда можно использовать следующие OpenSource решения:




  • MDX2JSON — REST API предоставляет информацию о кубах, пивотах, дашбордах и многих других элементах DeepSee, в частности — результатах исполнения MDX запросов, что позволяет встраивать пользовательский интерфейс аналитического решения на DeepSee в любое современное Web или мобильное приложение.

  • DeepSeeWeb — AngularJS приложение, предоставляющее альтернативную реализацию портала пользователя DeepSee. Может быть легко кастомизирован. Использует MDX2JSON в качестве бэкэнда. Вот пример дашборда визуализированного в DeepSeeWeb:



DeepSeeWeb



Установка MDX2JSON



Для установки MDX2JSON надо:




  1. Загрузить Installer.xml и импортировать его в любую область с помощью Studio, Портала Управления Системой или Do $System.OBJ.Load(file).

  2. Выполнить в терминале (пользователем с ролью %ALL): Do ##class(MDX2JSON.Installer).setup()



Для проверки установки надо открыть в браузере страницу http://server:port/MDX2JSON/Test?Debug. Возможно потребуется ввести логин и пароль (в зависимости от настроек безопасности сервера). Должна открыться страница с информацией о сервере. В случае получения ошибки, можно почитать на Readme и Wiki.



Установка DeepSeeWeb



Для установки DeepSeeWeb надо:




  1. Загрузить установщик и импортировать его в любую область с помощью Studio, Портала Управления Системой или Do $System.OBJ.Load(file).

  2. Выполнить в терминале (пользователем с ролью %ALL): Do ##class(DSW.Installer).setup()



Для проверки установки надо открыть в браузере страницу http://server:port/dsw/index.html. Должна открыться станица авторизации. В области SAMPLES представлено множество уже готовых дашбордов и все они автоматически отображаются в DeepSeeWeb.



Визуализация



Откроем http://server:port/dsw/index.html и авторизируемся, также нужно указать область с кубом. Откроется список дашбордов, в нашем случае есть только один созданный дашборд "Акции". Откроем его:



DSW



Отображается наш созданный виджет. Для него поддерживается Drilldown и фильтр созданный в Портале Пользователя DeepSee:



DSW 2



Выводы



InterSystems DeepSee является мощным инструментом создания OLAP-решений, предоставляя разработчикам средства для создания и внедрения в свои приложения аналитической OLAP-функциональности, которая способна работать на оперативных базах данных приложений без создания отдельной инфраструктуры для решения аналитических задач. В следующий части я расскажу про различные варианты визуализации данных.



Ссылки




Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/335586/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

[Из песочницы] Программный сбор данных о котировках

Воскресенье, 09 Июля 2017 г. 16:36 (ссылка)

Заголовок обязывает перейти непосредственно к программному коду… Но, думаю, все же необходима вводная часть. А зачем, собственно, это нужно?



Эффективные действия на бирже связаны с тщательным анализом происходящего на рынке. Что кроется за динамикой цифр, котировок?



Отсутствие такого анализа, либо сумбурное принятие решений по сделке может привести к потерям. Мне не раз приходилось наблюдать за тем, как люди принимали решения — правильные… или не правильные — в дилинговом зале брокерской конторы.



Дилинговые залы брокерских контор… там существует своя, особая атмосфера. Атмосфера общения, обмена опытом, эмоциями. Мне нравятся дилинговые залы. По тому как человек входит в сделку, трейдеров можно разделить на две группы. Я буду говорить о тех, чей результат, как правило, печален. И таких трейдеров — большинство. Итак — описываю процесс входа в рынок трейдера соответствующей группы. В дилинговый зал вбегает мужчина лет 20-60 выкрикивает: «Куда идем?! Вверх?! Вниз?!» Со стороны встречающих слышаться неоднозначные выкрики «Вверх! Вниз!» Новоприбывший присоединяется к наиболее громко крикнувшей группе и… делает ТЫЦ. ТЫЦ по кнопке покупки или продажи. Все. Теперь человек в рынке. С этого момента он рискует своими деньгами. С этого момента трейдер не похож на трейдера. Он похож на болельщика. Вувузела в руках такого трейдера, думаю, была бы уместным инструментом торговли.





И теперь он уже в составе группы переживает, и со стоном воспринимает все движения рынка. А на новостях получает такой всплеск адреналина, который парням, карабкающимся по склонам горных хребтов, может только сниться.



Результат таких сделок вполне предсказуем. Но… есть ли более счастливый исход? Конечно. И связан он с анализом данных котировок. Как получить эти данные? Как получить эти данные в больших объемах? Как здорово, что есть такая замечательная компания «ФИНАМ» и их интернет-ресурс finam.ru! Сервера «ФИНАМ» предоставляют замечательную возможность — скачивать котировки, например вот по такой форме (например):







Однако, таким образом предоставляется возможность скачать лишь один файл за одну загрузку. А что если мы хотим получить больше данных для анализа? Гораздо больше? Практически по всем инструментам! По всем периодам! Это даст богатейшие возможности для анализа данных. Оу… возможно ли такое? Ответ: да возможно.



Пока же определимся с перечнем бумаг (инструментов), а также с основными принципиальными моментами, которые позволят нам получить данные о котировках. Перечень бумаг (инструментов) которые предоставляться компанией «ФИНАМ» будем брать отсюда:







Эта страница интересна для нас тем, что на ней есть, во-первых, большая часть инструментов которые дает «ФИНАМ»; во-вторых, веб-ссылки, по которым можно перейти непосредственно на страницу каждой ценной бумаги (инструмента).



Ссылки имеют следующий вид:



www.finam.ru/profile/moex-akcii/polymetal-international-plc/export

www.finam.ru/profile/moex-akcii/pllc-yandex-n-v/export

www.finam.ru/profile/moex-akcii/alrosa-ao/export



Пропарсив соответствующую станицу получим файл ссылок. Теперь мы знаем где «живут» инструменты. Файл можете скачать по этой ссылке. Зачем нам место жительства каждого инструмента? Этот параметр нам еще пригодится. Запаситесь терпением. Пока имеем ссылки по 6131 бумаге (инструменту).



Что требует сервер «ФИНАМ»? Какие параметры для получения данных? Давайте попробуем получить один файл, и посмотрим параметры запроса. Скачивая котировки компании Polymetal, имею вот такой GET запрос:

__http://export.finam.ru/POLY_170620_170623.txt?market=1&em=175924&code=POLY&apply=0&df=20&mf=5&yf=2017&from=20.06.2017&dt=23&

mt=5&yt=2017&to=23.06.2017&p=8&f=POLY_170620_170623&e=.txt&cn=POLY&dtf=1&tmf=1&

MSOR=1&mstime=on&mstimever=1&sep=1&sep2=1&datf=1&at=1


Среди всего перечня хотелось бы акцентировать внимание на параметрах em, market, code. Параметр em следует понимать как индекс, своеобразную метку бумаги (инструмента). Если мы хотим скачивать не один инструмент, а массив данных по нескольким бумагам (инструментам) мы должны знать em каждого из них. Переменная market говорит о том, где вращается данная бумага (инструмент) – на каком рынке? Маркетов много: МосБиржа топ***, МосБиржа пифы***, МосБиржа облигации***, Расписки и т.д. Параметр code – это символьная переменная по инструменту.



Итак, для получения файла котировок нам нужно добыть эти три параметра: em и market и code. По всем бумагам (инструментам). Вопрос — где их взять? Ответ: вспоминаем о файле со ссылками. В файле есть, например, такая ссылка:



www.finam.ru/profile/moex-akcii/polymetal-international-plc/export



Зайдем на нее и в исходном коде страницы увидим то, что нам нужно — в элементах javascript сидят наши искомые параметры, которые относятся к данной бумаге (инструменту):



Finam.IssuerProfile.Main.issue = {"quote": {"id": 175924, "code": "POLY", "fullUrl": "moex-akcii/polymetal-international-plc", "title": "Polymetal", "decp": 1, "testDriveEnabled": false, "market": {"id": 1, "title": "МосБиржа акции", "volumeEnabled": true},"info": {"decp": 1, "last": 680, "pchange": 1.87266, "change": 12.50001, "bid": null, "ask": null, "open": 668, "high": 686, "low": 666, "close": 667.5, "volume": 53037, "date": "05.07.2017 18:47:18", "weekMin": 653.5, "weekMax": 688, "monthMin": 653.5, "monthMax": 753, "yearMin": 572, "yearMax": 1009.5,"currency": "руб.","volumeCode": "шт."},"
/*…тут еще куча важных параметров, но они нам не нужны …*/
175924, "url": "/profile/moex-akcii/polymetal-international-plc/secondary/", }, "corporativeEvents": {"quote": 175924, "url": "/profile/moex-akcii/polymetal-international-plc/corporate/", }, "blogsAndGraphs": {"quote": 175924, "url": "__http://whotrades.com/markets/instrument/polymetal-international-plc", "count": "1", "pageSize": 1, "pageNumber": 1, "pagesCount": 1}}};


Заметим, что в данном кусочке кода id — это и есть em; имеется параметр code, а также параметры маркета – id и его русскоязычное название. Данный кусок кода с вариациями присутствует у каждого бумаги (инструмента). Сходим, например, на:



www.finam.ru/profile/moex-akcii/pllc-yandex-n-v/export

www.finam.ru/profile/moex-akcii/alrosa-ao/export



и увидим все то же самое. Теперь, думаю, общая цепочка получения данных понятна: в цикле перебираем ссылки, где живут отдельные бумаги (инструменты). Парсим кусочки javascript, собирая параметры em, market и code для каждой позиции. Имея на руках эти данные, можем программно заходить на сервер «ФИНАМ» и получать файлы котировок. Осталось дело за техникой исполнения.



Чем будем парсить? Парсить будем, используя Java. И… из всех велосипедов я выбираю тот, который стоит у меня в гараже. А именно Jsoup. Хотя можно было бы использовать и htmlunit.







Небольшое уточнение. При парсинге страницы мною были получены также данные – русскоязычное название бумаги (1) и раздел, в который «ФИНАМ» определили данную бумагу (инструмент) (2). Таким образом, на входе парсера имеется три файла. Напомню, имеем 6131 позиций — бумаг (инструментов). Всю эту информацию, а также результаты парсинга объединим в один файл. Код парсера можно скачать по этой ссылке.



В результате выполнения имеем файл function_parameters.csv. Каждая строка файла при построчном считывании может использоваться как перечень параметров для функции обращения к серверу «ФИНАМ» за котировками. Файл function_parameters.csv можно скачать по этой ссылке.



Для того чтобы написать функцию обращения к серверу «ФИНАМ» (а писать мы будем ее на Python), еще раз рассмотрим параметры GET запроса:

__http://export.finam.ru/POLY_170620_170623.txt?market=1&em=175924&code=POLY&apply=0&df=20&mf=5&yf=2017&from=20.06.2017&dt=23&

mt=5&yt=2017&to=23.06.2017&p=8&f=POLY_170620_170623&e=.txt&cn=POLY&dtf=1&tmf=1&

MSOR=1&mstime=on&mstimever=1&sep=1&sep2=1&datf=1&at=1


POLY_170620_170623 – очевидно, что данная строка представляет параметр code, а также временные характеристики.



.txt – расширение файла; расширение упоминается в параметре e; при написании функции следует помнить об этом нюансе.



Примем также во внимание содержимое исходного кода страницы типа www.finam.ru/profile/moex-akcii/gazprom/export внутри тэга form (где name=«exportdata»). Характеризуем показатели.



market, em, code – об этих параметрах, упоминал ранее, при обращении к функции их значения будут приниматься из файла.

df, mf, yf, from, dt, mt, yt, to – это параметры времени.

p — период котировок (тики, 1 мин., 5 мин., 10 мин., 15 мин., 30 мин., 1 час, 1 день, 1 неделя, 1 месяц)

e – расширение получаемого файла; возможны варианты — .txt либо .csv

dtf — формат даты (1 — ггггммдд, 2 — ггммдд, 3 — ддммгг, 4 — дд/мм/гг, 5 — мм/дд/гг)

tmf — формат времени (1 — ччммсс, 2 — ччмм, 3 — чч: мм: сс, 4 — чч: мм)

MSOR — выдавать время (0 — начала свечи, 1 — окончания свечи)

mstimever — выдавать время (НЕ московское — mstimever=0; московское — mstime='on', mstimever='1')

sep — параметр разделитель полей (1 — запятая (,), 2 — точка (.), 3 — точка с запятой (;), 4 — табуляция (»), 5 — пробел ( ))

sep2 — параметр разделитель разрядов (1 — нет, 2 — точка (.), 3 — запятая (,), 4 — пробел ( ), 5 — кавычка ('))

datf — Перечень получаемых данных (#1 — TICKER, PER, DATE, TIME, OPEN, HIGH, LOW, CLOSE, VOL; #2 — TICKER, PER, DATE, TIME, OPEN, HIGH, LOW, CLOSE; #3 — TICKER, PER, DATE, TIME, CLOSE, VOL; #4 — TICKER, PER, DATE, TIME, CLOSE; #5 — DATE, TIME, OPEN, HIGH, LOW, CLOSE, VOL; #6 — DATE, TIME, LAST, VOL, ID, OPER).

at — добавлять заголовок в файл (0 — нет, 1 — да)



После того, как определен перечень параметров, а также установлены источники получаемых данных, пишем вот такую функцию получения котировок. На примере одной бумаги – полюбившегося Polymetal.



# -*- coding: utf-8 -*-
"""
Created on Sat Jun 24 01:46:38 2017

@author: optimusqp
"""
import urllib


code='POLY';
e='.txt';
market='1'
em='175924';
e='.txt';
p='3';
yf='2017';
yt='2017';
month_start='05';
day_start='20';
month_end='06';
day_end='20';
dtf='1';
tmf='1';
MSOR='1';
mstimever='0'
sep='1';
sep2='3';
datf='1';
at='1';


year_start=yf[2:];
year_end=yt[2:];
mf=(int(month_start.replace('0','')))-1;
mt=(int(month_end.replace('0','')))-1;
df=(int(day_start.replace('0','')))-1;
dt=(int(day_end.replace('0','')))-1;


def quotes(code,year_start,month_start,day_start,year_end,month_end,day_end,e,market,em,df,mf,yf,dt,mt,yt,p,dtf,tmf,MSOR,mstimever,sep,sep2,datf,at):

page = urllib.urlopen('http://export.finam.ru/'+str(code)+'_'+str(year_start)+str(month_start)+str(day_start)+'_'+str(year_end)+str(month_end)+str(day_end)+str(e)+'?market='+str(market)+'&em='+str(em)+'&code='+str(code)+'&apply=0&df='+str(df)+'&mf='+str(mf)+'&yf='+str(yf)+'&from='+str(day_start)+'.'+str(month_start)+'.'+str(yf)+'&dt='+str(dt)+'&mt='+str(mt)+'&yt='+str(yt)+'&to='+str(day_end)+'.'+str(month_end)+'.'+str(yt)+'&p='+str(p)+'&f='+str(code)+'_'+str(year_start)+str(month_start)+str(day_start)+'_'+str(year_end)+str(month_end)+str(day_end)+'&e='+str(e)+'&cn='+str(code)+'&dtf='+str(dtf)+'&tmf='+str(tmf)+'&MSOR='+str(MSOR)+'&mstimever='+str(mstimever)+'&sep='+str(sep)+'&sep2='+str(sep2)+'&datf='+str(datf)+'&at='+str(at))
f = open("company_quotes.txt", "w")
content = page.read()
f.write(content)
f.close()

qq = quotes(code,year_start,month_start,day_start,year_end,month_end,day_end,e,market,em,df,mf,yf,dt,mt,yt,p,dtf,tmf,MSOR,mstimever,sep,sep2,datf,at)


Код функции можно скачать также по этой ссылке.



Что дальше? Теперь возможно использовать данную функцию в цикле по имеющимся у нас позициям. Всего имеем, напомню, 6131 позицию. Из файла function_parameters.csv подгружаем параметры, указываем дату, выбираем нужный формат. И, используя данный код, не забудьте о правилах хорошего тона – поставьте задержку в пару секунд в итерацию цикла, дабы не перегружать сервер-источник.



Данных для анализа рынка, думаю, у вас будет предостаточно. Искренне надеюсь, что клиентов у компании «ФИНАМ» после написания данной статьи только прибавится!
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/332700/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
quaytaringpep88

Без заголовка

Воскресенье, 21 Мая 2017 г. 18:53 (ссылка)

Котировки валют на сегодня в Ленинградской области
Подробнее тут - http://kursobmenavalut.com/


Сайт kursobmenavalut.com
По вопросам регистрации и технической поддержки: +7(921)965-66-88

E-mail: grebenko@yandex.ru
http://kursobmenavalut.com/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
prittyflu691

Без заголовка

Воскресенье, 21 Мая 2017 г. 14:58 (ссылка)

Котировки валют на сегодня в Ленинградской области - https://vk.com/page-129471833_52547667

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Курс_Рубля (Автор -_1917)

Julius Baer: Мы ожидаем снижения цен на нефть в ближайшем будущем

Пятница, 20 Января 2017 г. 10:32 (ссылка)


Нефть/1907332_refinery340439_1280 (700x466, 40Kb)













quote.rbc.ru



Julius Baer: Мы ожидаем снижения цен на нефть в ближайшем будущем



«Цены на нефть опустились до $55 за баррель под давлением укрепившегося доллара и активизации производства сланцевых углеводородов в США. В то время как соглашение ОПЕК по снижению объемов производства нефти остается главной темой на рынке, и все внимание приковано к тому, как участники соглашения с... Читать далее




 



Метки: цены на нефть,снижение цен на нефть,доллар-рубль.рф,курс доллара,курс рубля,курс евро,Julius Baer,производства сланцевых углеводородов в США,ОПЕК,производство нефти,валютные курсы,котировки

Комментарии (0)КомментироватьВ цитатник или сообщество
Софья_Гум

Котировки

Среда, 15 Декабря 2016 г. 00:35 (ссылка)

Как то-мама взяла с полки папку с надписью и прочитала ее по слогам: "Коти-ровки". Расхохоталась. Коти разных мастей и в разных количествах всегда жили в доме. И слово котировки показалось ей смешным. Однако многим не до смеха. Свершилось. ФРС принял решение. Что будет с котировками? Народ волнуется, звонят друг другу, обсуждают... А что в сущности случилось? Что изменится в нашей жизни? Ну прикупим мы или не купим еще сто долларов на черный день. А шуму, волнений -- как будто

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
kseniasamohina

Где узнать самый точный индекс доллара и евро

Четверг, 01 Декабря 2016 г. 21:50 (ссылка)
md-eksperiment.org/post/201...ara-i-evro


На сайте форума трейдеров ММВБ вы сможете ознакомиться с курсами обмена валюты, установленных Центральным Банком Российской Федерации на сегодня или завтра.

Комментарии (0)КомментироватьВ цитатник или сообщество
plushewa

Где узнать самый точный индекс доллара и евро

Четверг, 01 Декабря 2016 г. 08:53 (ссылка)
md-eksperiment.org/post/201...ara-i-evro


На сайте форума трейдеров ММВБ вы сможете ознакомиться с курсами обмена валюты, установленных Центральным Банком Российской Федерации на сегодня или завтра.

Комментарии (0)КомментироватьВ цитатник или сообщество
Понтифик_Иванов

Где узнать самый точный индекс доллара и евро

Четверг, 01 Декабря 2016 г. 08:00 (ссылка)
md-eksperiment.org/post/201...ara-i-evro

На сайте форума трейдеров ММВБ вы сможете ознакомиться с курсами обмена валюты, установленных Центральным Банком Российской Федерации на сегодня или завтра.
Комментарии (0)КомментироватьВ цитатник или сообщество
El-ena-k

Блог gallerz.ru

Суббота, 12 Ноября 2016 г. 10:05 (ссылка)


 



Сейчас постоянно появляются много информации, но как найти 100% реальные данные и не напороться на фейк? Для этого есть обзор товаров и услуг gallerz.ru, современный блог, который вещает последние новости. Не зря же его называют галерей мини новостей. Тематика самая разная, например новости из автомира, биржевые котировки, описание товаров в разных интернет-магазинов, реклама новых производителей, что бы вы всегда могли выбрать альтернативу при выборе продуктов. Заходите на галлерз.ру и читайте свежие посты.



3705362_7450016852a254c0cd19fc88124fd786 (700x444, 43Kb)



 



Источник



 



 


Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
torderdtes

Без заголовка

Суббота, 05 Ноября 2016 г. 18:31 (ссылка)

котировки форекс
Подробнее тут - http://traderador.ru/


Компания TRADERADOR
TRADERADOR@mail.ru

TRADERADOR@yandex.ru
http://traderador.ru/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
Invest-Profi

Базовый актив в опционном трейдинге | Интересное о деньгах - Бинарные опционы - Invest-Profi.com

Среда, 23 Марта 2016 г. 17:39 (ссылка)
invest-profi.com/binarnye-o...dinge.html

В опционном трейдинге существует базовый актив, читайте об этом в статье и подберите себе стратегии бинарных опционов: валютные пары, сырье, нефть


1.
Базовый-актив-бинарного-опциона (200x140, 52Kb)
Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<котировки - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda