Adjusted Prices – или где еще можно найти проблемы

01.07.2020 (c) Vitas Ramanchauskas, www.SpyTlt.com

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

Казалось бы, что может быть проще: исторические данные содержат цены открытия, закрытия, минимум и максимум дня, плюс обычно еще присутствует информация об объёме. Цена в долларах и центах, объём обычно в количестве акций, иногда в количестве лотов и реже в долларовом значении (уже начались варианты). И если посмотреть сколько стоила некоторая акция скажем 6 октября 1997го года, и посмотреть сколько стоит она сейчас (если компания жива), можно посчитать во сколько раз бы вырос ваш капитал, если купить акций тогда, а продать сейчас. Кроме того, можно прикинуть, как торговала бы ваша торговая система в те времена, если просто скормить ей поток цен за то время.

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

В популярном Yahoo! Finance в исторических котировках есть два столбца про цену закрытия: Close и Adjusted Close. По иронии судьбы, сейчас просто Close на самом деле не совсем цена закрытия, а частично adjusted close (об этом ниже). Что еще хуже, в прошлом на Yahoo Finance все было иначе, и нет никаких гарантий, что в будущем все снова не изменится.

Цена adjusted close на Yahoo! Finance учитывает выплату дивидендов и таким образом может служить для оценки реального дохода, полученного от инвестиции за долгосрочный период. При этом налоги, разумеется, не учитываются, а их размер зависит от массы факторов. Остальные цены – OHLC – должны быть по идее именно теми ценами, которые были в тот день, и раньше так действительно и было, однако сейчас OHLC цены тоже частично adjusted. Они учитывают такое явление как сплиты и обратные сплиты.

Если сейчас посмотреть на историю цен умирающего TVIX, мир праху его, то в первый день, за который есть информация, 30.11.2010 торги открылись по цене…. 2,656,750,080. да, Карл, 2 с половиной ярда за штуку. BRK-A это просто позор нищебродский на фоне таких цен. Как вы понимаете, ни о каких миллиардах за штуку в ноябре 2010 речь не шла, просто инструмент, в силу своей природы перманентно дешевел, и когда становился совсем дешев, производился обратный сплит – цена повышалась, скажем, в 5 раз и во столько же уменьшалось количество акций в портфеле. И так много раз.

Если указывать в котировках настоящие цены, те, которые был на самом деле, то будет получаться огромный (кратный) гэп, которого на самом деле не было – рост цены в точности компенсировался уменьшением количества. Бэктестить на реальных ценах, даже имея информацию о сплитах, крайне проблемно: как, например, вы посчитаете пресловутую скользящую среднюю? Или любой другой индикатор? Проще перейти к adjusted ценам, тупо умножить ВСЕ цены в истории до сплита на нужный коэффициент, просто переписав историю, какой бы она была, если б сплитов не было бы, а итоговая цена совпала с нынешней.

По этой причине, если были существенные обратные сплиты, исторические цены становятся завышенными, а в таком вопиющем случае как с TVIX, просто фантастически нереальными. И тут появляются две (как минимум) проблемы. Во-первых, история цен, скачанная целиком будет радикально отличаться от истории, накапливаемой инкрементально. При накапливаемой истории будут появляться гэпы. Чтобы этого не происходило, каждый раз после сплита надо "переписать историю" – пересчитать цены ну или по новой скачать их с самого начала у поставщика данных, который произведет пересчет за вас.

Вторая проблема – изменение шага дискретизации. В нормальных условиях шаг цены один цент (обычно, есть исключения). В adjusted ценах вы даже не знаете каков шаг цены! Для этого нужна история сплитов. Несовпадение шага дискретизации может приводить к нетривиальным проблемам.

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

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

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

Так что в цене на AAPL за 12.12.1980 – 0.405683 – важны все цифры после запятой. И конечно же цена не была такой в тот день.

Более того. Даже без всяких сплитов еще недавно цена на американской бирже указывалась в виде дроби, в знаменателе которой была степень двойки. Например, $42 61/64. Эти дроби не укладываются в целое число центов и опять же возможны проблемы из-за неверной дискретизации и потенциальной потери точности при неправильном хранении данных.

Кроме того, проблемы с adjusted prices могут прилетать и с других сторон. Например, если вы захотите быть реалистами и в бэктесте заложите комиссию брокера в размере $1 за 200 акций (на примере IBKR), то это окажется совсем неверным в случае adjusted prices: для инструментов типа TVIX вы занижаете, по сути зануляете комиссию, а для всяких AAPL наоборот делаете ее космической.

Ну и вишенка на торте. Adjusted prices которые вычисляю я сам расходятся (обычно немного, но иногда и существенно) с тем, что отдает yahoo finance и с тем, что отдает IBKR (между собой они тоже не всегда совпадают). У себя я ошибок не вижу, как считает Yahoo я не понимаю.

Более того, в прошлом Yahoo отдавал цены настоящие, не adjusted. Только в колонке adjusted close была adjusted цена. Сейчас все цены скорректированы на сплиты, а adjusted close еще и на дивиденды. Что будет завтра – неизвестно. Как видите, историю иногда переписывают в прямом смысле слова.


Вопросы и обсуждение - в телеграм-группе SpyTlt.