Эксельки
73K

Как я сделал таблицу, чтобы проанализировать свой портфель на ИИС

Следить за изменением стоимости акций и соблюдать пропорции
107
Этот текст написал читатель в Сообществе. Бережно отредактировано и оформлено по стандартам редакции.
Аватар автора

Егор Караваев

не готов отдавать анализ в чужие руки

Страница автора

Я решил завести таблицу для отслеживания результата инвестиций на ИИС в мае 2020 года.

На ИИС я придерживаюсь четкого плана в противовес случайному характеру покупок на брокерском счете. Никогда особо не доверял различным сервисам по анализу инвестиций. Могу сравнить их со своей таблицей при надобности, но никогда не отдам анализ в чужие руки. Мне важно досконально понимать, как считается каждое число, и своя таблица в этом плане опережает все подобные сервисы.

Сам я работаю в сфере автоматизации, и потому таблица, по моему мнению, также должна быть полностью автоматизирована. Принципиально не хочу ничего вводить руками: знаю, что когда-нибудь забуду об этом или мне просто надоест. Основная часть информации подгружается благодаря OpenAPI Инвестиций. Почти все сделано с помощью скриптов. Формул — минимальное количество. Никаких брокерских отчетов загружать не надо.

Главная страница таблицы состоит из нескольких блоков:

  1. Состав портфеля. Показывает, сколько у меня сейчас акций, текущую и средние цены, прибыль/убыток, текущие пропорции и пропорции после покупки.
  2. Графики трендов и изменения цен за выбранный период.
  3. Общая информация по портфелю. Смотрю здесь, обгоняю ли я вообще инфляцию.
  4. График отдельно выбранного актива с минимальным техническим анализом.
Так выглядит главная страница таблицы
Так выглядит главная страница таблицы
Действия в портфеле — показывает, какие транзакции были совершены. Стоимость всех покупок и продаж, комиссии и пополнения — все тут
Действия в портфеле — показывает, какие транзакции были совершены. Стоимость всех покупок и продаж, комиссии и пополнения — все тут
Этот раздел показывает текущий состав портфеля по отдельным акциям. Можно посмотреть, сколько места в портфеле занимают разные акции и насладиться диверсификацией. Данные по составу ETF подгружаются из открытых источников
Этот раздел показывает текущий состав портфеля по отдельным акциям. Можно посмотреть, сколько места в портфеле занимают разные акции и насладиться диверсификацией. Данные по составу ETF подгружаются из открытых источников
Здесь находятся исторические данные актива за последние 30 дней. Смотрю динамику, которая иногда влияет на мое решение покупать или не покупать тот или иной актив. Иногда могу купить чуть позже
Здесь находятся исторические данные актива за последние 30 дней. Смотрю динамику, которая иногда влияет на мое решение покупать или не покупать тот или иной актив. Иногда могу купить чуть позже

Особенности таблицы

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

Для начала я составил план распределения активов в портфеле. У вас должна быть тактика, которой вы будете придерживаться, иначе это все бессмысленно. Для себя решил, что мой портфель будет состоять только из ETF:

  • США (FXUS и FXIT) — 30%;
  • развитые страны (Германия FXDE + FXDM) — 30%;
  • развивающиеся страны (Россия TMOS, Китай FXCN) — 30%;
  • евробонды FXRU — 5%;
  • золото FXGD — 5.

Целевые пропорции указаны в столбце Target allocation. Столбец Current allocation показывает текущие пропорции в портфеле. Класс активов не имеет значения.

Моей задачей было написать алгоритм, следуя которому я мог бы покупать акции, максимально приближаясь к заветным пропорциям. Для этого я написал отдельный скрипт — WhatToBuy.js, который считывает текущие цены активов, их пропорции и доступный бюджет; а также ищет наибольшее отклонение от плановой доли актива и присуждает каждому активу приоритет для покупки.

