Основная идея
Есть три вида показателей:
- "Непериодические". Значения этих показателей вводятся нерегулярно, по мере их изменения. Примеры таких показателей: "Количество обыкновенных акций в обращении", "Цена обыкновенной акции".
- "Периодические". Значения этих показателей вводятся с определённой периодичностью (месяц/квартал/год). Примеры таких показателей: данные баланса (как-то: размер оборотных/внеоборотных активов, капитала, долгосрочной/краткосрочной задолженности и т.п.), данные отчёта о прибылях и убытках (как-то: выручка, себестоимость, чистая прибыль и т.п.).
- "Расчетные". Значения этих показателей вычисляются по заданным формулам на основе значений "Непериодических" и "Периодических" показателей, а также значений других "Расчетных" показателей. Например, показатель "Капитализация" может быть вычислен как "Количество обыкновенных акций в обращении" * "Цена обыкновенной акции". А показатель "P/E" может быть вычислен как "Капитализация" / "Чистая прибыль".
Собственно, вся задача конфигурации — это рассчитать "Расчетные" показатели и вывести их в отчёт.
Реализация
На данный момент разработан прототип конфигурации. Соглашусь, что многие архитектурные и программные решения могут быть спорны и неоптимальны, но прототип вполне работоспособен и даже в таком состоянии может использоваться для решения практических задач.
Как это работает (вид снаружи)
Конечным результатом является отчёт с рассчитанными значениями показателей. Находится он в разделе "Отчеты", называется "Расчет показателей" и выглядит примерно вот так (вариант отчёта = "Динамика контрагента"):
Список используемых показателей хранится в справочнике Показатели.
Если у Показателя не установлен флажок "Периодический", то показатель считается "Непериодическим". Например:
Про флажок "Использовать последнее значение для последнего периода"
Если у Показателя установлен флажок "Периодический", то показатель считается "Периодическим" и он должен вводиться с какой-либо периодичностью (месяц/квартал/год). Например:
Если у Показателя установлен флажок "Расчетный", то показатель считается "Расчетным". Например:
У "Расчетного" показателя обязательно должна быть заполнена формула, по которой он рассчитывается (реквизит "Формула расчета").
Формула расчета — это выражение на языке 1С, в котором можно ссылаться на значения других показателей, указывая в квадратных скобках их "условные обозначения". Например, показатель "Капитализация" на приведенном выше скриншоте вычисляется по формуле:
[КолвоАО] * [ЦенаАО] + [КолвоАП] * [ЦенаАП]
При вычислении формулы вместо ссылок на показатели будут подставлены их значения, которые были введены пользователем (в случае, если это ссылка на "Непериодические" или "Периодические" показатели), либо были вычислены ранее (если это ссылка на "Расчетный" показатель).
Ещё один пример "Расчетного" показателя:
Этот показатель вычисляется по формуле:
[Капитализация] / [ЧП]
и его значение зависит от значения другого "Расчетного" показателя с условным обозначением "Капитализация". Порядок расчёта показателей определяется значением реквизита "Порядок", поэтому показатель "Капитализация" ("Порядок" = 100) будет вычислен раньше, чем показатель "P/E" ("Порядок" = 500) и при вычислении показателя "P/E" значение показателя "Капитализация" уже будет известно.
Ещё немного про формулы
Для ввода "Непериодических" и "Периодических" показателей предназначен документ "Ввод показателей". Список документов удобно сгруппировать по Контрагенту и Стандарту отчетности:
При вводе "Непериодических" показателей в документе "Ввод показателей" в качестве значения реквизита "Периодичность" указывается "Нет":
При вводе "Периодических" показателей в документе "Ввод показателей" в качестве значения реквизита "Периодичность" указывается требуемая периодичность (в данном примере "Год"):
Все исходные данные введены, можно строить отчёт!
Вот второй вариант отчета "Расчет показателей", который называется "Сравнение контрагентов" (итоги по группировкам пока считаются неправильно):
Как это работает (вид изнутри)
Конфигурация в текущем виде проста и незатейлива. Есть всего один документ ВводПоказателей, который пишет то, что в него наколотили, в регистр сведений ЗначенияПоказателей. Отчёт РасчетПоказателей выбирает данные из этого регистра сведений, рассчитывает "Расчетные" показатели и выводит всё с помощью СКД. Для расчёта показателей используются три функции из общего модуля ОбщегоНазначенияКлиентСервер : РассчитатьЗначениеПоказателя(), ПроверитьЗначениеПоказателя() и ВычислитьЗначениеПоФормуле(). Есть ещё сервисная обработка ЗагрузкаКотировокММВБ, предназначенная для загрузки котировок акций с сайта rbc.ru. Собственно, и всё.
Содержимое прилагаемого архива:
- fa/src/* — конфигурация, выгруженная в XML-файлы;
- fa/data/data_for_uploadtoxml.xml — тестовые данные по нескольким эмитентам (в т.ч. Газпрому, Роснефти, Сбербанку) в формате XML для загрузки с помощью обработки "Выгрузка и загрузка данных XML.epf".
Как сделать тестовую базу:
- Создаём пустую конфигурацию, в Конфигураторе заходим в меню Конфигурация / Загрузить конфигурацию из файлов…, в качестве каталога-источника указываем каталог src/, обновляем конфигурацию базы данных.
- В режиме Предприятие запускаем обработку "UNIREPS83UploadToXMLВыгрузка и загрузка данных XML.epf" и загружаем данные из файла data/data_for_uploadtoxml.xml.
Известные проблемы/нереализованные хотелки:
- В отчёте неправильно считаются итоги по группировкам (иерархия контрагентов, периоды). Для начала нужно хотя бы просто отключить их вывод, но я не знаю как это сделать в СКД. А в дальнейшем, конечно, хотелось бы их правильно посчитать, чтобы можно было посмотреть общие результаты по отрасли (т.е. группе контрагентов) и в целом по всем компаниям за год.
- При использовании формул с индексами предыдущих периодов, таких как "( [ЧП(-2)] + [ЧП(-1)] + [ЧП(0)] ) / 3", выводятся назойливые сообщения об ошибках о том, что значение показателя не задано. Причина понятна: при расчёте самого первого периоде отчёта действительно ещё нет никаких [ЧП(-2)] и [ЧП(-1)], они появятся только при расчёте следующих периодов. В общем, надо как-то сделать так, чтобы в этом случае сообщение об ошибке не выводилось.
- Выгрузка в Excel/LibreOffice. Вообще, есть ощущение, что оптимальным вариантом работы был бы следующий: исходные данные ("Непериодические" и "Периодические") хранятся в 1С-е, потом это всё выгружается в Excel/LibreOffice, а уже Excel/LibreOffice по формулам сам вычисляет значения "Расчетных" показателей. Но как это можно реализовать я пока не представляю. Т.е. выгрузить исходные данные в Excel/LibreOffice не проблема, но как заставить Excel/LibreOffice эти данные сконсолидировать, а потом ещё и заставить его что-то по этим сконсолидированным данным посчитать я не знаю. Если кто-то решал подобную задачу, расскажите-покажите как.
Зачем тут эта статья?
Надеюсь, что "многабукаф" и "многакартинаг" сделали своё дело и до этого места дочитали только те, кого действительно интересует тема статьи.
Я долго думал стоит или не стоит выкладывать на всеобщее обозрение свой "полуфабрикат", и в итоге всё-таки решил, что стоит. Во-первых, конфигурация уже худо-бедно работает, и я даже в ней что-то потихоньку считаю. Во-вторых, к конфигурации прилагается вполне себе реальные данные отчётности 20+ эмитентов. И хотя местами эти данные не совсем полные, и я не исключаю, что там могут быть ошибки (т.к. перебивал вручную из отчётов эмитентов), но, думаю, в целом их достоверность должна быть удовлетворительной, ведь делал для себя и лично заинтересован чтобы там не было лажи. Ну, и наконец, в-третьих, эта статья — это приглашение к дискуссии. Есть ряд вопросов, которые хотелось бы обсудить с людьми, которые уже сталкивались со схожими проблемами и, возможно, даже успешно их решали.
Вот, например, какие вопросы хотелось бы обсудить:
- Существует ли доступное готовое ПО (не обязательно на платформе 1С), предназначенное для фин.анализа и фунд.анализа ценных бумаг? Или может какие-то сервисы в интернете? Прежде чем начать пилить свой велосипед, я постарался найти что-нибудь подходящее, но, увы, ничего толкового не нашёл. Да, есть сервисы вроде dividendo.ru, dohod.ru, smart-lab.ru, но наборы показателей там жестко зафиксированы, нельзя добавить что-то своё, покрутить-повертеть-пощупать.
- Существуют ли какие-то источники данных, из которых можно загружать значения показателей отчётности эмитентов вместо того чтобы тупо перебивать вручную их из отдельных отчётов?
- Какие толковые интернет-ресурсы по теме фундаментального анализа можете порекомендовать?
Если кто-то захочет поучаствовать в дальнейшей доработке конфигурации или захочет разработать новую конфигурацию со схожим функционалом, но более грамотную в архитектурном и техническом плане, пишите в комментариях или в личку — можем обсудить ваши и мои идеи.
Аналогично, если кто-то захочет помочь в вводе данных из отчётности эмитентов — пишите в комментариях или в личку — договоримся как лучше организовать этот процесс.
Адрес проекта на GitHub-е: https://github.com/q-i/fa
Может бегло прочитал. Баланс/форму загружаешь? Распарсиваешь ? Или просто глазами считываем определенные строки из баланса и вкалачиваешь руками?
(1) Вкалачиваю руками. С удовольствием бы загрузил, только вопрос где взять что-то пригодное для загрузки?
) дак вот.
есть куча он-лайн сервисов, которые умеют загружать.
Подробно не смотрел, есть какие то требования к ексель файлам и.т.п
Ведь я там понимаю эмитент не придерживается одного формата Екселя (если вообще есть в екселе у него, а то и только в pdf)
(3)
например?
На сайтах самих эмитентов в основном pdf-ы. Зачастую ещё и просто сканы, сохраненные как pdf. Если знаете откуда можно взять «машиночитаемые данные», подскажите.
Выложил свои инструменты для учёта бумаг в УНФ:https://github.com/q-i/unf-for-investments
(6) Добрый день!
https://github.com/q-i/unf-for-investments обработка ВыгрузкаЗаявокВTRIФайл.epf). И есть функция (макрос) для LibreOffice-а, которая умеет формировать строку tri-файла с заявкой: https://gist.github.com/q-i/9fbf9d2720d7fd0114195546924daa9d
Нет, такой нужды пока не возникало. У меня есть обработка для выгрузки заявок в tri-файл для последующего их импорта в QUIK (см.
Что до использования Trans2QUIK.dll вместе с 1С, то для этого по моим ощущениям нужно нарисовать какую-нибудь обёртку вроде внешней компоненты или com-сервера. Задача в общем-то не выглядит чрезмерно сложной, другой вопрос насколько это вообще востребовано.