Моделирование Python, исправления выпуклости и множество красивых графиков

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

Несмотря на то, что это основа моделирования цен на активы, иногда приятно (у всех нас есть свои увлечения) точно понять, как мы пришли к этому, проработав статистические последствия этого подхода. Цель состоит в том, чтобы сделать следующее:

  • изучить концепции простого и логарифмического возврата
  • строить их до многопериодных идей
  • добавить случайности
  • опять же, достройте их до многопериодных идей

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

«Простой» возврат

Давайте начнем с точного определения того, чему мы научились в школе, как процентное изменение:

где у нас есть:

  • r_t как "простой" доход за период t
  • S_t как цена акции в период времени t

Итак, если у нас есть предыдущая цена акции 100 и новая цена 110, то мы имеем (110 - 100) / 100 = 10 / 100 = 10%. Затем мы можем изменить это выражение так, чтобы у нас была «модель» того, какой должна быть цена акций в будущем:

Итак, если мы определим r = 9.00%, то получим из начальной цены 100 новую цену 109. Пока все так "просто".

Что происходит, когда мы хотим иметь несколько периодов?

Таким образом, приведенное выше показывает нам, как мы можем смоделировать следующую цену на основе предыдущей цены. Что, если мы хотим смоделировать цену через несколько периодов? Что ж, для T периодов мы можем написать следующее:

  • мы предполагаем, что r определено для всего периода T, поэтому один период имеет r из r/T
  • мы предположили, что r постоянно и поэтому одинаково во все периоды времени

Итак, как это выглядит? Давайте теперь сделаем следующее: если мы хотим смоделировать акцию с r = 9.00% простой доходностью за период, давайте посмотрим, как наша окончательная цена сравнивается с нашей начальной ценой, если мы продолжим разбивать этот период на более мелкие части.

Поэтому кажется, что окончательная цена, которую мы получим, будет зависеть от того, на сколько периодов мы разделим выбранный нами временной интервал. На самом деле это не так уж и хорошо, поскольку это означает, что доход, который мы получаем, связан. к временному горизонту, который мы используем для определения нашего дохода, например. если мы определим наш доход (как мы это сделали) как 12,00% за полный период, например. в год, то при просмотре периода в 1 месяц мы не получим доходность в 1,00%. Вместо того, чтобы достичь 12,00% в течение 1 года, нам потребуется следующая доходность за 1 месяц:

который дает ежемесячную доходность:

К какому числу оно приближается?

Итак, на приведенной выше диаграмме видно, что после примерно 40 подразделений мы приближаемся к пределу — что это? Оказывается, приведенное выше выражение в пределе (при стремлении числа подразделений к бесконечности) стремится к экспоненциальной функции, т.е.

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

Почему это происходит?

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

Составление. Экспоненциальная функция — это совокупность, и когда мы делим изменение на все более и более мелкие последовательные временные шаги — тогда предыдущие изменения повлияют на будущие изменения. Мы снова можем увидеть это графически, сравнив прямую «линейную» доходность, например. 1% каждый месяц против сложного.

Итак, у нас есть эта пересекающаяся линия, которая показывает эффект начисления сложных процентов за несколько периодов, который в конечном итоге объясняет разницу в ~ 0,70% между 12% и exp(0.12) = 12.749%. Так можем ли мы использовать это, чтобы переопределить доходность?

«Журнал» возвращает

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

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

Решает ли это нашу проблему разных номеров возврата для разных периодов времени?

Давайте еще раз с этим. Если мы перестроим наш ценовой ряд следующим образом:

то мы можем получить представление о том, как получить цену после нескольких шагов:

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

где было использовано аддитивное свойство бревен. Теперь перестроим наш предыдущий график, чтобы сравнить доходность, если мы разделим наш период на разное количество подразделений:

Так что да — это решает нашу проблему получения различной доходности за полный период в зависимости от того, разбиваем ли мы этот период на более мелкие части. Отлично.

Представляем: Случайность

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

Простой возврат со случайностью

Давайте забудем тот факт, что мы установили проблему с простой доходностью, не являющейся однородной по периоду времени, и переопределим нашу «модель» цены акций следующим образом:

Здесь многое нужно учесть, но по сути мы определили, что вместо того, чтобы наш простой возврат был просто фиксированным изменением, мы имеем:

  • неподвижный компонент r, который остается сверху
  • новый переменный компонент epsilon, который соответствует стандартному нормальному распределению и масштабируется вверх и вниз с помощью параметра масштабирования sigma в зависимости от того, насколько волатильной должна быть акция.

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

Что происходит с этим квадратным корнем из бита T?