В первую очередь алгоритм будет «покупать» активы с наибольшим отклонением — до тех пор, пока не восстановит заданные пропорции. Затем перейдет к следующему по приоритету активу и так по кругу, пока не кончится бюджет. Детально описывать не буду, при желании можно самому разобраться в коде.

Алгоритм довольно прост, но потребуются небольшие знания JavaScript. Результатом его работы станет точное указание, в каких количествах покупать тот или иной актив, сколько комиссии уйдет брокеру (Fee, строка 10) и сколько бюджета останется (Cash, строка 10).

Как сделать такую же таблицу

Я создавал таблицу на базе готового исходного кода. Низкий поклон этому человеку. Просто скопируйте код с этого сервиса и посмотрите, что и как работает. Если у вас есть навыки программирования, то вам не составит труда быстро адаптировать его под свои задачи.

Если навыков нет, то вкратце этот процесс добавления скрипта выглядит так:

  1. Открываете новую гугл-таблицу.
  2. Переходите в раздел Apps Script в меню «Расширения».
  3. Придумываете название проекта и вставляете скопированный код.
  4. Получаете в личном кабинете брокера OpenApi-токен и вставляете его в кавычках в строке 4, чтобы получилось const OPENAPI_TOKEN = «ваш токен».
  5. Сохраняете скрипт.

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

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

Я также сделал шаблон своей таблицы, чтобы вы могли настроить его под себя. Можете сделать копию таблицы, в которой будут права на редактирование, — достаточно нажать File → Make a copy. Чтобы воспользоваться им, сначала нужно получить доступ к своему портфелю при помощи OpenAPI Инвестиций. Это самый сложный этап, так как подразумевает совершение нескольких нетривиальных операций.

Для начала придется получить уникальный токен для работы со своим портфелем — программистом тут быть не надо. Весь процесс хорошо описан в документации по ссылке. Если вкратце, нужно зайти в настройки своего инвестиционного счета в браузере и выбрать внизу настроек пункт «Токен для OpenAPI».

В самой таблице порядок такой:

  1. Перейти в пункт меню Расширения → Apps Script.
  2. Скопировать токен из Т-Инвестиций и вставить его вместо фразы Paste your token here.
  3. Сохранить скрипт и нажать на кнопку Refresh в основной таблице. Скорее всего, таблица попросит разрешение на выполнение скрипта — для этого нужно зайти в «Дополнительные настройки» → «Перейти на страницу скрипта» и дать разрешения.

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

Результат

Таблица избавляет меня от случайных ошибок и мук выбора «чего бы купить». В целом помогает докупать подешевевшие активы и не покупать слишком дорого.

Мне, в принципе, скорее интересен сам результат программирования, чем результат инвестиций. Не могу остановиться и постепенно добавляю новые фишки. Побочным эффектом подучил JavaScript и «Эксель», наверное, пока это самая большая польза от этой таблицы.


