Лекция Стивена Вольфрама

ВНИМАНИЕ!!!

БЛОГ ПЕРЕЕХАЛ НА НОВЫЙ АДРЕС https://blog.wolframmathematica.ru

Онлайн машина вычисления знаний Wolfram|Alpha ®

Онлайн машина вычисления знаний Wolfram|Alpha ®

воскресенье, 30 июня 2013 г.

Извлечение данных о финансовых индикаторах из среды Web
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_Large.png
Извлечение данных о финансовых индикаторах
из среды Web

Макаренко А. В., научно-исследовательская группа “Конструктивная Кибернетика”, руководитель
Общее количество использованных в посте встроенных функций или символов: 66

Список имен используемых встроенных функций и символов в порядке их появления в коде:
Times (*, ×) | CompoundExpression (;) | Set (=) | $HistoryLength | List ({...}) | Map (/@) | ToString | Part ([[…]]) | DateList | Rule (->, ->) | TimeZone | $TimeZone | Span (;;) | Function (&) | ImportString | URLFetch | Last | Slot (#) | StringJoin (<>) | StringTake | Import | SameQ (===) | StringTrim | StringReplace | StringCases | StringExpression (~~) | Pattern (:) | BlankNullSequence (___) | Flatten | StringSplit | ToExpression | Short | First | Length | Apply (@@) | And (&&, ∧) | Table | Plus (+) | Remove | Accumulate | DateDifference | Partition | Prepend | Red | Blue | Darker | Green | Orange | Brown | DateListPlot | Joined | True | PlotStyle | Directive | Thick | ImageSize | AspectRatio | Power (^) | PlotLabel | Style | PlotLegends | Placed | SwatchLegend | LegendLayout | LegendMarkerSize | Bottom
Оригинал данного поста доступен по ссылке.
Введение
Допустим Вы, также как и автор данной заметки, ведёте научные исследования в области приложения математических методов к финансовой сфере. И Вам для анализа понадобились какие-то данные, которые доступны в сети Интернет. Вы можете конечно поступить по “старинке” – взять и скопировать эти данные из интернет браузера  в какой-нибудь текстовый редактор, там их распарсить, структурировать и скопировать файл в нужное место. У этого подхода есть несколько “но”, основные из них это: трудности при большом объёме данных или при сложной структуре их организации; низкая эффективность труда при многократных, однотипных запросах. Путь второй – написать на каком-нибудь универсальном языке программирования высокого уровня (например C/C++, C#, Java, Python, PHP, Perl, Ruby, Haskell – читатели продолжают...) собственное приложение (скрипт), которое запросит данные, распарсит их, структурирует и сохранит их в файл или в базу данных. Тогда основные недостатки первого подхода аннулируются, но появляются другие, а именно: скорость разработки, и затраты на отладку. Есть и ещё одна проблема – знание этих самых языков и умение решать на них требуемые задачи. Автор заметки, например, знает С/С++, но в объёме, необходимом для разработки консольных вычислительных приложений (OpenMP, MPI, Intel MKL) для высокопроизводительных кластеров. Как делать запрос к сайту, и парсить HTML на C/C++ – для него это великая тайна. К счастью, есть третий путь.
Для начала вспомним, для чего нам нужны эти самые финансовые (или иные) данные, доступные в сети Интернет. Правильно – для математических манипуляций с ними. Если Вам вполне хватает табличных редакторов (типа Microsoft Exсel), тогда по всей видимости Вам вполне подойдёт описанный выше первый путь. Если считате в чём-то помощней (например PTC MathCAD), то у Вас появляются аргументы для перехода на ещё более мощные решения (см. далее). Если Вы все свои математические расчёты делаете в программах, собственноручно написанных  на каком-нибудь из универсальных языков программирования высокого уровня, то это конечно хардкор, но насколько это эффективно? Встречный вопрос: а что эффективно? Автор считает что эффективно – это Wolfram Mathematica. Это и есть третий путь.
Ниже мы продемонстрируем, как с помощью этой программы можно организовать многократную выгрузку данных из Web, их парсинг, структурирование и сохранение. Что касается нативной математической обработки, то её естественно можно (и нужно) проводить в этой же мощной среде. В качестве ремарок. Во-первых, эта заметка возникла не на пустом месте. Автор использовал этот подход (код программы см. ниже) для получения результатов, кратко изложенных в докладе: A.V. Makarenko, Symbolic CTQ-analysis – a new method for studying of financial indicators // International Conference “Advanced Finance and Stochastics” / Book of Abstracts – Moscow, 24-28 June 2013, Steklov Mathematical Institute, pp. 63-64. Презентация доступна по ссылке. Во-вторых, для хардкодеров (а также и халиварщиков) будет полезен пост: Jon McLoone, Code Length Measured in 14 Languages. Текст поста доступен по ссылке.
Извлечение данных из среды Web
Итак, организуем выгрузку данных, с официального web-сайта Центрального Банка РФ, о курсах 5-ти базовых валют (USD [Долар США], EUR [Евро], JPH [Японская йена], CHF [Швейцарский франк], GBP [Фунт стерлингов Соединенного королевства]) по отношению к RUB [Рубль РФ]. Для начала сконфигурируем среду и зададим ряд исходных констант:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Далее изучим структуру web-страницы, содержащую необходимый нам запрос. Он имеет вот такой вид (на момент написания заметки):
http://www.cbr.ru/currency_base/dynamics.aspx?VAL_NM_RQ=R01010&date_req1=01.06.2013&r1=1&date_req2=10.06.2013&C_month=06&C_year=2013&rt=1&mode=1&x=23&y=6.
Важное замечание: ЦБ РФ сравнительно редко, но меняет интерфейс доступа к данным, поэтому вид запроса может измениться и потребуется модификация кода связанного с организацией запроса и первичным парсингом html страниц.
Присвоим ряду констант их значения:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Далее получим дополнительные данные, необходимые для корректного выполнения запроса:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_1.gif
И, наконец, получим текстовое содержимое HTML страниц:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Посмотрим на результат запроса (для валюты USD):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_2.gif
Примечание: Весьма мощная функция URLFetch[...] появилась в 9-й версии Wolfram Mathematica и в ответ на запрос выдаёт сырой HTML, поэтому дополнительно к ней используется функция ImportString[...], которая из сырого HTML извлекает “чистый” текст.
Что делать, если 9-й версии Wolfram Mathematica у Вас нет, а работать всё же необходимо? Тогда скачать последнюю полнофункциональную версию программы Вы можете отсюда (на момент написания поста, это 9.0.1).  Если скачивать Вы не хотите (не можете), то тогда у Вас два пути: первый – см. начало заметки; второй – вместо функции  URLFetch[...] использовать функцию Import[...]. Эта функция, кстати, доступна в Wolfram Mathematica начиная c 4-й версии (последняя модификация произведена в 7-й версии).
Для удобной работы с функцией Import[...] присвоим ряду констант их значения:
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_3.gif
Далее, сформируем полный URL адрес запроса, и выполним сам запрос:
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_4.gif
Ради эксперимента проверим идентичность данных, полученных с помощью функций URLFetch[...] и Import[...]:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_5.gif
Как видно из вышеизложенного, доступ к содержимому web-сайта осуществляется почти в одну строку (в одну функцию). То есть если знать синтаксис языка Wolfram и понимать что делаешь, то загружать html страницы средствами Mathematica практически также просто, как вбивать запрос в адресную строку браузера и нажимать Enter. Остальное делается фактически также легко и красиво.
После получения сырых данных, отфильтруем их и подготовим к распознаванию:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Важное замечание: ЦБ РФ периодически меняет интерфейс доступа к данным, может потребоваться модификация кода.
Посмотрим на результат фильтрации сырых данных:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_6.gif
Собственно этап распознавания (по идее этот код, и тот что ниже, уже не зависит от интерфейса доступа к данным, но связан со структурой и представлением данных):
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Посмотрим на результат распознавания и перевода данных в машиночитаемый формат:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_7.gif
Что мы видим? Парсинг таблицы из трёх столбцов и двух типов данных, простого – Real и сложного – Date, осуществлён в три строки. Просто, эффективно, и элегантно. На самом деле код можно ещё сократить, но уже с потерей читаемости и понимания. Поэтому мы этого делать не будем, не тот случай, как говорится.
Извлекаем список дат, проверяем их сопоставимость:
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_8.gif
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_9.gif
Очищаем память от всего объёмного и ненужного:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Далее осуществляем ряд сервисных операций:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Отобразим полученные данные:
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_10.gif
Если Вы сделали всё правильно (и web-сайт ЦБ РФ доступен), то должны увидеть вот такой красивый и информативный рисунок:
Нажмите, чтобы получить возможность скопировать код Wolfram Mathematica
закрыть
Izvlechenie_dannyh_o_finansovyh_indikatorah_iz_sredy_Web_11.gif
Далее данные можно сохранить либо в файл с помощью функций Export[...], Write[...] – зависит от Ваших задач, либо в базу данных – используя Database Connectivity.
Вместо заключения
Самое главное. С полученными данными возможно производить самые разнообразные вычисление не выходя из Wolfram Mathematica: встроенные в неё средства могут удовлетворить практически любые научные (и не только научные) любопытство и потребности, а если Вы умеете писать расширения к Mathematica – то Ваши возможности ограничиваются только законами нашей (а может Вашей) Вселенной. :)
Естественно, данный код, при его надлежащей модификации, можно адаптировать и для других наборов данных и для других web-сайтов и даже для других задач, находящихся весьма далеко от области финансовой математики и её приложений. Данная заметка только демонстрирует подход и показывает некоторые приёмы работы с Wolfram Mathematica. Дальше дело за вами. Но начало, положено!
Данный пост Вы также можете скачать в формате Wolfram CDF:
Данный документ распространяется на условиях лицензии:  Creative Commons «Attribution-NonCommercial-ShareAlike» («Атрибуция — Некоммерческое использование — На тех же условиях») 3.0 Непортированная.

Блог принадлежит “Русскоязычной поддержке Wolfram Mathematica
При любом использовании материалов блога, ссылка на блог обязательна.
SpikeyСоздано с помощью Wolfram Mathematica 9

2 комментария:

  1. Андрей, добрый день! Есть более стабильный способ брать данные по динамике валюты с сайта Банка Росси через API, см. здесь http://cbr.ru/scripts/Root.asp?Prtid=SXML

    ОтветитьУдалить
    Ответы
    1. Александр, здравствуйте!

      Спасибо за информацию. В своё время я как-то прошёл мимо раздела "Технические ресурсы" на web-сайте ЦБ РФ, теперь исправляюсь. :) С другой стороны, изложенный в посте способ имеет, на мой взгляд, методическую ценность: на многих сайтах очень часто нет API, но есть доступ к "сырым" html.

      С уважением,
      Андрей Макаренко.

      Удалить