Это идея о том, что дисперсия является линейной. Если мы определим наше стандартное отклонение как меру за полный период времени (т. е. за весь год, как это обычно делается при годовом исчислении), то нам нужен способ разбить это годовое отклонение на более мелкие части (например, ежедневные отклонения). Для этого у нас есть следующее:

Итак, для стандартного отклонения мы получаем следующее:

Можем ли мы построить это с помощью Python?

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

Negative prices: -20.53, -7.01, -5.67, -4.86, -2.38, -1.95, -1.65, -1.28, -0.34

Итак, как это выглядит:

  • у нас есть средняя окончательная цена 112, что соответствует тому, что мы ввели — средний доход 12%
  • распределение окончательных цен и доходов невероятно «нормально»
  • стандартное отклонение доходности составляет ровно 30%, что мы и ввели.

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

Многопериодные простые доходности со случайностью

Давайте увеличим то, что у нас было раньше, чтобы теперь включить нашу случайность:

и поэтому мы определяем нашу окончательную цену как:

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

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

Давайте разделим на 250 частей, чтобы представить примерно 250 торговых дней в году, а затем построим пути, которые мы сгенерировали:

Что мы можем здесь увидеть:

  • у путей есть распределение к ним - большинство путей заканчиваются посередине с некоторыми дикими на каждом конце
  • в целом распределение выглядит слегка перекошенным вверх: есть несколько путей с более чем +100%, но несколько путей ниже -50%

Теперь построим распределение конечных цен и распределение их простой доходности.

Таким образом, у нас есть среднее значение, которого мы и ожидали — около exp(0.12) — но распределение выглядит не так, как мы имеем:

  • стандартное отклонение более 30%
  • асимметричное распределение цен и простая доходность

Почему это так? Для этого давайте посмотрим, что произошло в неслучайном случае, когда мы сделали периоды меньше и чаще.

Сочетание с неуверенностью

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

  • если у нас есть путь из 10 шагов с отдачей либо +10%, либо -10% (не нормальное распределение, то одно, то другое — либо +10%, либо -10%)
  • будут пути со всеми 10 шагами как +10%, а некоторые со всеми 10 шагами -10%
  • эти цены отделки будут либо:
  • 100 * 1,1¹⁰ = 259,37 -> простой возврат 159,37%
  • 100 * 0,9¹⁰ = 34,87 -> простой возврат -65,13%
  • ясно, что начисление процентов вверх приводит к тому, что цена закрытия намного дальше от старта, чем начисление процентов в минус.

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

Логарифмическая доходность со случайностью

Давайте теперь проделаем аналог того, что мы сделали с неслучайными возвратами, и посмотрим на этот предельный случай, когда мы делим время на бесконечно маленькие куски. Мы определяем нашу логарифмическую доходность за период t как:

Другими словами, точно так же, как и простой доход, мы определяем его как детерминированный бит возврата, r, и некоторый случайный бит, который на данный момент считается нормально распределенным и масштабируемым в соответствии с выбранной нами величиной вариации, сигмой. Как это будет выглядеть, если мы нарисуем 10 000 образцов?

Итак, снова у нас нет симметричного распределения. У нас также есть:

  • средняя конечная цена 117.98 и, следовательно, простая доходность 17,98% (в то время как мы ввели 12,00%)
  • стандартное отклонение простой доходности 36,15%, когда мы ввели 30,00%

Кажется, у нас накопилось множество вопросов, поэтому пришло время перейти к статистике, чтобы ответить на них.

Какова будет средняя простая доходность, когда мы моделируем логарифмическую доходность?

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

Теперь давайте перестроим так, чтобы у нас была цена, S, а затем определим простой доход:

Давайте теперь также переопределим наш случайный компонент, чтобы вместо среднего значения и дисперсии 0 и 1 представлять наш доход, r и сигму стандартного отклонения:

Теперь из вышесказанного мы неявно ожидали следующего:

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

Так что же это должно быть?

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

Давайте определим X как интересующую нас величину:

Каковы ожидания от X? Учитывая, что X теперь является определением логарифмически нормально распределенной переменной, мы знаем, что вероятность того, что X в любой точке равна определенному значению x, равна:

Таким образом, чтобы мы могли ожидать этого, у нас есть следующее — значение каждого X, умноженное на вероятность его возникновения:

что мы можем:

  • отменить эти x в начале
  • измените границы, поскольку логарифмическая нормаль не имеет вероятности ниже нуля (поэтому начните интеграл с нуля)
  • убрать некоторые константы за пределы оператора ожидания

Теперь давайте сделаем что-нибудь умное, чтобы немного упростить это. Сделаем «замену переменных», чтобы было проще упрощать. Повторим следующее:

что означает, что мы также имеем следующее:

что теперь означает, что мы можем подставить все эти вещи и получить следующее:

Теперь мы можем:

  • отменить сигмы вне любых показателей
  • переставить наши члены в показателях так, чтобы мы могли свернуть один из них, чтобы он был квадратом

А теперь еще раз переставляем:

  • вытащите этот последний бит, так как он не зависит от y и, следовательно, постоянен в этом интеграле
  • поместите начальный бит обратно внутрь интеграла (для эстетики, чтобы увидеть, как он рушится)
  • свернуть среднюю экспоненту, чтобы квадрат оказался за скобками

Что же осталось внутри нашего интеграла? У нас есть формула для нормального распределения CDF с:

  • среднее значение sigma
  • отклонение 1

что означает, что он имеет интеграл 1, который дает нам наш окончательный ответ:

Итак, как это связано с нашими расхождениями?

Итак, мы только что доказали, что теоретически должно выполняться следующее:

Итак, что это нам дает — получается, что 100 * exp(0.12 + 0.5 * 0.3^2) = 117.94%, что почти точно соответствует тому, что мы получили выше в наших симуляциях как наше среднее значение.

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

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

Другими словами:

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

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

Можем ли мы построить эту зависимость, чтобы мы могли визуализировать разницу, увеличивающуюся с более высокими отклонениями?

Да — чтобы убедиться, что это абсолютно понятно, давайте сделаем следующее:

  • для данной дисперсии нарисуйте множество чисел из нормального распределения
  • используя эти числа:
  • вычислить цены закрытия, используя простые доходности
  • вычислить цены закрытия с использованием логарифмических возвратов
  • вычислить средний простой доход и средний логарифмический доход этих цен
  • разница эти средства
  • сравните эту разницу с разницей, которую мы «ожидаем» на основе приведенной выше «корректировки дисперсии», т. е. логарифмические числа должны быть выше из-за этого экспоненциального эффекта на случайную составляющую.
  • повторите это для диапазона отклонений, а также для большего количества симуляций, чтобы убедиться, что закон больших чисел (LLN) выполняется, и мы сходимся к теоретическому ожиданию

Все это немного сложно, но красивые графики должны прояснить ситуацию.

Итак, похоже, мы выстроились:

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

Большой!!! Теперь у нас есть модель, включающая случайность, и мы понимаем, как она приносит прибыль!

Многопериодный журнал возвращает случайным образом

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

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

А как насчет дисперсии? Почему возврат журнала больше, чем в нашей простой модели возврата?

Опять же, это сводится к тому, как мы вычисляем наше стандартное отклонение. Если мы вычислим стандартное отклонение доходности журнала, то оно будет точно равно 30,00%, как мы можем видеть на крайнем правом графике выше. Однако, если мы вычислим простые доходы после моделирования нашего ценового ряда с использованием логарифмических доходов, мы получим другое (большее) стандартное отклонение.

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

  • если мы посмотрим на наше соотношение простых доходностей, то есть 18%/12% = 1.5x
  • умножьте нашу дисперсию на эту сумму, т.е. 30^2 * 1.5 = 0.135
  • вычислить стандартное отклонение, т.е. sqrt(0.135) = ~36.75%

что примерно соответствует стандартному отклонению нашей простой доходности выше 36,10%. Математически они на самом деле связаны этой формулой:

что при вычислении дает нам ровно 36,20%, что примерно соответствует приведенному выше.

Резюме

Итак, что мы установили?

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

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

Может пример?

Давайте возьмем пример SPX и используем эти данные для калибровки некоторых симуляций.

Итак, у нас есть фреймворк данных возврата spx — как простой, так и логарифмический. Давайте построим их соответствующие распределения:

Итак, мы имеем следующее:

  • Ежедневные доходы SPX явно ненормальны, но давайте пока взглянем на это.
  • SPX имеет среднюю дневную (в годовом исчислении) простую доходность 9,00% и стандартное отклонение около 21,00%.

Давайте используем эти числа (вместо правильных номеров возврата журнала) для калибровки наших симуляций.

Итак, что мы сделали?

  • взяли простую статистику возврата
  • откалибровали наши логарифмически нормальные симуляции с этими простыми возвращаемыми числами в качестве входных данных для r и sigma
  • вычислил нашу простую доходность по цене закрытия, выведенную логарифмически-нормальной моделью

Мы ясно видим, что у нас есть данные по простой доходности, которые не соответствуют нашим ожиданиям — 9,00% при волатильности 21,00%. На диаграмме справа показано, что модель выполнила свою работу, так как результаты журнала точно соответствуют введенным значениям. Однако это ясно показывает проблему смешения двух разных понятий возврата.

Заключительные замечания

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

Запланируйте сеанс DDIChat в разделе Кодирование, программное обеспечение и разработка мобильных устройств:



Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.