РедакцияКакие инструменты помогают вам следить за инвестиционным портфелем?
  • Рамиль АльфредовичДобрый день. Подскажите пожалуйста, сделал все по инструкции , в итоге появились тикеры из ИИС ниже таблицы, но в самой таблице ERROR. Например в ячейке А1 формула =getIISPort(), я понимаю что в скобках должно быть значение, но есть инструкция что конкретно и где нужно прописывать. И в редакторе скриптов 18:25:01 Примечание Выполнение начато 18:25:02 Ошибка TypeError: Cannot read property 'replace' of undefined isoToDate @ API.gs:11 в этой строчке const str = dateStr.replace(/-/, '/').replace(/-/, '/').replace(/T/, ' ').replace(/\+/, ' \+').replace(/Z/, ' +00') Ничерта не понимаю в скриптах, но очень хотелось бы разобраться. Спасибо2
  • Даниил ПрокофьевТаблица не работает3
  • Екатерина МалоземоваДаниил, точнее ссылку удалили :(1
  • тьфунатебя ¯\_(ツ)_/¯Дорогие Тиньков Инвестиции, а можно вы возьмете Автора себе на работу, чтобы он этот отчет прикрутил в личном кабинете Инвестиций?! Ну крутая же фишка будет!139
  • Егор Караваевyuber, вроде только тинькофф такой прогрессивный. Есть какое-то апи у мосбиржи, но я там ноги поломал.4
  • Алексей ТурЕгор, c гуглфинанс подтягиваю только курс доллара, с API Мосбиржи почему-то не работает корректно. А исторические данные мне не нужны, только текущие котировки для расчета куда сколько надо внести. Общий вид формулы для российских акций: =IMPORTxml("https://iss.moex.com/iss/engines/stock/markets/shares/boards/TQBR/securities.xml?iss.meta=off&iss.only=marketdata&marketdata.columns=SECID,LAST", concatenate("//row[@SECID='",C6,"']/@LAST")) С6 тут это ячейка, куда у меня забит тикер. Но есть некоторые нюансики для фондов, долларовых активов и облиг, там будет чуть по другому2
  • Максим АлексеевКогда я писал себе софт для автоматизации, самым геморройным оказался расчёт налогов. Но в моем случае было много облигаций, и налоги мне нужны были для расчёта точной доходности. По состоянию портфеля - к сожалению, из моих 3 брокеров только Тинек даёт для этого API. Мне кажется они вообще одни такие в РФ, у кого API свой и бесплатный. Безусловно, молодцы19
  • Павел НикифоровМаксим,16
  • Максим АлексеевПавел, спасибо. я все время путаю, он такой один или такой как все.8
  • Павел НикифоровМаксим, Тиньков — как все, а Тинькофф — такой один:))7
  • Алексей Покревскийспасибо, полезная информация, но очень сыровато, надо под себя дорабатывать2
  • Виталий ВасиленкоОтличная штука, жаль, что не работает3
  • Роман ИваницкийПопробуйте Snowball-income, мне кажется это проще и лучше..4
  • Владимир БДмитрий, а зачем перемножать 0,79% на 8 фондов? По каждому фонду теряем 0,79% ежегодно, не больше и не меньше.1
  • Volonden Auditoreтьфунатебя, конечно прикрутят, всего за 99р в месяц17
  • Дмитрий ПокревскийОчень интересно разобраться. А как подключить брокерский счет?1
  • тьфунатебя ¯\_(ツ)_/¯Volonden, они на % хорошо зарабатывают...1
  • Егор КараваевАлексей, цели масштабировать не было, поэтому да, надо дорабатывать для себя.2
  • Егор КараваевДмитрий, скрипты немного разные. Внутри есть пример если покопаться.1
  • Роман ТихоновСоветую таки освоить массивы, а то вот от такого кода становится не по себе: let A2_buy = 0; let A3_buy = 0; let A4_buy = 0; let A5_buy = 0; let A6_buy = 0; let A7_buy = 0; let A8_buy = 0; let A9_buy = 0; Я понимаю когда активов меньше 9 (хотя уже не очень), но а если сотня? А если их количество меняется... Если сидеть и дописывать это до 100 (потом до 1000000) активов, то программирование станет не таким интересным)))1
  • Елена ТкаченкоА по-моему, так это просто выброшенное время. Ну сколько и чего вы купите на 400тыс....Неужели сами посчитать не сможете, а больше 400тыс. в год нет смысла заводить на ИИС, т.к. вычета не получите с большей суммы, а без вычета вообще смысла нет, т.к. больше 100% в год вы не заработаете. У меня и сынв уже по третьему ИИСу открыто с 2015г., и всё просчитано. И ещё, есть брокеры, у которых в личном кабинете вы на графике можете видеть результаты, и расчёт налогов проводить хоть каждый день, автоматически за 1 минуту делают.1
  • Пан КирЕгор, ну я бы не сказал что ничего не надо вносить... в итоге, чтобы настроить её под себя надо как минимум - удалить 8 скрытых страниц, создать аналогичные страницы по своему портфелю... а ещё как это ничего не надо вносить, если надо ещё указать сколько денег планируется внести на счет, чтобы скрипт рассчитал как их выгоднее распределить ну и не хватает пересчета стоимости портфеля в рубли, так как к примеру могут же быть и валютные позиции... но в целом конечно для первичного шаблона данная таблица очень хороша! За это конечно плюс автору!!! Просто описание в текущей статье немного скудное, для не профи очень сложно будет разобраться :)1
  • Егор КараваевРоман, полностью согласен) В свое оправдание скажу, что это был мой самый первый код на JavaScript после hello world. В данном случае сработало правило "работает - не трогай". Как-то не обращал внимания, но вообще конечно надо будет исправить хотя бы ради очищения души. Боюсь представить какие ещё грехи найдут тру программисты в этом коде.1
  • Егор КараваевЕлена, ну хотя бы для того чтобы понимать свою годовую доходность. А это вы вряд ли посчитаете на коленке в блокноте.3
  • Егор КараваевРоман, давайте e.k.karavaev@gmail.com1
  • Антон МогилевСмысл от ETF только в том что надо подождать пока они вырастут достаточно и можно их продавать ? По ним же никаких промежуточных выплат нет1
  • Егор КараваевАнтон, если вы про дивидендную историю, то тут я резко против. Зачем мне заморачиваться их реинвестированием, да еще и платить лишние налоги если за меня их реинвестирует провайдер ETF? Расчет на рост активов конечно.1
  • Егор КараваевРоман, не знал про них, выглядит конечно здорово. Пожалуй даже лучшее что я видел среди таких сервисов. Но, опять же, необходимо загружать брокерские отчеты (муторно) или в случае Тинькофф давать свой токен (небезопасно). Они конечно пишут, что все безопасно и все хранится в зашифрованном виде, но кто его знает. Я бы не хотел давать ключи от полного доступа в свой портфель непонятно кому.5
  • Евсикова ЕленаО боги финансов! Как же хочется такую табличку заиметь, но все попытки сделать по инструкции провалились((((( Какие то разные ошибки то 401 то 500... А кто может помочь с настройкой?1
  • Роман ЭйзенДмитрий, я только сейчас понял, что =getIISPort - это то, что находится в самом документе, а не в скрипте シ Но все равно - я не вижу ячеек, где была бы дата в виде текста, возвращенная от тинькофф апи Я не программист, поэтому чтобы что-то смог сделать, нужно чтобы объяснили пошагово что и куда тыкать... заранее прошу прощения, что ничего не понимаю (строки добавлял - ничего не изменилось)1
  • JuliaЕгор или Роман, а можно ли в Snowball давать для Тинька токен песочницы, то есть через который нельзя торговать, а только считать, выгружать исторические данные и моделировать? Это наверное безопаснее1
  • Егор КараваевJulia, без понятия. Надо пробовать.0
  • Дмитрий ЖукРоман, мне пришлось скачать эту табличку и начать копаться в ее коде :) При всем моем уважении к труду, проделанному автором - там вот если просто и с наскока - то черт ногу сломит :) так что не отчаивайтесь, я тоже сижу и разбираюсь. Но опять же автору большой респект - вскрыл для меня интересный пласт по работе с АПИ. И то что в getIISPort - я ошибся в комментариях выше, потому что смотрел только в гитхаб. В скрипте это получение портфеля по айди вашего иис счета. И там ничего в функцию действительно не передается. И нет, вы немножко не правы, getIISPort это функция скрипта. Просто в гугл шитах она воспринимается как пользовательская функция и совершенно спокойно работает. В связи с этим первый вопрос - у вас именно ИИС? Потому что функция работает только с ИИС, в скрипте прописано что brokerAccountType == "TinkoffIis" Второй вопрос - вы получили апи токен на сайте тинькофф инвестиции и прописали его в скрипте? Без него вообще ничего работать не будет. Это восьмая строчка в скрипте с именем "API" const OPENAPI_TOKEN = "сюда-надо-вставить-апи"2
  • Роман ИваницкийJulia, К сожалению Тинькофф не выдаёт по такому токену реальные данные, только по виртуальному портфелю. Знаю что многие просят у них сделать "нормальный" токен только для чтения, но пока только обещают что-то сделать... Поэтому как есть, либо доверять сервису (токен хранят в зашифрованном виде, ключ придумывает пользователь и он нигде не хранится, вводится при каждой синхронизации), либо грузить отчёты вручную.4
  • Роман ИваницкийЕгор, Единственное, что могу посоветовать - включить в кабинете брокера подтверждение всех сделок по смс, тогда невозможно без кода из смс провести сделку по апи токену.0
  • Егор КараваевРоман, конечно так и сделал.0
  • Егор КараваевВладимир, переделать не сложно. Мб займусь этим как будет время.1
  • Alexandr SudakovБольшое спасибо автору: наконец-то дошли руки доавтоматизировать мою табличку :) Но отмечу, что ооочень много жёстко забитых значений у автора. Пришлось попотеть, переделывая. Зато во всём разобрался :)3
  • Вован из Сибири-матушкиМаксим, API без документации толком и техподдержки.0
  • Максим АлексеевВован, я смотрел в мае 20го, когда оно только вышло. сейчас нашел свои токены и ноутсы: Docs https://api-invest.tinkoff.ru/openapi/docs/ https://tinkoffcreditsystems.github.io/invest-openapi/swagger-ui/ https://github.com/TinkoffCreditSystems/invest-openapi-java-sdk то есть что-то из документации есть, по качеству расскажите детали тогда. по ТП - ну так это ж для физиков все. есть телеграм канал, есть публичный багтрекер https://github.com/TinkoffCreditSystems/invest-openapi/issues. если нужно что-то серьезное в плане ТП, то это надо включаться по fix/fast как организация и через других провайдеров.0
  • АлександрМаксим, вопрос сильно спорный. Нафига мне его API , если у меня открыто несколько счетов и он не даёт API по каждому?0
  • Максим АлексеевАлександр, ну это у них надо спросить, а не у меня. меня в мультисчетах не устраивает общая налоговая база, например.0
  • Егор КараваевВнимание! Тинькофф обновил свое API до версии v2. С API v.1 (на котором написано моя табличка) работают только токены с полным доступом и для ВСЕХ счетов. Другие токены работать не будут! По возможности постараюсь обновить табличку до версии API v.2 и заодно прикрутить поддержку брокерского счета.6
  • Всеволод ПлоховЕгор, давай, друг! Ждём!0
  • Настя КЕгор, крутая таблица! С поддержкой брокерского счета - было бы супер!0
  • Кирилл ТельтиковЕгор, получается, на данный момент таблица ограниченно работоспособна, т.к. не считывает информацию с токена, если есть оба счета (ИИС и брокерский)?0
  • Егор КараваевКирилл, ограниченно работоспособна сейчас скорее сама биржа) С брокерского тоже можно считать, надо в коде менять тип счета.0
  • Кирилл ТельтиковЕгор, подскажите как сделать чтобы таблица работала только на ИИС? если сейчас токен создается сразу на два счета0
  • Кирилл ТельтиковЕгор, при подключении общего токена выдает такую ошибку на первом листе Exception: Request failed for https://api-invest.tinkoff.ru returned code 500. Truncated server response: {"trackingId":"3ff653f4e59118c6","payload":{"message":"INTERNAL_ERROR","code":"INTERNAL_ERROR"},"status":"Error"} (use muteHttpExceptions option to examine full response) (строка 94). И не пишет никакой информации. На остальных листах инфа есть, но тоже не совсем корректная0
  • Алексей ДрагуновРоман, Классный сайт!!! Спасибо за открытие его. Функций много и все удобно отслеживать!0