Прогнозирование доходности акций

Фото Тайлера Прама на Unsplash [VXX — это торгуемый актив, привязанный к волатильности, который позволяет вам торговать, в некотором смысле, на стандартном отклонении… Будет ли кто-то разрабатывать актив, который позволит вам торговать на перекосе и/или эксцессе? Или хвостовое соотношение?]

Часть 1. Прогнозирование доходности акций на N-день вперед с предикторами, подобными моменту

Если вы не понимаете что-либо или все вышеперечисленное: Не волнуйтесь, это не «на тесте» и не имеет отношения к этой статье. Мы просто подумали, что это классная картинка, чтобы поместить ее наверху. А если рис, то пояснение.

Погружаться в прогнозирование несколько рискованно, потому что, как гласит (ироничная?) поговорка: прогнозировать сложно, особенно предсказывать будущее.

Тем не менее, мы продолжаем, хотя и осторожно, с проверками.

Мы начнем с почти универсального напоминания о том, что то, что мы хотим ввести в наши модели, — это информация о доходах (или приблизительный эквивалент, такой как разница в ценах [Примечание 1]), а не сами цены на сырьевые акции. И класс: почему мы не используем цены непосредственно в наших моделях?

Профессор: «Давай, скажи это вместе со мной!»

ПРИПЕВ: «Потому что цены не постоянны!»

Спасибо, класс.

Справедливости ради следует отметить, что некоторые ценовые ряды активов сами по себе являются стационарными, но это, по-видимому, редкость на фондовых рынках мира, поэтому лучше всего предположить, что ценовые ряды не являются стационарными [Примечание 2].

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

Рисунок 1: График цены с простым наложением скользящей средней. Данный ценовой ряд не является стационарным… Его подлость блуждает повсюду. Нам не нужен формальный тест, чтобы проверить это, но мы можем протестировать его, если это необходимо. Но согласитесь, что его подлость блуждает повсюду. Актив не имеет значения. Частота дискретизации не имеет значения. Скриншот с marketwatch.com

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

Рисунок 2: Примеры ежемесячных возвратов, скриншот из initialreturn.com

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

Зачем нам стационарность? Потому что если временной ряд неподвижен, это означает, что он «остается неизменным» в определенном математическом смысле, с течением времени. Если что-то останется прежним, то это означает, что будущее (прогноз) будет похожим или идентичным прошлому, в каких-то аспектах. Это делает прогнозирование гораздо менее опасным, чем если бы мы взяли что-то, что сильно менялось (в прошлом), и попытались использовать это сильно варьирующееся количество для предсказания будущего. Если что-то сильно менялось в прошлом, как мы можем быть уверены, что оно не будет сильно меняться в будущем? На самом деле, мы не можем быть уверены в этом.

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

Но, по крайней мере, если мы начнем с величин, которые, казалось бы, были неизменными в течение длительного периода времени, у нас есть шанс на то, что они останутся неизменными в течение некоторого времени в будущем, а это иногда все, что нам нужно для полезной модели. Спрогнозировать доходность акций TSLA в будущем с некоторой вероятностью точности направления >> 50%? Может быть чем-то полезным для внутридневного трейдера, не так ли?

Возникает возможная проблема, связанная с этим понятием стационарности. Поскольку мы пока не будем использовать возвраты непосредственно в модели, а вместо этого будем выводить моменты и другие величины из временных окон возвратов, мы можем захотеть проверить стационарность этих производных величин, прежде чем бросаться в сложные модели временных рядов этих производных величин. Однако, поскольку мы начинаем с обычной регрессии по методу наименьших квадратов (функция ЛИНЕЙН в Excel), в которой нет запаздывающих переменных или запаздывающих ошибок (пока!), как в моделях типа ARIMA, мы отложим доработку этой модели до будущей работы.

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

Совокупная доходность в виде отфильтрованной доходности

Не будем начинать слишком очевидно, но: недельная доходность — это 5 торговых дней последовательных доходов, агрегированных, и является совокупной доходностью этих 5 дней [Примечание 3]. Заботясь о том, чтобы наши доходы были «отсчитываемыми от единицы» или (P(t)/P(t-1)), а не отсчитываемыми от нуля (как описано в [Примечание 1]), мы можем вычислить:

return(5 дней) = return1*return2*return3*return4*return5 [Уравнение 1]

Вы можете заметить, что если бы мы неправильно использовали нулевую доходность для мультипликативного накопления 5-дневной доходности, при этом дробная доходность обычно намного меньше 1,0 (ближе к 0,0, чем к 1,0), этот продукт быстро приблизился бы к нулю, и «около нуля» определенно не является кумулятивной доходностью. Предположим, что типичная доходность в день составляет где-то около 1%, поэтому

0,01*0,01*0,01*0,01*0,01 = 0,000 000 000 1

что, очевидно, неверно. Вы хотите сказать, что прирост в 1% каждый день в течение пяти дней приводит к кумулятивной доходности, лишь крошечно превышающей нулевую? Нет.

Если мы возьмем (любой базовый) логарифм обеих частей [Уравнения 1], то получим:

log(return(5day)) = log(return1) + … + log(return5)

Что это, как не скользящая средняя (в логарифмическом пространстве возврата), минус мультипликативная константа 1/5? А что такое скользящая средняя, как не сильный фильтр низких частот, фильтр, который избавляется от высокочастотного дневного шума и джиттера, которые случаются на рынках?

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

Теперь, что касается специфических частотных свойств такой геометрической средней, мы оставим читателю искать вверх. Если вы парень с сигналами, это может быть интересно. Может быть, вам не нужно его искать, может быть, вы уже знаете его! Мы поместили здесь удобную ссылку на таблицу преобразования Фурье, если вы хотите достать карандаш и потренировать свой ум без [re|de]ссылки на ChatGPT.

Если бы мы захотели, мы могли бы настроить нашу модель на прогнозирование log(return(5day)) вместо return(5day), что в некоторых случаях может иметь некоторые преимущества в качестве модели. Но для начала мы придерживаемся необработанных возвратов, чтобы быстро интерпретировать их без необходимости преобразовывать логарифмические возвраты обратно в простые возвраты.

Таким образом, наша цель будет состоять в том, чтобы спрогнозировать доходность на 5 дней вперед (1 торговая неделя) от любой модели, которую мы придумаем. Результирующая последовательность 5-дневных возвратов является временным рядом, который предварительно отфильтрован по определению, как мы отметили выше.

Моменты-предикторы-кандидаты

Что касается переменных-кандидатов в предикторы, мы позаботимся о том, чтобы начать с данных о доходности за день до того, как будет вычислена наша 5-дневная доходность, чтобы мы не включали «будущие данные» в наши переменные-кандидаты-предикторы, что является анахронизмом и, безусловно, плохой практикой моделирования: когда мы прогнозируем реальное будущее, у нас не будет этих будущих данных, которые можно было бы подставить в модель… Потому что зачем? Потому что это из будущего, а у нас его пока нет!

Для начала мы возьмем данные за 200 дней до того дня, когда мы вычислим 5-дневную совокупную доходность, и вычислим из нее данные, подобные моменту. На основе этих 200 дней данных мы вычислим 6 переменных-кандидатов-предикторов:

Средняя доходность
Стандартное отклонение доходности
Асимметрия доходности
Эксцесс возвратов
Хвостовое соотношение 95/5
Хвостовое соотношение 75/25 (квартилевое хвостовое соотношение)

Почему 5 дней вперед и 200 дней назад? Ха-ха, хороший вопрос. Мы просто используем эти два размера окна в качестве отправных точек. Пять дней — это удобно думать о «неделе вперед», а 200 дней назад — это типичная величина, разбросанная по финансовой прессе (хотя, возможно, это чаще всего означает 200 календарных дней, а здесь мы используем 200 торговых дней). Тем не менее, эти цифры не отливаются в кремнии и могут быть изменены по мере необходимости для достижения лучших результатов.

Подробнее о соотношении хвостов можно прочитать здесь:

https://medium.com/@matteo.bernard/quant-investing-financial-ratios-that-you-must-know-part-2-114313efa760

Хвостовые коэффициенты измеряют, как экстремумы доходности (бычий/медвежий) уравновешиваются в нашем 200-дневном историческом окне доходности.

Идею строить модели прогнозирования на основе хвостового соотношения 95/5 мы почерпнули у хороших ребят из ныне несуществующей компании Quantopian, а затем мы подумали: «Ну, почему бы не добавить и другие моменты?» Опять же, хороший код построителя моделей отбрасывает нерелевантные предикторы-кандидаты. Это не значит, что мы должны добавлять только переменные Any, чтобы не слишком запутать код, но соотношение 75/25 кажется достаточно рациональной величиной, чтобы ее проверить. Например, было бы, вероятно, плохой идеей указывать температуру окружающей среды в полдень (в день) в Финансовом районе Нью-Йорка в качестве переменной-кандидата, даже несмотря на то, что наш регрессионный код, вероятно, отсеял бы это.

Мы добавили соотношение хвоста доходности 75/25 в качестве предиктора-кандидата (выходя за рамки того, что предлагают квантопианцы), потому что концепция квартиля интересна для нас тем, что существует 50%-ная вероятность того, что доходность окажется в двух средних квартилях, и 50%-ная вероятность того, что доходность будет в бычьем или медвежьем хвосте. Бинарные варианты с вероятностью 50/50 окажутся в любой корзине, имеют аспект «подбрасывания монеты», и они забавляют нас, поэтому мы их ставим. Регрессионная модель подскажет нам, была ли это хорошая идея или нет, с помощью стандартной ошибки на выходы переменной (обсуждается ниже).

Давайте заметим, что наше 200-дневное окно для этих мгновенных вычислений (особенно среднее) не то же самое, что 200-дневная скользящая средняя, которая отображается на графике многих инструментов для построения графиков розничных акций (за исключением возможной путаницы торговых дней и календарных дней), поскольку эти инструменты обычно строят скользящую среднюю цены (см. Рисунок 1; хотя на этом графике показана кривая 50-дневной скользящей средней, То же самое можно сказать и о 200-дневной кривой), и здесь мы вычисляем скользящую среднюю доходности. Кроме того, мы не собираемся строить графики или диаграммы этих данных; Мы позволим модели сказать нам, что и что предсказывает. А чего нет. И какой вес мы должны придавать каждому кандидату-предиктору. Попробуйте сделать это с помощью инструмента для построения графиков. Регрессионные модели по инспекции: Не так просто.

Подготовка данных для регрессии легко выполняется с помощью Excel, хотя можно использовать Python или любой другой подобный язык. В наши дни мы большие поклонники Javascript и не издеваемся над Visual Basic, как это делают некоторые разработчики. На самом деле, мы используем Visual Basic для Excel, чтобы создать макрос тестирования на истории для этой модели! Для начала мы покажем реализацию метода в Excel, который мы описываем в этой статье, чтобы мы могли создать некоторую визуализацию неперекрывающихся блоков данных, которая необходима, чтобы избежать ошибки включения «будущих данных» в потенциальные предикторы, как обсуждалось ранее в этом документе.

И давайте начнем с ежедневных возвратов TSLA, поскольку: Почему бы и нет.

Мы предоставляем лист Excel на github, если вы хотите следить за ходом работы в Excel напрямую. Прямая ссылка: https://github.com/diffent/excel/blob/main/forecasttestRoll7.xlsm

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

Рисунок 3: Возвраты и моменты, настроенные в Excel

Обратите внимание, что данные упорядочены так, чтобы последний день находился вверху, в строке 2.

Вычисление возврата

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

# (currentPrice — priorPrice)/priorPrice

=(B2-B3)/B3

Затем для вычисления моментов используются доходные значения в столбце C.

Вычисление момента

Далее мы покажем, как в столбцах с C по I настраиваются момент-кандидаты-предикторы. Мы говорим «моментоподобные», потому что среднее, стандартное, наклонное и т. д. примерно соответствуют первому, второму, третьему и т. д. моментам возвратов, но они «забиты» вниз (или вверх, в зависимости от обстоятельств), так что их числовые значения не так экстремальны, как это могло бы произойти, если бы мы просто использовали, скажем, фактический 4-й момент (возврат — среднее)⁴ (примерно эквивалентно эксцессу в нашей модели). Возьмем небольшое возвращаемое значение, например 0.01, и начнем возводить его в 4-ю степень… Ну, это маленькое значение затем станет очень маленьким, и тогда, возможно, наши коэффициенты в линейной модели могут быть огромными, и тогда… Ну кому все это надо. В решателе также могут возникнуть числовые проблемы, когда мы получаем действительно чрезвычайно значимые данные, но мы не думаем, что столкнемся с ними в Excel LINEST для такой простой модели. В основном для удобства чтения коэффициентов модели мы стараемся держать значения данных в диапазоне, скажем, от -10 до 10.

Мы раскрашиваем ячейки вручную в этом первом снимке экрана, чтобы показать разрыв между 5 нераскрашенными строками вверху, показывающий, за сколько дней мы хотим вычислить форвардную совокупную доходность (отмечено в ячейке J6). В этой первой настройке мы позволяем числу дней прямого кумулятивного возврата быть переменной (значение J6), но мы просто жестко закодировали цвета ячеек на данный момент в качестве примера для (?) 5 строк. Далее в этой статье мы покажем, как можно сделать так, чтобы цвета ячеек основывались на значении в J6, чтобы цвета отражали конкретную настройку J6, которую мы используем. Это достигается путем применения функции условного форматирования ячеек Excel, но с использованием условия, зависящего от значения другой ячейки (J6), а не от значения в ячейке, которую мы раскрашиваем. Цвета предназначены для понимания аналитиками, проверки и иллюстрации и не влияют на модель.

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

Возьмем, к примеру, STDEV (из документации Excel):

Рисунок 4: Моментальный снимок из документа Excel для STDEV

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

Асимметрия более сложна (и в доступной документации Excel она не отображается), но Википедия дает одно определение:

Рисунок 5: Формула снимка из статьи в Википедии о вычислении асимметрии, одно из нескольких возможных определений

Это немного сложнее, чем STDEV, но если вы сделаете шаг назад и рассмотрите его, вы увидите, что это (всего лишь?) отношение суммы, деленной на n, и другой суммы, деленной на n-ish (= n-1)… как главный числитель, так и знаменатель, имеющие формы, схожие с функцией СТАНДОТКЛОН, но с разными показателями степени. Кубики используются для того, чтобы избежать потери бычьего/медвежьего характера данных. Для формулы KURT-osis (которая дает оценку того, насколько жирными являются хвосты распределения возвратов… То есть: много ли экстремальных значений в данном окне возвращаемых данных, или нет), мы предоставим читателю исследовать в качестве упражнения. Финансовое обсуждение моментов, на которые мы ссылались ранее, является хорошим источником информации.

Хвостовые соотношения, теперь… Это другое животное, которое вы увидите, когда мы покажем формулы. Эти классные функции (созданные нами в Excel здесь, хотя и не изобретенные нами) имеют своего рода эффект фильтра высоких частот, а затем сопоставляются (бычий экстремум против медвежьего экстремума), чтобы дать оценку «наклона» распределения доходности в бычью или медвежью сторону — соотношение 95/5 подчеркивает более экстремальное поведение, а 75/25 выделяет немного выходящее за рамки «скучной зоны». Вместо того, чтобы забивать крайности, как это делают скользящие средние окна, они изолируют экстремумы и сравнивают их, отбрасывая промежуточные скучные дни возврата, когда не происходит ничего интересного. После COVID и т. д., возможно, некоторым из нас время от времени нужны скучные дни, поэтому мы лично не говорим, что дни с низкой отдачей скучны в плохом смысле. Но они менее новы с точки зрения прогнозирования доходности, чем экстремальные дни, которые, как правило, встречаются реже.

«Вопрос к вам»: Если бы экстремальные дни случались так же часто, как и скучные, как бы выглядело распределение возвратов?

«Ответ для вас:» Равномерное распределение!

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

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

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

Формулы отдельных моментов

Начнем с первого момента, средней доходности:

Здесь мы используем функцию OFFSET, которая позволяет нам управлять размером окна с помощью другой ячейки (J3), как отмечалось ранее.

Начиная с верхней числовой ячейки в столбце среднего значения (D), формула выглядит следующим образом:

=AVERAGE(OFFSET(C2,0,0,$J$3,1))

Размер окна составляет J3, как мы отмечали ранее (начиная с 200 торговых дней).

Возвращаемые значения находятся в столбце C, так что именно отсюда берется C2. Затем нам нужен диапазон смещения 0,0, высоты J3 и ширины 1 (что в первом примере составляет 200×1).

Договорились. Затем эта формула копируется вниз по столбцу D.

Аналогично для стандартного отклонения, асимметрии и эксцесса (простые в использовании функции в Excel, которые примерно соответствуют следующим последовательным моментам, как мы описали ранее), они вводятся в столбцы E, F и G соответственно, начиная со строки 2, а затем копируются вниз по строкам.

=STDEV(OFFSET(C2,0,0,$J$3,1))
=SKEW(OFFSET(C2,0,0,$J$3,1))
=KURT(OFFSET(C2,0,0,$J$3,1))

Аналогичное использование OFFSET используется для управления размером окна.

Хвостовые передаточные числа

Хвостовые коэффициенты немного сложнее с формулами, но на помощь приходит функция PERCENTILE:

=PERCENTILE(OFFSET(C2,0,0,$J$3,1), 0.95)/ABS(PERCENTILE(OFFSET(C2,0,0,$J$3,1), 0.05))

Затем формула соотношения хвостов 95/5 в H2 копируется вниз по строкам.

Опять же, аналогичное использование OFFSET сделано для того, чтобы позволить легко управлять размером окна, на котором вычисляются статы, из J3.

Хвостовое соотношение 75/25 практически идентично вышеуказанному, за исключением замены 0,95 и 0,05 на 0,75 и 0,25 соответственно.

=PERCENTILE(OFFSET(C2,0,0,$J$3,1), 0.75)/ABS(PERCENTILE(OFFSET(C2,0,0,$J$3,1), 0.25))

Итак, теперь у нас есть моменты возврата, или достаточно хорошие приближения к ним, и наши хвостовые соотношения! Они будут служить переменными X, которые будут отправлены в нашу линейную оценку.

Вычисление целевого значения Y

Затем мы вычислим 1-центрированную доходность в столбце K, просто добавив 1 к доходности в столбце C. Это можно было бы спрятать в формулах, но для наглядности оставим в отдельном столбце.

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

=PRODUCT(OFFSET(K2,0,0,$J$6,1))

Здесь мы используем K2 (1-центрированная доходность) и J6, чтобы контролировать, сколько дней накапливать. Это другой размер окна, чем наши 200, которые мы использовали для вычисления моментов. Здесь он установлен на 5 дней, но это будет переменная модели, которую мы можем настроить в J6. Например, мы хотим вычислить прогноз на 2 недели, введя 10 (торговых дней) в J6.

Затем эта формула копируется вниз по столбцу L.

Имейте в виду, что это скользящий 5-дневный доход, который пересчитывается каждый день.

Формула модели

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

(Являются ли они мистическими? Что, черт возьми, означает Т? Может быть, это как-то связано с «t-критерием Стьюдента»… , но подождите, это строчная буква t. Это тот же Т? Ну, по крайней мере, номенклатура мистическая, но сами значения легко понять, как мы увидим.)

в нижней части этого снимка, о котором мы вскоре поговорим.

Это подводит нас к одному из наших наименее любимых аспектов Excel, вводу «формул массива»: формул, которые выводят так называемый «массив». Обратите внимание, что они действительно выводят (по крайней мере, в данном случае) прямоугольный диапазон, поэтому, возможно, их следует называть «формулами диапазона»… Но такую номенклатуру решать не нам. Формулы массивов сами по себе прекрасны, просто ввод их немного громоздкий, когда вы впервые их изучаете.

Несмотря на то, что формула отображается в одной строке в Excel (вы можете выбрать ячейку Q2, чтобы увидеть ее), давайте разберем ее по аргументам для удобства просмотра, с нашими комментариями, не относящимися к Excel, справа. В формуле используется функция LINEST (линейная оценка):

=LINEST(

OFFSET(OFFSET(L2, 0,0, $J$12,1),$J$9,0), # known Y values (column)

OFFSET(OFFSET(OFFSET(D2:I2,0,0,$J$12),$J$6,0),$J$9,0), # known X values (block/range)

TRUE,TRUE) # fit with a constant, show statistics

Настройка значений Y по размеру

В документации по формуле линейного оценивания LINEST мы видим, что первый аргумент — это место, куда мы помещаем «известные значения Y», значения, которые мы пытаемся подогнить. Для этого мы хотим использовать 5-дневную совокупную доходность. В нашем случае, поскольку нам нужна некоторая вариативность в том, сколько значений должно быть подогнано, мы снова используем функцию СМЕЩЕНИЕ, которая позволяет задать прямоугольный диапазон переменного размера и положения.

Давайте начнем с самой внутренней функции OFFSET в этом первом аргументе «Y values», которая указывает подстолбец данных, который необходимо вписать. Опять же, мы помещаем некоторые аргументы в отдельные строки для ясности, и используем комментарии, не достойные Excel:

OFFSET(L2, # cell at start of range

0,0, # offset row and column: none

$J$12,1) # height: from J12 (100 to start)

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

Мы можем использовать диаграмму общественного достояния из «Вики», чтобы проиллюстрировать:

Рисунок 6: Напоминания об определениях типичной геометрии на кривой. Автор забыл, что секущий и аккорд — это как бы одно и то же, но секущий — это бесконечная линия, а аккорд — отрезок линии. Геометрия в седьмом классе была давно, в далеком пригороде…

Обратите внимание на линию, помеченную как «касательная», которая касается кривой. Что мы хотим получить от линейной модели в данном случае, так это касательное приближение к любой кривизне в рассматриваемом явлении, поскольку на самом деле LINEST является линейной моделью, и мы не моделируем здесь никакой кривизны. Если мы попытаемся поместить слишком много точек назад во времени в этот тип линейной модели, мы получим больше хордовую или секущую модель, которая отбрасывает и игнорирует любое искривление лежащей в основе геометрии явления в этой локальной области. Касательная также игнорирует кривизну, но игнорирует ее в одном месте на поверхности. Он лучше игнорирует кривизну. Простой снимок Wiki показывает, что кривая представляет собой круг, но в нашей модели «кривая» представляет собой поверхность 7 измерений (с размерами скользящего среднего, скользящего стандартного отклонения и т.д., как мы вычислили ранее… и конечная ордината [поверхностный уровень] над гиперплоскостью переменной момента X «5-дневного возвращения»). Поскольку мы помещаем в модель N >> 1 точек, мы создаем модель скорее секущего типа, чем модель касательной в точке; Но чем меньше точек нам сойдет с рук в модели, тем ближе мы будем к истинной касательной.

Внешняя функция OFFSET в этом первом аргументе Y функции LINEST предназначена для тестирования модели на истории или иного отката назад во времени, о чем мы поговорим далее в этой статье.

Обратите внимание, что ячейка J9, на которую ссылается этот OFFSET, установлена в 0 (без тестирования на истории или отката) для начала, поэтому это не влияет на результаты, когда мы начинаем.

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

Настройка столбцов X по размеру

Сначала мы начнем с формулы динамического диапазона с помощью внутренней функции OFFSET.

Для значений X (переменных-кандидатов в предикторы) мы используем столбцы моментов, которые мы установили ранее, столбцы от D до I. Мы используем ту же высоту J12 (начиная со 100 строк), что и для целевых значений Y (кумулятивные доходы), иначе регрессионная аппроксимация не удастся.: Нам нужно, чтобы в LINEST было подано то же количество точек X (строк), что и точек Y.

СМЕЩЕНИЕ(D2:I2,0,0,$J$12)

Обратите внимание на небольшое отличие от того, как мы настроили диапазон Y: здесь мы указываем верхнюю часть диапазона как D2:I2, чтобы включить все наши переменные-кандидаты (width > 0), поэтому нам не нужно конечное значение ширины в формуле OFFSET. Часто существует несколько правильных способов настройки формул Excel; Это как раз тот путь, с которого мы начали.

Теперь, если мы посмотрим на OFFSET, который оборачивает самый внутренний OFFSET (внутренний показан ниже только как «…» для наглядности), мы видим, что значение J6 снова вступает в игру. Если мы посмотрим на аннотации ячеек, которые мы предоставили на рисунке 3, мы вспомним, что J6 — это форвардное кумулятивное число доходности (в торговых днях), которое мы вычислили ранее. Что нам нужно сделать с нашим блоком данных X (диапазон Excel), так это сдвинуть его вниз так, чтобы он совпал с цветным блоком на рисунке 3, потому что мы не хотим, чтобы диапазон X находился в зоне «будущего» нашего возвратного накопления в 5 дней. Мы должны получить X данных из прошлого.

OFFSET( … , $J$6,0)

К сожалению, стрелки аудита формулы Excel и подсветка границ ячеек (при выборе формулы) не учитывают функции OFFSET (которые дают различные диапазоны в зависимости от того, какие значения вы им передаете), и поэтому мы закрасили эти ячейки блока переменных X на рисунке 1. Аудит/выделение формул на основе определений диапазона переменных размера/расположения, возможного в OFFSET, было бы еще одним приятным улучшением в будущей версии Excel, если кто-то из Microsoft читает это.

Таким образом, диапазон Y модели LINET по сравнению с диапазоном X выглядит следующим образом, когда кумулятивные дни доходности равны 5.

Рисунок 7: Многостолбцовые предикторы-кандидаты X (левый цветной блок) в сравнении с целевым значением Y (столбец L). X смещается вниз на 5 строк от Y, так как Y является кумулятивной 5-дневной доходностью.

На самом деле, чтобы ввести формулу массива в нужный блок ячеек, это немного похоже на упражнение типа игры Twister с вашими пальцами, включающее в себя выбор блока ячеек, осторожный ввод формулы (можете ли вы затем выбрать другие ячейки, чтобы указать, когда вы вводите эту формулу, так как вы уже выбрали блок ячеек в качестве целевого диапазона… или нет?), затем нажмите Ctrl-Shift [Примечание 4].

Вы заметите, что некоторые значения #N/A выводятся из выходных данных формулы массива LINEST.

Значения последней строки #N/A вызваны тем, что мы выбрали больший диапазон, чем нужно, перед вводом формулы массива с помощью Ctrl-Shift. Значения #N/A в допустимом прямоугольнике диапазона — это именно то, как работает функция LINEST. LINEST не нуждается в этих ячейках, поэтому помечает их, чтобы незадачливый пользователь не пытался туда что-то поместить… Мы думаем.

Рисунок 8: Пример выходных данных формулы ЛИНЕЙН #N/A

Обсуждение

Прежде чем мы перейдем к выходным данным модели LINEST, давайте рассмотрим настройку:

  • Целевой диапазон значений Y (совокупная доходность), высота 100 строк.
  • Диапазон X (предикторы-кандидаты), 6 столбцов в ширину и 100 строк в высоту.
  • Одинаковое количество точек X и Y: CHECK ✅

Блок данных диапазона X не начинается с той же строки, что и диапазон Y, здесь он смещен на 5 (это смещение определяется ячейкой J6).

Выходные данные модели — Коэффициенты

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

Коэффициенты модели находятся в строке 2, столбцы от Q до W.

Стандартные ошибки коэффициента модели находятся в строке 3, столбцы с Q по W.

Мы помещаем аннотации имен переменных в строку 1 (начиная со столбца Q), чтобы мы помнили, что происходит с переворотом коэффициента. Константа модели находится в дальнем правом конце строки коэффициентов в ячейке W2.

Выходные данные модели — стандартные ошибки

Оцененные стандартные ошибки LINEST [Примечание 3] (коэффициентов) в столбцах 3 строк с Q по W можно рассматривать так, что они являются своего рода «коэффициентом наклона» или допуском каждого коэффициента. Это не официальная терминология «статиста», но служит разумным разговорным объяснением.

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

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

Возможный диапазон коэффициентов = коэффициент +- 2*standard_error

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

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

«Насколько велико является слишком большим» для стандартных ошибок оценивается с помощью так называемых Т-баллов, которые вычисляются в строке 14, начиная со столбца Q и идя вправо на листе. Здесь вы можете слишком запутаться, если не знакомы со статистикой… вся эта штука с буквой «Т». Как мы уже упоминали ранее, что, черт возьми, означает буква «Т»? Т-балл? Значение T? А как насчет Z-оценки? p-значение? F статистика? Что???

Но эти Т-баллы являются всего лишь коэффициентом, деленным на собственную стандартную ошибку. Они являются лишь мерой того, насколько велик коэффициент отстойности по сравнению с коэффициентом.

T = coefficient/standard_error_of_coefficient

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

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

Тем не менее, абсолютное значение T больше 2 (т.е. стандартная ошибка равна половине коэффициента |value| или ниже) кажется довольно хорошим начальным правилом для использования для сохранения переменной в модели. Если abs(T) >> 2, то соответствующая переменная, вероятно, является используемой переменной в линейной модели. Если abs(T) << 2, то это, вероятно, бесполезная переменная в модели, и она может привести к тому, что прогноз пойдет наперекосяк, когда мы начнем вбрасывать будущие данные в модель.

В этих типах моделей, где мы ищем иголки в стогах сена (прогнозирование фондового рынка, как известно, проблематично или даже невозможно, согласно некоторым теориям) — пытаясь различить тихий сигнал в поле громкого шума — мы можем принять оценку T ниже 2 [Примечание 5]. Но когда показатель T становится около 1 и ниже, это означает, что стандартная ошибка примерно такая же, как и сам коэффициент, или больше. Это означает, что истинное значение коэффициента может быть в некотором смысле «по всей карте» или даже равно нулю, как мы отмечали ранее. (Нулевой коэффициент, означающий, что мы должны выбросить эту переменную из модели и заново подогнать модель с меньшим количеством переменных).

Пересмотр Т-оценки

Помня об этом, давайте рассмотрим наши Т-баллы здесь!

Рисунок 9: T баллов исходной модели в нижней строке

Один из Т-показателей, который кажется особенно подозрительным, — это Т-показатель, связанный со стандартным отклонением (столбец U). При значении 0,78 это говорит о том, что STDEV не вносит существенного вклада в качество модели, если вообще влияет, и нам, вероятно, не следует включать STDEV в эту конкретную модель. Это относится только к данной конфигурации модели (0 дней сдвинуто назад, 200 точек на моменты вычислений, на 5 дней вперед). Оценки T будут изменяться, когда мы изменим эти переменные, поэтому мы должны позаботиться о том, чтобы не выбрасывать переменные слишком охотно, глядя только на эту начальную настройку модели.

Оценка T константы модели равна -1,6, что, вероятно, является пограничным. Но поскольку мы пытаемся подогнать 1-центрированные доходы, нам, вероятно, следует оставить константу в модели (это конкретное решение показало, что она равна -1,37 в ячейке W2). Если вместо этого мы подгоним 0-центрированные возвраты (что является быстрым вариантом, который мы могли бы попробовать), мы могли бы быть более восприимчивы к тому, чтобы выбросить константу из модели.

Отбрасывание других переменных с низким вкладом

Важно, если мы отбрасываем переменную (например, стандартное отклонение доходности или волатильность в финансовых терминах), затем повторно подгонять модель оставшимся списком переменных для достижения наилучшей точности. Мы не будем делать этого на текущем этапе обсуждения, так как сначала нужно рассмотреть еще кое-что, но мы оставим исключение переменных в качестве более позднего уточнения модели. Когда мы исключим предикторы-кандидаты с низкими абсолютными показателями Т, наши прогнозы должны улучшиться (хотя показатели «соответствия» данных в выборке, такие как R2, могут снизиться, что ожидаемо). Поскольку мы еще не проверили прогнозы вне выборки (мы проверили только соответствия), мы не знаем, насколько хороша наша модель со всеми переменными-кандидатами (даже плохо предсказывающими). Мы будем использовать случай «все переменные в» в качестве отправной точки, от которой мы сможем отталкиваться.

Другие выходные данные модели

Обратившись к документации Excel по функции LINEST, мы видим, что под первой (крайней левой) выходной ячейкой стандартной ошибки находится R-квадрат модели (аппроксимации). В нашем случае это ячейка Q4 со значением 0.52. Мы хотим, чтобы это значение было ближе к 1, если это возможно, но не слишком близко (иначе это может указывать на переобучение). В этом примере использования 6 переменных плюс константа для (линейной) модели 100 точек данных, переобучение не является проблемой для начала. R-квадрат = 0,52 является своего рода «половинчатой» моделью, если мы думаем о R = 1 как о полностью предсказательной модели. Половина поведения в данных фиксируется нашей моделью линейных моментов.

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

Справа от значения R-квадрат находится стандартная ошибка прогнозируемого Y, значение 0,0518. Мы хотим, чтобы это значение было низким. Это указывается в единицах измерения Y (5-дневный возврат в данном случае). В снимке документа Excel LINEST это ячейка B3, на нашем листе это ячейка R4.

Для получения дополнительной информации о статистике (F, df, ss(reg), ss(resid)) вы можете обратиться к документации Excel LINEST.

Рисунок 9A: Выходные данные Excel LINEST (из документации Excel)

Возможно, мы расскажем об этом подробнее в следующей статье или в разделе «Следующие шаги». Меньшие (сумма квадратов) выходов отчетов могут быть полезны для вычисления других метрик, таких как скорректированный R2 или более сложные метрики линейной модели. Мы тратим меньше времени на эту статистику, потому что нас (в настоящее время) больше интересует тестирование (и/или перекрестная проверка) моделей для их тестирования (так же, как это делается с помощью моделей машинного обучения), чем изучение статистики линейных моделей. Чтобы правильно полагаться на линейные статистические данные, нам, возможно, придется сначала проверить несколько вещей: нормально ли распределены остатки модели (ошибки аппроксимации) и другие правила линейных моделей. Мы еще даже не смотрели на остатки. Каковы последствия (с точки зрения достоверности выходных статистических данных) подгонки линейной модели к возможно нелинейным явлениям? Мы не знаем навскидку, и, следовательно, безопаснее всего провести тестирование на истории.

Подогнанные в выборке данные

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

Мы помещаем данные, сгенерированные моделью, в столбец M рядом со столбцом L, который содержит фактические данные, выровненные по строкам.

Прогнозная модель немного громоздкая, но это просто линейная модель (сумма произведений) в виде:

yPredicted = A*x1 + B*x2 + … + constant

В следующей формуле 2-й множитель произведений (от V$2 до Q$2) являются коэффициентами модели (и конечной константой), полученными в результате выходных данных LINEST.

Мы снова используем функцию OFFSET, чтобы обработать тот факт, что наши значения X мы получаем из более низких строк, чем значения Y (смещение на J6, текущее значение 5, что, как мы помним, является количеством накопленных доходов, которые мы пытаемся спрогнозировать (5-дневная доходность)).

fit_cumulativeReturnOver (Yhat) формула для столбца M

=OFFSET(D2,$J$6,0)*V$2 +
OFFSET(E2,$J$6,0)*U$2 +
OFFSET(F2,$J$6,0)*T$2 +
OFFSET(G2,$J$6,0)*S$2 +
OFFSET(H2,$J$6,0)*R$2 +
OFFSET(I2,$J$6,0)*Q$2 +
W$2

Эта формула копируется вниз по столбцу М.

Рисунок 10: Подогнанные результаты в столбце M

В качестве проверки здравомыслия мы можем сравнить первые несколько строк столбца M с целевым столбцом L. Значения, по-видимому, находятся в правильном диапазоне.

Построение графика с фактическим значением по оси X и прогнозируемым (подгонкой) по оси Y показывает неплохую модель, учитывая, что это прогнозы фондового рынка, а это всего лишь линейная модель. Значение R2 на этом точечном графике совпадает со значением R2, полученным LINEST в ячейке Q4, что дает нам вздох облегчения. Обратите внимание, что этот R2 применяется только к самым последним 100 точкам данных (недавние означают 3 ноября 2023 г. «и назад во времени»).

Рисунок 11: Фактическое и прогнозируемое первое испытание

Подготовка к бэктесту в скользящем окне

Теперь, когда у нас есть настроенная базовая модель, мы можем откатить ее назад во времени и протестировать, как она может прогнозировать. С этой целью мы настроим ячейку J9 таким образом, чтобы блоки данных X и Y, введенные в формулу LINEST, подавались вниз. Это проиллюстрировано некоторым условным форматированием цвета фоновой ячейки, добавленным в блок данных X, и верхним (самым последним) значением Y, которое нужно уместить (столбец L, совокупная доходность за столько-то дней… 5 дней в нашем примере). Мы также условно выделяем фактические доходы, которые умножаются на самое верхнее (откатывающееся) значение. Как это работает визуально, проиллюстрировано на следующем GIF-файле:

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

Всякий раз, когда мы изменяем это значение отката в J9, линейная модель LINEST автоматически перерешается для новых блоков данных.

Прогноз на шаг впереди

Чтобы проиллюстрировать наш метод прогнозирования на один шаг вперед, мы сначала установили J9 в 1, чтобы откатить структуру модели на один день назад.

Рисунок 12: Пример прогноза на шаг вперед

Самое последнее подгонка значения Y теперь находится в ячейке L3 (а не в ячейке L2, условие отсутствия отката по умолчанию). Теперь мы посмотрим на столбец M, который является вычисленной формулой, сгенерированной LINEST (просто линейная модель A + Bx1 + Cx2 + …). «Подгонка» в точках, оцениваемых выборкой, находится на точке M3 и ниже. Однако M2 теперь автоматически является первой прогнозируемой «будущей точкой» (вспомните, что наши данные расположены в порядке «самые последние в верхней строке»). Если наша модель хоть сколько-нибудь хороша, то она должна примерно соответствовать фактическим данным за этот день (который находится в L2). Обратите внимание, что L2 теперь не подается в модель, а J9 настроен на откат на 1 день. L2 — это «в будущем», откуда расположены блоки данных модели Y по строкам. Мы видим фактическую доходность 1,0610 в L2 и прогнозируемую доходность модели на 1 день вперед 1,0164. Это верно с точки зрения направления (и бычье, где 1,0 является границей между медвежьим и бычьим в этом 1-центрированном пространстве доходности), но в остальном довольно плохо (соответствует доходности 6,1% против доходности 1,64%). Хорошо, но мы возьмем. Это всего лишь линейная модель, причем необработанная.

Следующий макрос отката возьмет этот прогноз на 1 день вперед и поместит его в ячейку N2. Затем он откатит структуру еще на один шаг назад, получит прогноз на 1 день вперед (следующий прогноз будет в ячейке M3) и поместит его в ячейку N3. И так далее.

Макрос отката

Мы построили макрос для отката структуры модели на 1 день назад и сбора интересующих результатов на каждом шаге, включая прогноз на 1 день вперед.Sub rollback()

‘ comment out this line to see step by step results of the macro (slower run time)
‘ Application.ScreenUpdating = False

Let ntrials = Range(«J15»).Value

‘ clear output to avoid mistakes (optional, can be removed)

For nback = 1 To ntrials
Range(«N2»).Offset(nback — 1, 0).Value = 0
Next

For nback = 1 To ntrials

‘ set rollback amount

Range(«J9»).Select
ActiveCell.Value = nback

‘ recompute regression and whole sheet
Application.Calculate

‘ pull forecasted result one day past «to fit» data block, store in column N

Range(«N2»).Offset(nback — 1, 0).Value = Range(«M2»).Offset(nback — 1, 0).Value

‘ store R2 at each step back into Column AA as quick sanity check

Range(«AA2»).Offset(nback — 1, 0).Value = Range(«Q4»).Value

‘ store computed T scores for each variable in columns AB to AH at each step back of the rollback

For colOffset = 0 To 6
Range(«AB2:AH2»).Offset(nback — 1, colOffset).Value = Range(«Q14»).Offset(0, colOffset).Value
Next

Next

Application.ScreenUpdating = True

End Sub

Мы настроили ячейку J15 так, чтобы она сообщала макросу, сколько раз откатывать (сколько точек тестировать на истории), и добавили кнопку на листе для запуска макроса тестирования на истории. Следующее видео/gif демонстрирует макрос тестирования на истории, выполняемый для 10-шагового тестирования назад»

Рисунок 13: Пример тестирования на истории за 10 дней с помощью запуска макроса отката

Вот крупный план результата 10-дневного тестирования на истории:

Рисунок 14: 10-дневное тестирование на истории, увеличение результатов.

Мы вычисляем, являются ли прогнозы на 1 шаг вперед правильными (бычьими/медвежьими) в столбце O, подсчитываем их на P2 (значение 9 здесь) и вычисляем процент правильности. Это 90%, но давайте пока не будем слишком интересоваться этим, так как это всего лишь 10-дневный бэктест, и преобладание медвежьих дней в этом 10-дневном отрезке означает, что наши данные несбалансированы с точки зрения категоризации, на которую нам нужно обращать внимание при вычислении метрик качества модели.

Вместо этого обратитесь к ячейке Q19, где у нас есть R2, вычисленный для 1 дня из выборки бэктестов:

=POWER(CORREL(OFFSET(L2,0,0,$J$15,1),OFFSET(N2,0,0,$J$15,1)),2)

Это составляет 51%, что меньше, чем окончательный показатель соответствия для этого бэктеста, который, в свою очередь, показан немного выше в Q17. Ожидается направление этого неравенства (качество OOS меньше, чем качество в выборке).

Прокручивая немного вправо в столбце AA (числа здесь не показаны, см. пример файла электронной таблицы и рисунок 14A), мы сообщаем R2 соответствия каждой из 10 регрессий, которые произошли во время тестирования на истории. Они также находятся на том же уровне, что и наш OOS R2, так что столбец AA проверяется как проверка на вменяемость… все R2 подходят немного выше, чем OOS R2.

Рисунок 14A: R2 подгонки во время тестирования на истории (номер на истории по X), из столбца AA в электронной таблице

1 год тестирования на истории

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

Рисунок 15: Результат тестирования на истории за 1 год #1

Игнорируя корреляцию соответствия 0,17 на данный момент в ячейке Q17 (то есть корреляцию соответствия последнего шага бэктеста), мы смотрим на число под ним: «коррель бэктеста на 1 шаг вперед», который равен 0,25 (это значение R2, а не значение R). [Обновленный лист в github будет иметь скорректированную аннотацию, описывающую это значение как R2, а не R]. Не так хорошо, как оригинальный бэктест на 10 прогонов, но это жизнь, и это тоже ненастроенная линейная модель. Процент правильности направления выглядит лучше: 67% = 0,67 = 169/252.

Пример быстрой настройки модели

Прежде чем мы пойдем дальше, мы можем продемонстрировать быстрый шаг настройки модели, изменив количество точек в регрессии на 50 (со 100) [изменив ячейку J12 на 50], а затем повторно запустив бэктест. Затем процент правильности направления возрастает до 71% OOS, а корреляция OOS (R2) возрастает до 0,27 (с 0,25). Установив число регрессии модели равной половине своего предыдущего значения, модель фокусируется на более локальном поведении в конце временного окна подгонки и дает немного лучшие прогнозы в этом 252-дневном тестировании на истории.

Рисунок 16: При использовании 50 точек в регрессии вместо 100 результаты тестирования на истории немного улучшаются. N точек в регрессии является гиперпараметром модели.

Обсуждение

Опытные специалисты по статистике и моделлеры увидят всевозможные вещи, которые мы можем сделать, чтобы улучшить эту модель, даже не выходя за пределы области линейных моделей. Как мы уже говорили ранее, нам, вероятно, следует что-то сделать с удалением из модели переменных с низким вкладом (на каждом шаге бэктеста, автоматически), возможно, мы можем добавить еще несколько потенциальных предикторов (возможно, коэффициент Шарпа или Сортино, используя тот же размер окна, что и моменты, или другие окна); Возможно, нам нужно добавить в модель запаздывающие доходы (в смысле авторегрессионной модели); Возможно, для каждого момента нужен отдельный размер окна. Добавить термины «скользящая средняя» непросто

(скользящее среднее [MA] ошибок в смысле временных рядов ARIMA; члены MA являются «обратными» членами, которые возвращают ошибки модели обратно в уравнение прогнозирования для использования в качестве потенциальных предикторов)

в модель Excel с базовым Excel — но это можно сделать с помощью некоторых расширений или плагинов:

https://help.xlstat.com/6753-fit-arima-model-time-series-excel

… для моделирования того, как быстро прогнозист восстанавливается после потрясений. Или, может быть, это становится слишком сумасшедшим… Может быть, хвостовое соотношение 90/10 или хвостовое соотношение 99/1 является лучшим предиктором, чем соотношение 95/5, которое мы здесь используем? Или хвостовое соотношение с верхним и нижним отсечками, определенными как гиперпараметры модели? Кроме того, мы могли бы вычислить эти типы предикторов моментов для других активов (таких как SPY, ETF на S&P 500 или, возможно, ETF на потребительские товары или технологии) и поместить их в модель TSLA, а затем позволить линейному регрессору отбросить их, если они не являются предсказательными.

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

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

Не совсем OOS

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

Предостережение

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

https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2606462

Итоги

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

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

Кроме того, мы показываем, что можно использовать простой макрос Excel для тестирования этой настройки модели. Существует множество усовершенствований и настроек модели, прежде чем кто-то попытается использовать это в каком-либо реальном смысле — наша первоначальная настройка оставляет много точности «на столе», но мы предоставляем таблицу Excel в качестве пищи для размышлений. Обратите внимание, что сильный направленный сигнал (бычий/медвежий) может быть достаточно хорош для практического варианта использования, но мы оставим практические тесты до тех пор, пока не усовершенствуем модель.

Любые сколько-нибудь точные результаты прогнозирования доходности акций вне выборки должны быть проверены на «вероятность достижения таких хороших результатов случайным образом», поскольку случайный успех при прогнозировании цен на активы не только возможен, но и ожидаем, когда в игре участвует достаточное количество игроков. Смотрите работы профессора Рубини для получения дополнительной информации об этой идее, если вы еще не знакомы с ней: https://en.wikipedia.org/wiki/Nouriel_Roubini

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

И наоборот: сначала они говорили, что Эйнштейн ошибался, а теперь они говорят, что Саган ошибался?

https://iai.tv/articles/carl-sagan-was-wrong-ordinary-evidence-is-enough-auid-2348

На это может быть только один ответ: «Помогите мне, мистер Скотт».

Дополнительные материалы

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

https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3972810

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

https://medium.com/@nttp/backtest-to-the-future-1ea4db87845c

Примечания к листу Excel

Нижняя часть листа имеет «рваные края», поэтому, если вы модифицируете лист для выполнения более длинных бэктестов, убедитесь, что все формулы скопированы достаточно далеко.

Обновления

3 декабря 2023 г.: Добавьте прямую ссылку на файл Excel в теле статьи, чтобы сделать ее более понятной.

Примечания

[Примечание 1] А что такое доходность, кроме нормализованных разниц?

разность = (p1-p0)

[единицы = доллары или любая другая валюта, в которой оценивается актив]

return = (p1 — p0)/p0 [разница, нормализованная на базовую цену p0]

[единицы = чистое соотношение, без единиц = дробь или процент, если вы предпочитаете умножать на 100]

[Примечание 2] Можно написать сценарий и провести тест на стационарность на акциях S&P 500 или 6000+ акций, доступных на биржах США, чтобы увидеть, действительно ли существуют какие-либо ценовые стационарные ряды.

[Примечание 3] Если вы хотите попробовать метод, описанный в этой статье, с ценообразованием криптовалют, помните, что криптонеделя — это 7 торговых дней.

[Примечание 4] Если вы изменяете формулу массива, вы также должны повторно ввести ее с помощью ctrl-shift. Сообщение об ошибке Excel, которое вы получаете, если просто нажимаете ввод / возврат, не говорит вам об этом, оно просто говорит вам, что вы не можете изменить часть формулы массива. Мне потребовалось много времени, чтобы осознать это. Годы, на самом деле. Микрокрепостные, возьмите на заметку!

[Примечание 5] Джон Кокрейн и другие говорят, что |Т| Оценки около 2 являются лишь незначительно «статистически значимыми» в традиционном смысле (здесь мы говорим, ну… |Т| ~= 2 … с таким же успехом можно сказать, что это существенно… Помните, что T = 2 означает, что погрешность в два раза меньше самого коэффициента), но, тем не менее, может иметь реальное значение.

Смотрите раздел Статистическая значимость, начиная со страницы 2 этой статьи:

https://faculty.washington.edu/ezivot/econ589/CochraneRFS2008.pdf

Раскрытие возможностей динамического искривления времени

Знакомство

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

Представлено динамическое искривление времени

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

Сила, стоящая за DTW

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

Пошаговое руководство по реализации

Набор данных и инструменты

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

Шаг 1: Импорт необходимых библиотекimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from scipy.spatial.distance import euclidean
from fastdtw import fastdtw
import yfinance as yf

Шаг 2: Получение и предварительная обработка данных

Для этой иллюстрации мы проанализируем движение цен на акции Apple Inc. Для получения данных мы будем использовать библиотеку yfinance.apple_stock = yf.download(‘AAPL’, start=’2020-01-01′, end=’2023-01-01′)
apple_stock[‘Close’].plot(title=»Apple’s Stock Price»)
plt.show()

Шаг 3: Внедрение DTW

Мы разделим данные на две части и используем DTW для поиска сходства и повторения шаблонов.from fastdtw import fastdtw

# Segmenting the data
part1 = apple_stock[‘Close’][:125].values
part2 = apple_stock[‘Close’][125:].values

distance, path = fastdtw(part1, part2, dist=euclidean)
print(‘Distance:’, distance)

# Plotting the data
plt.plot(part1, label=’Part 1′)
plt.plot(part2, label=’Part 2′)
plt.title(‘Stock Price Movement with DTW’)
plt.legend()
plt.show()

Анализ и выводы

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

Вызовы и возможности

DTW не лишен сложностей. Это требует значительной вычислительной нагрузки и глубокого понимания природы биржевых данных. Оптимизация DTW и ее интеграция с другими прогнозными моделями и алгоритмами машинного обучения может открыть доступ к надежным моделям прогнозирования акций.

Заключение

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

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

Часть 2: Исключение терминов и нулевая терпимость

Фото Карлоса Иринеу да Коста с сайта Unsplash Этот дисплей Nixie tube предполагает более значимые цифры, чем наша модель сможет предсказать.

Как только энтузиаст Excel начнет понимать нашу предыдущую статью об оценке будущих доходов по предыдущим моментам, вы можете перейти к уточнениям модели, некоторые из которых мы опишем в этой статье. На данный момент мы придерживаемся линейных моделей через Excel LINEST, и упрощаем их, чтобы сделать их еще менее подходящими… с прицелом на то, чтобы они лучше предсказывали.

Эта статья является частью 2 нашего линейного исследования моментов возврата в Excel. Часть 1 здесь:

https://medium.com/@nttp/n-day-ahead-stock-return-forecasting-with-moment-like-predictors-5d73793c4f15

Обновленный файл Excel для этой части 2 можно найти здесь, если вы хотите следовать инструкциям в таблице:

https://github.com/diffent/excel/blob/main/forecasttestRoll9TSLAztolB.xlsm

Несмотря на то, что существуют программные плагины для уточнения линейной модели в Excel — например, для прямой и обратной пошаговой регрессии и, возможно, даже для исчерпывающей регрессии лучших подмножеств — мы можем начать с довольно простого пошагового макроса в обратном направлении для уточнения ЛИНЕЙН. По счастливой случайности (достаточно редкой, если вы перегруженный разработчик программного обеспечения), функция ЛИНЕЙН, по-видимому, продолжает работать нормально, если вы даете ей один или несколько столбцов нулей во входных данных диапазона X. Это делает создание пошагового макроса в обратном направлении довольно простым, без необходимости перемещать столбцы данных и удалять постоянные столбцы. Некоторые коды регрессии являются «чувствительными» и «блеют» (если использовать технический термин), если вы даете один и тот же столбец данных X более одного раза. Но, по крайней мере, для нескольких столбцов, заполненных нулями, ЛИНЕЙН, похоже, работает нормально.

Читатель может изучить наш код макроса обратной пошаговой регрессии, который выглядит следующим образом:Sub backwardsStepwise()
‘ simple backward stepwise regression
‘ make sure all variables are on to start (all masks set to 1)
Call restoreAllVariables
Application.Calculate
Let tol = 0.001
Let minAllowedT = Range(«J18»).Value
‘ cycle over min abs(T) range across columns to the right
Let nmasked = 0
Let themin = 0
For j = 0 To 100 ‘ ludicrously large
‘ crude way to find the min T score variable
For i = 0 To 5
themin = Range(«Q21»).Offset(0, i).Value
Let testvalue = Range(«Q15»).Offset(0, i).Value
Let priorMask = Range(«Q25»).Offset(0, i).Value
If ((themin < minAllowedT) And (Abs(themin — testvalue) < tol)) Then
Range(«Q25»).Offset(0, i).Value = 0
Application.Calculate
nmasked = nmasked + 1
End If
Next
themin = Range(«Q21»).Offset(0, i).Value
‘ no more
If (themin >= minAllowedT) Then
Exit For ‘ exit the ludicrously large loop
End If
Next
End Sub

Мы настроили несколько формул в таблице, чтобы упростить макрос для этого конкретного примера, но иногда может быть интересным упражнением написать «drop in replacement» для LINEST, который выполняет обратное пошаговое удаление терминов. Просто поищите «пошаговая регрессия Excel» в Google — или, осмелюсь сказать, в Bing? [Примечание 4] — и вы найдете кучу интересных вещей, связанных с этим. Тем не менее, некоторые из этих (коммерческих) пакетов являются регрессией на основе пользовательского интерфейса, а не вставными формулами, которые можно использовать с помощью макросов (что нам нужно для автоматизированного тестирования на истории).

Итак, достаточно предыстории: давайте перейдем к нашей формулировке обратного исключения терминов.

Пересмотр Т-оценки

Мы установили Т-баллы в таблице для каждого коэффициента (обсуждались в предыдущей статье; они формально указывают на «статистическую значимость» [Примечание 1] каждой переменной в модели; чем дальше каждый Т от нуля, тем лучше… то есть, если мы намерены сохранить эту переменную в модели).

Флаги переменной маски

Затем в Q25:V25 мы установили маску переменной X. Этим ячейкам маски будет разрешено принимать значения 0 или 1 по соглашению, но они никоим образом не будут ограничены этими двумя значениями. Так что будьте осторожны и не ставьте 2 или что-то подобное в одну из этих ячеек, иначе вы запутаетесь позже. Обратите внимание, что мы игнорируем константу в правом конце (столбец W) для этой процедуры маскирования терминов. На данный момент мы хотим всегда сохранять константу в модели (см. нашу предыдущую статью для некоторых подсказок о том, почему мы это делаем; короткий ответ: Это связано с тем, что мы используем 1-центрированную доходность в этой модели).

Допускается ручное маскирование переменных

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

Следовательно, позаботьтесь о том, чтобы случайно не оставить какую-либо из этих масок равной 0, если вы хотите очистить допуск T до нуля, чтобы сохранить все члены в модели.

Моды переменных масок в формулах

Далее мы применяем маски к нашим переменным X в столбцах от D до I.

Ниже приведена настройка маски переменной X для столбца D.

Вспомните обратную ситуацию с выводом с помощью ЛИНЕЙН:

https://www.excelforum.com/excel-general/353071-linest-why-did-they-do-that.html

Крайнее левое переменное среднее (в столбце D) использует маску ($V$25) из крайней правой переменной в выходных данных ЛИНЕЙН (кроме константы модели, которую мы пока игнорируем).

=СРЗНАЧ(СМЕЩЕНИЕ(C2;0;0;$J$3,1))*$V$25

Флаги маски применяются к столбцам с E по I аналогичным образом.

Теперь, если мы вручную очистим (установим в ноль) флаг маски в Q25:V25, мы увидим, что (а) связанный столбец X становится равным нулю. И (б) ЛИНЕЙН по-прежнему решает.

Рисунок 1: Пример маскировки переменных tail9505 и tail7525 вручную. Коэффициенты из ЛИНЕЙН отображаются как 0, а Т-баллы кодируются в наших формулах как 999, поэтому мы знаем, что эти переменные нужно игнорировать в обратном ступенчатом алгоритме.

При расчете ЛИНЕЙН устанавливает коэффициент и стандартную ошибку, связанные с переменной, замаскированной под нулевое значение, равными нулю в своих выходных данных. Поскольку stderr имеет значение 0, а наша оценка T равна coeff/stderr, мы корректируем формулы оценки T в Q14:W14, чтобы выдать 999 вместо #DIV/0 в Excel! Ошибка при stderr = 0. Зачем в этом случае устанавливать T равным 999 вместо нуля? Это играет важную роль в нашей методологии выбора терминов для макроса пошаговой регрессии (в частности, в том, как мы выбираем следующую переменную для исключения), которую мы вскоре обсудим.

Абсолютные Т-баллы

Затем мы вычисляем abs(T) в Q15:W15, а затем вычисляем min этого диапазона в каждой ячейке Q21:W21 (та же формула в каждой ячейке Q21:W21).

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

Макрос обратной пошаговой регрессии

Все, что делает этот макрос, это:

А) циклически перебирает переменные X,

Б) находит переменную с наименьшей оценкой abs(T) (это будет наименее статистически значимая переменная на этом этапе процедуры, переменная, коэффициент которой имеет наибольшую неопределенность или «помой», связанный с ней) [Примечание 2],

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

Г) пересчитывает лист (и, следовательно, ЛИНЕЙН),

затем повторяется до тех пор, пока все оценки T не превысят определенный допуск, установленный пользователем в J18. Если все значения T превышают этот допуск, все переменные сохраняются. Если этот допуск T равен нулю, макрос тестирования на истории полностью пропускает обратную пошаговую процедуру и оставляет результаты при полной регрессии переменной X (или при предварительно замаскированных значениях, как отмечалось ранее). Установка предельного значения T равной нулю позволяет ускорить общий бэктест, так как обратная пошаговая регрессия отнимает немного времени на этом неоптимизированном листе и макросе Excel.

На шаге B (выше) нам нужно установить ранее исключенные переменные в высокое значение T (999 в нашем примере), чтобы мы не нашли ту же переменную снова на следующем проходе. В противном случае мы могли бы (будем?) просто продолжать находить одну и ту же переменную для исключения снова и снова, если бы вместо этого мы установили T в 0 вместо 999. Следовательно, мы установили это значение равным 999, чтобы «убрать его с дороги» нашей макрологики. С незапамятных времен (скажем, с 1957 года) программисты использовали коды 99, 999, 9999 и т.д. в качестве кодов «магических чисел». Такие магические числа противопоказаны в современном программном обеспечении, но это всего лишь макрос Excel, и мы подумали, что закинем его туда по старинке.

Последний бит (делать ли обратный шаг или нет) настраивается в макросе тестирования на истории. На каждом шаге бэктеста вычисляется полная регрессия, затем выполняется обратное пошаговое исключение терминов, опционально, в зависимости от minAllowedT в J18. Помните, что это minAllowedT относится к abs(T), расстоянию T от нуля. Иногда мы быстро и свободно используем словоблудие [Примечание 3] в коде. ‘ this is a sub portion of the backtest macro

‘ recompute regression and whole sheet
Application.Calculate

Let minAllowedT = Range(«J18»).Value

If (minAllowedT > 0) Then
Call backwardsStepwise
End If

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

Наконец, во время пошагового выполнения макросов на истории мы также записываем оценки T на каждом шаге тестирования на истории в столбцах от AB до AH для последующего просмотра.

Рисунок 2: Результат оценки T во время примера тестирования на истории (столбцы AB и «справа» от него). 999 означает, что связанная переменная была удалена из модели на этом шаге. Каждая строка соответствует одному шагу бэктеста.

С первого взгляда мы видим, что Т-оценка 999 указывает на то, что связанная переменная не используется на этом шаге (была исключена). Эти столбцы Т-оценки во время тестирования на истории присутствовали в более старом файле Excel, связанном с нашей предыдущей статьей, но мы не использовали их в первоначальном исследовании — за исключением того, что путем проверки мы указали, что для этой модели, вероятно, необходим пошаговый регрессор. На приведенном выше снимке экрана после выполнения нашего пошагового макроса в обратном направлении мы видим, что у нас есть более твердые абсолютные оценки T (большинство > 2, некоторые между 1 и 2; мы должны установить предельное значение T 1 для этого запуска на рисунке 2). Помните, что все |Т| > 2 означает, что стандартная ошибка коэффициента составляет менее половины самого значения коэффициента. Чем меньше stderr, тем больше абсолютная оценка T. Здесь нет никакой магии. Колодец… Возможно, внутри ЛИНЕЙН есть какая-то магия матриц для вычисления этих стандартных ошибок. Но это уже другая история, о которой вам сейчас не стоит беспокоиться, так как некоторые жители Редмонда в древности решили ее за вас. Может быть, они даже используют LAPACK!

https://www.netlib.org/lapack/lug/node27.html

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

На следующем GIF-файле показано, как X столбцов обнуляются по очереди во время тестирования на истории с включенной обратной пошаговой регрессией (с отсечкой T = 1; довольно слабая граница). Как правило, Т-баллы от 1 до 2 также считаются довольно слабыми; Но мы начинаем потихоньку с исключения терминов, чтобы посмотреть, что из этого выйдет).

Рисунок 3: Пример исключения переменных при тестировании на истории. Переменные в столбцах от E до I обнуляются автоматически по обратному ступенчатому алгоритму. Обратите внимание на цветные клетки, движущиеся назад во времени во время тестирования на истории, чтобы указать на шаг вперед.

Первые испытания элиминации сроков

Вспомним наши предыдущие результаты для прогноза TSLA на 5 дней вперед: 252 дня бэктеста (1 год), 100 пунктов регрессии:

T отсечка = 0
R2 теста на истории 0.256
169/252 = 0.670 при тестировании на истории

T отсечка = 1
R2 теста на истории 0.253
159/252 = 0,670

T отсечка = 2
R2 теста на истории 0.254
167/252 = 0,663

T отсечка = 3
R2 теста на истории 0.217
167/252 = 0,663

Изменение предельного значения T на различные часто используемые уровни (1, 2, 3) не улучшило этот результат тестирования на истории заметно (или вообще) для TSLA для тестирования на истории в течение 1 года с конфигурацией модели как есть: количество точек в регрессии = 100, количество точек для вычисления моментов = 200, на 5 дней вперед и т. д. В некоторых случаях бэктест R2 даже был немного уменьшен (в неправильном направлении… мы бы предпочли больший R2 при тестировании на истории), но процент правильности направления остался примерно на том же уровне. Такова природа этих моделей «иголки в стоге сена». Может случиться так, что нам просто повезло с прогнозированием в течение этих нескольких дополнительных правильных дней во время базового испытания «без удаления срока», тем самым немного повысив наш R2 для этого базового случая. Тем не менее, не очень хорошо повышать R2 по счастливой случайности, потому что это может заставить вас думать, что ваша модель лучше, чем она есть на самом деле, и, возможно, что вы умнее, чем есть на самом деле.

Аналогичное поведение наблюдалось при двухлетнем тестировании (504 торговых дня) той же модели: небольшое снижение R2 при тестировании на истории по мере увеличения отсечки T, но процент правильных направлений остался примерно на том же уровне.

Т = 0
R2 теста на истории 0.119
312/504 = 0,619

Т = 1
R2 тестирования на истории = 0.119
314/504 = 0,623

Т = 2
R2 теста на истории 0.110
312/504 = 0,619

Т = 3
R2 теста на истории 0.101
306/504 = 0,607

Поскольку статистики в целом предпочитают более простые модели, если они могут поддерживать такое же качество прогноза, как и более сложные модели (концепция экономии), представляется, что для этой модели можно установить пороговое значение abs(T) равным 2 или 3, при условии, что качество OOS не ухудшится заметно. Возможно, отсечка T в 1 не является нереалистичной, поскольку это дало немного лучшие результаты для 2-летнего тестирования на истории. Но опять же, эти небольшие процентные улучшения могут быть просто удачей, так что… Caveat Analysta.

Также есть некоторая поддержка установки T = 1 (почти нет ухудшения результатов тестирования на истории в случае 2 лет).

Поскольку бэктест R2 является агрегированным результатом, мы можем вычислить скорректированный бэктест R2…

(или связанные метрики: BIC, AIC и т. д.)

https://en.wikipedia.org/wiki/Bayesian_information_criterion

… по некоторому среднему значению или диапазону R2 значений подгонки, которые были вычислены во время тестирования на истории. Это может дать лучший критерий выбора модели (какое предельное значение T использовать, какие другие значения параметров модели использовать), чем наш простой бэктест R2 и метрики подсчета с правильным направлением. Подобно тому, как профессионалы в сфере недвижимости используют фразу «расположение, расположение, расположение» для обозначения того, что важно в сфере недвижимости, в моделировании «утонченность, утонченность, утонченность» является ключевой фразой, которую нужно запомнить. И под уточнением мы подразумеваем не просто лучшее соответствие данных. С помощью современных технологий мы можем точно сопоставить все данные с любым количеством переменных. Однако это не указывает на хорошую модель, и именно поэтому мы начинаем с линейных моделей, а не с полностью гибких типов моделей машинного обучения TensorFlow.

Рисунок 4: R2 посадок во время тестирования на истории. По одной строке на каждый шаг бэктеста. Обратите внимание, что они подозрительно выше, чем при тестировании R2 вне выборки… Еще одна вещь, которая заставляет вас идти: «Хм…»

Еще один намек на то, что мы должны двигаться к более простым моделям, исходит из анализа значений R2 в выборке из всех регрессий, выполненных во время тестирования на истории. Они значительно выше, чем значения R2 при тестировании на истории (иногда в 2 раза и более). Например, наш недавний двухлетний бэктест с отсеиванием переменной T, равным 3, показал среднее значение R2 соответствия 0,40 (за 504 дня или 2 года регрессий, по одному R2 за день тестирования на истории). Это намного больше, чем у соответствующего OOS бэктеста R2 0,101 (с соответствующим процентом направленной правильности 0,607 или 60,1%), что указывает на переобучение. Следовательно, стоит рассмотреть и другие способы уменьшения перетренированности. Поскольку это всего лишь простая линейная модель, у нас есть ограниченные, но интригующие возможности для корректировки модели, такие как увеличение количества точек на регрессию (первоначально 100) и/или настройка количества точек, используемых для вычисления моментов (теперь 200). Может быть, мы даже захотим установить пороговое значение T даже выше 3, чтобы оставить в модели только «сверхтвердые» (технический термин?) переменные.

И переменные, которые мы вводим в эту модель, не являются концом всех переменных. Например, как мы отмечали в нашей предыдущей статье, мы могли бы вычислить аналогичные моменты для связанного (технологического) ETF (биржевого фонда) и поместить их в модель, чтобы увидеть, получим ли мы лучшие или худшие прогнозы. Или, может быть, мы посмотрим на моменты и хвостовые коэффициенты SPY, ETF на S&P500; Возможно, нам стоит добавить их в модель. То есть, возможно, мы сможем повысить качество модели отдельного актива, включив в качестве кандидатов в качестве предикторов более стабильные отраслевые или рыночные производные данные. Наше новое поэтапное исключение терминов покажет нам, была ли это хорошая идея или нет. Как мы отмечали в нашей предыдущей статье, мы могли бы даже попытаться добавить запаздывающие переменные (авторегрессионные или AR-термины) и, выйдя за рамки обычных моделей ЛИНЕЙН, добавить члены MA, которые возвращают ошибки модели в следующие прогнозы.

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

(по ссылке на термины MA выше)

Сводка по пошаговой регрессии

Мы заметили небольшое снижение R2 при использовании макроса обратного пошагового элиминатора терминов, при этом направленные результаты были примерно такими же, как и при использовании моделей с полным сроком, для 1 и 2 лет бэктестов. Несмотря на то, что ожидаемый результат увеличения тестирования R2 на истории не произошел, мы не проводили никакой настройки модели в этом контексте исключения терминов, а исключение терминов (упрощение модели) путем отбрасывания неопределенных коэффициентов (коэффициентов с большими стандартными ошибками), в целом, является хорошей идеей; Таким образом, у нас есть пошаговый метод, когда это необходимо.

Бычья/медвежья нулевая терпимость

Далее мы вводим нулевую терпимость к нашим направленным прогнозам, чтобы мы могли отбрасывать «близкие к краю» неопределенные дни прогнозов, которые находятся на границе между бычьим и медвежьим. В те неопределенные дни, если, например, мы использовали этот тип модели для вычисления торговых сигналов, мы сообщали бы: «Сегодня нет сигнала, неопределенно». В предыдущих исследованиях мы отмечали, что использование нулевой терпимости (которую мы иногда называем «мертвой зоной» модели), по-видимому, повышает качество прогнозирования (процент правильности) для точек, которые находятся за пределами этого неопределенного диапазона. Этот нулевой допуск устанавливается (пользователем) в ячейке J21. Обычно мы помещаем вычисления для них рядом с направленно правильными вычисленными результатами в столбце O. Однако, чтобы не нарушать расположение нашего ЛИНЕЙН и связанных с ним диапазонов формул (поскольку в нашей предыдущей статье речь идет об этих конкретных ячейках для обсуждения), мы поместили эти неопределенные вычисления справа на листе в столбцах AL и AM.

Рисунок 5: Формулы нулевой терпимости. Так как наша доходность наша 1-центрированная на этом листе (1 = ни бычья, ни медвежья), мы вычитаем 1 из предполагаемой доходности в столбце AL формулы.

Формулы просты: если прогноз находится за пределами нулевой терпимости (измеряется от 1, нейтрального значения в нашем определении доходности, центрированной на 1), мы помечаем его как ИСТИНА (прогноз вне tol) в столбце AL. Затем в столбце AM мы логически вычисляем, является ли прогноз правильным и выходит ли он за пределы допуска. Столбцы AL и AM суммируются в P6 и P8 (обратите внимание, что «правильный и вне допуска» всегда будет <= «вне допуска»). Затем их соотношение вычисляется в P10. Таким образом, мы можем легко сравнить полный процент правильности в P4 с новым «нулевым допустимым» процентом в P10. Если мы установим нулевой допуск равным 0, ячейка P10 должна сообщать то же число, что и P4.

Мы видим, что если мы скорректируем нулевой допуск в J21 вручную, мы можем наблюдать, как изменяется процент коррекции в P10.

Рисунок 6: Нулевой допуск установлен в 0 (базовый случай). Следовательно, правильное направление % для полного набора данных совпадает с правильным направлением % для набора данных с нулевым допуском (оба значения 0,607 ~= 61%).
Рисунок 7: Установка нулевой толерантности на 0,05 увеличивает процент правильных прогнозов за пределами +- 0,05 … до 0.713 (~= 71%)

Поскольку этот допуск применяется к результатам тестирования на истории, нам сначала нужно запустить бэктест, а затем настроить этот параметр. Совет де Прадо:

(грубо говоря, «не подглядывайте слишком много» за своими данными, иначе вы пожалеете) относится и к настройке этого параметра. Современные модели настолько гибкие, что их можно переквалифицировать как для тестов на истории, так и для данных в выборке; Тем не менее, такая модель может потерпеть неудачу в реальном будущем применении. К счастью, мы используем линейную модель, и она может изгибаться только до определенного предела. На самом деле, она вообще не может согнуться, так как является линейной моделью! Чистая гиперплоскость, насколько может видеть мысленный взор…

Читатель может визуализировать, что если мы уменьшим количество точек, отправляемых в регрессию [ячейка J12], то плоская модель будет соответствовать меньшему временному окну данных и в некотором смысле «наклоняется» (в нескольких измерениях), а не «изгибается» ближе к истинной касательной теоретической истинной поверхности, определенной данными. Смотрите нашу картину касательной и секущей в нашей предыдущей статье или смотрите ее непосредственно на: https://en.wikipedia.org/wiki/Tangent

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

Тест на нулевую терпимость

Тем не менее, давайте попробуем установить J21 равным 0.1 для случая тестирования на истории за 1 год / 252 дня. А для базового плана, если вы следуете инструкциям в Excel, давайте оставим минимальное значение T (J18) равным 0 (все переменные в модели). Помните, что если мы изменим минимальное значение T (J18), мы должны повторно запустить бэктест. Установка J21 в 0,1 означает, что мы рассматриваем все прогнозы в диапазоне [-10%, 10%] как неопределенные, не принимая во внимание конечные точки. Также это означает, что мы хотим сохранить только действительно сильные прогнозы, те, которые превышают 10%… Сильная неделя со средней доходностью 2% в день и более. Напомним, что наша модель в настоящее время настроена на прогнозирование доходности за 5 дней, а не за 1 день; Еженедельная доходность TSLA в размере 10% не является чем-то необычным. Как и потеря 10% на следующей неделе.

На самом деле, если мы проведем небольшое вычисление сбоку для столбца L (5-дневная скользящая фактическая доходность TSLA), мы можем вычислить, что его стандартное отклонение составляет 0,096 (близко к 0,1). Используя правило большого пальца, согласно которому 68% значений находятся в пределах 1 стандартного отклонения (на данный момент это приблизительное нормальное распределение), 32% значений выходят за пределы этого диапазона, поэтому мы увидим, что около 32% 5-дневной доходности будут больше 10% или менее 10% в исторических данных. Следовательно, 10% за нулевую терпимость не являются необоснованными для этого случая.

Наши подсчеты показывают, что в 35 из 252 дней тестирования пятидневная доходность выходила за пределы этого диапазона 10%, и из них 30 были в правильном направлении, или 85%.

Рисунок 8: Установка нулевого допуска на уровне 10% для тестирования на истории в течение 1 года, все переменные в модели (T tolerance = 0). 85% правильных прогнозов за пределами диапазона нулевой терпимости +- 10% прогноза.

Неплохо для слабо настроенной линейной модели, пытающейся прогнозировать на 5 дней вперед. Ваша модель машинного обучения глубокого обучения с GPU на базе GPU на 85% верна в выборке? Ха! Мы шутим! Мы шутим! Конечно, для этих моделей есть время и место. И опять же, любое высокомерие, которое у нас может быть связано с этим высоким процентом, должно быть умерено, задав вопрос о том, сколько данных мы отслеживаем (переобучая на бэктестах), настраивая этот параметр при просмотре бэктестов. Как часто мы занимаемся слежкой за данными? Итак, мы настраиваем параметр, глядя на то, что мы изначально классифицировали как данные вне выборки. Так что: многое. Мы занимаемся большим количеством слежки за данными.

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

Еще одна опасность, связанная с толерантностью

При увеличении этой нулевой терпимости знаменатель процента правильного соотношения может стать маленьким (например, вы можете в конечном итоге отбросить большинство прогнозов, классифицировав их как неопределенные). В этом случае мы можем увидеть процент правильных значений, приближающийся к 100%. Но в этих случаях с «малым N» мы можем начать сталкиваться с проблемами в духе: Что ж, теперь существует ненулевая вероятность того, что мы могли бы достичь этих хороших результатов случайным образом, просто подбросив монетку. Мы рассмотрим это более подробно в нашем более формальном техническом документе о связанной с ним системе моделирования [https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4137779] [см. примечание 2.2 в этой статье], но просто для того, чтобы посеять идею из вашего собственного опыта: довольно легко получить 3 из 4 подбрасываний монеты, чтобы они проявились так, как вы хотите, по случайной случайности (75% правил). Попробуйте! Но трудно (почти невозможно) сделать так, чтобы 75 из 100 подбрасываний монеты проявились так, как вы хотите, случайно. При анализе этих типов направленных прогнозов необходимо обращать внимание не только на процент правильности; Также нужно смотреть на количество испытаний (знаменатель в нашем процентном правильном случае). Опытные статистики могут начать думать о теории биномиальных испытаний и тому подобном. Мы немного делаем это в техническом документе по ссылке выше [Примечание 2.2], так что ознакомьтесь с ним, если вам нужно больше предыстории. В этом конкретном исследовании наши знаменатели по-прежнему довольно велики даже при установлении высокой нулевой терпимости, поэтому нам, возможно, пока не стоит слишком беспокоиться по этому поводу. Но в конце концов это может всплыть.

Сводка

На следующем этапе разработки модели на основе моментов мы ввели обратное пошаговое исключение терминов в макросе VB Excel для работы с функцией ЛИНЕЙН. Мы обнаружили, что исключение термина на самом деле немного снизило качество прогноза OOS для этой конкретной модели. Поскольку исключение слабых членов из модели (в нашем случае терминов с большими стандартными ошибками) рекомендуется как в традиционной статистике, так и в машинном обучении, снижение кажущегося качества OOS могло быть просто связано с устранением нескольких, казалось бы, правильных прогнозов, которые случились случайно. «Прореживание стада» более слабых прогнозов, так сказать.

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

Дополнительные материалы

Чтобы увидеть хороший компактный эксперимент, показывающий важность изучения Т-оценок при проведении регрессии (в контексте этого исследования), ознакомьтесь с Частью 3 этой серии, где мы заменяем столбец X-кандидатов на случайные значения, чтобы посмотреть, что произойдет («Встряхнись и смотри, как это шипит, мальчик!» в словаре мультфильма о петухе «Фогхорн Леггорн»):

https://medium.com/@nttp/return-forecasting-with-moments-part-3-the-importance-of-t-scores-6a766ee4cffd

Обновления

6 декабря 2023 г.: Добавлен раздел «Дополнительная литература».

Примечания

[Примечание 1] Читатель не должен зацикливаться на термине «статистическая значимость». Оценка T — это просто значение коэффициента, деленное на его погрешность, оцененную функцией ЛИНЕЙН, а ошибка измеряется в диапазоне типа «стандартное отклонение», так что +-2*stderr покрывает около 95% предполагаемого диапазона коэффициента.

[Примечание 2] Многие пакеты статистики ссылаются на p-значение коэффициента, а не на оценку T при определении того, какие переменные следует исключить из модели. Тем не менее, p-значение является просто производным от T-оценки, и этот дополнительный уровень поиска или косвенного обращения может внести путаницу в пользователя. p-значения имеют свое применение, но они также могут быть неправильно интерпретированы… так… Мы не заморачиваемся с ними здесь. Вероятно, в такой короткой статье, как эта, слишком много знаний, чтобы их можно было преодолеть с помощью p-значений. Но Т забивает… Нам они нравятся. С ними все в порядке. Также обратите внимание на напоминание Кокрана о том, что переменная может быть статистически незначимой, но все же может быть экономически значимой. Например, если переменная оказывает большое влияние на результат, но не считается «статистически значимой» при рассмотрении показателя Т, мы можем захотеть немного заточить наши карандаши и исследовать эту переменную подробнее.

[Примечание 3] Мы предпочитаем словоблудие вместо словоблудия, так как «i» кажется лишним, но в словаре написано «словоблудие».

[Примечание 4] Мы работаем над «боевой песней» в стиле американского студенческого футбола для Bing, вечного аутсайдера, что-то вроде: «И когда ты хочешь погуглить это / почему бы тебе не погуглить это / на Bing!» По какой-то причине Capitol Records до сих пор не позвонили.

Часть 3: Важность Т-оценок

T? Или гамма, в зеркале, темно? Вот в чем вопрос… Фото Густаво Санчеса с сайта Unsplash

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

Когда вы закончите читать эту статью, ознакомьтесь с частью 4 этой серии, в которой мы добавляем моменты из возвращения SPY, чтобы повысить качество нашего прогноза TSLA:

https://medium.com/@nttp/return-forecasting-via-moments-part-4-vectorization-of-input-streams-8e2004e051af

Во-первых, удобные ссылки…

Предыдущая статья:

https://medium.com/@nttp/return-forecasting-with-moments-part-2-term-elimination-and-zero-tolerancing-bef9770236fa

Связанный файл Excel:

excel/forecasttestRoll9TSLAztolB.xlsm на главной · diffent/excel

Статья о прогнозировании с помощью моментов. Внесите свой вклад в разработку diffent/excel, создав учетную запись на GitHub.

github.com

Здесь мы возьмем нашу модель из предыдущей статьи и заменим один предиктор-кандидат (в данном случае 200-дневную среднюю доходность) столбцом случайных чисел. Во-первых, мы делаем это с константным столбцом (случайным столбцом, который остается неизменным на протяжении всех бэктестов). Этого можно достичь, заменив формулу в ячейках среднего столбца D на =RAND(). Затем мы копируем этот только что сгенерированный случайный столбец и «вставляем специальные» в качестве «значений» в тот же столбец. Это становится красивым столбцом фиксированных случайных чисел.

Затем мы устанавливаем отсечку T равным 0 на J18 (сообщая тестировщику не удалять переменные) и запускаем 252-дневный бэктест. Затем мы изучаем выходные Т-баллы с каждого шага бэктеста для этой конкретной переменной (по-прежнему называемой «средней», но на самом деле это наш случайный столбец), которая хранится далеко в столбце AG (2-й от конца этой последовательности столбцов с Т-оценками при тестировании на истории). Последний столбец этой последовательности AH предназначен для оценки T константы модели.

Здесь мы строим график AG, Т-оценки случайного столбца:

Рисунок 1: T баллов за тест на истории для фиксированного случайно сгенерированного столбца переменной X

Функция ЛИНЕЙН делает все возможное, чтобы включить этот случайный столбец в модель и вычисляет коэффициент для него на каждом шаге тестирования на истории. Он также вычисляет соответствующую стандартную ошибку, а затем мы вычисляем оценку T как coeff/stderr в таблице, как описано в наших предыдущих статьях о его таблице.

Обратите внимание на пару вещей: во-первых, Т-баллы, по-видимому, остаются в диапазоне от -1,8 до 1,0. Это больший диапазон, чем мы ожидали при настройке этого теста. Мы думали, что в большинстве случаев Т-баллы будут меньше 1,0. Это убедительно демонстрирует опасность сохранения переменной в модели, которая имеет оценку T намного меньше 2. Смотрите, даже случайный столбец данных дает abs(T) > 1 больше, чем комфортное количество раз в течение этого 1 года тестирования на истории. Думаем ли мы, что эта случайная последовательность обладает какой-либо предсказательной силой для наших выходных данных? Нет, конечно, нет. Оно случайно, по определению, не связано со всем в прошлом и будущем. Но также обратите внимание на волновой паттерн в данных Т-оценки… Волновой паттерн вовсе не кажется случайным. Это говорит о том, что линейная модель может зацепиться за любые случайные закономерности, которые есть в случайной последовательности (а паттерны могут быть, хотя и не имеют предсказательного качества) и связать эти случайные закономерности с закономерностями наблюдаемого явления, целевого 5-дневного возврата, который мы пытаемся смоделировать. Если вы считаете, что это необычно для линейной модели, подождите, пока не попробуете сделать это с TensorFlow. Модели TF могут быть (практически) бесконечно гибкими, чтобы соответствовать любым случайным данным, которые на них обрушиваются, если аналитик это позволяет. Отсюда необходимость перекрестной проверки, выбора признаков и т. д. в моделях машинного обучения. Самое замечательное в этих линейных моделях (со стандартными ошибками на каждый термин) заключается в том, что мы можем отбрасывать переменные с помощью методов Т-оценки, подобных этому, не прибегая к трудоемким процедурам перекрестной проверки.

Теперь, возможно, мы могли бы доказать, что Т-баллы около 2 являются нормальными, если они последовательны во время тестирования на истории, а не блуждают повсюду, как в этом примере. Кажется, что это может быть разумно. Тем не менее, ситуация заставляет нас задуматься, не так ли? Какую модель мы строим, если случайный столбец оказывается даже отдаленно предсказательным!?

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

Теперь мы снова построим график столбца AG, Т-оценки этого постоянно меняющегося случайного столбца:

Рисунок 2: Оценка T для столбца случайной величины X, RAND() часто регенерируется во время тестирования на истории (по крайней мере, один раз на каждом шаге тестирования). Горизонтальная ось = количество тестов на истории. Некоторые оценки T находятся за пределами диапазона +- 2, подразумевая, что случайный столбец обладает предсказательной способностью к результату во время этих конкретных тестов на истории… э-э-э…

Обращают на себя внимание две вещи: А) этот вывод кажется гораздо более случайным, чем предыдущий тест (как мы и ожидали в первом тесте). И Б) диапазон Т-баллов даже больше, чем в нашем первом тесте, и несколько раз превышал +-2. Просто подсчитав по результатам проверки, мы видим, что в 11 случаях из 252 испытаний на истории мы получили оценку T за пределами диапазона +-2. Это процентное соотношение составляет 4,4%, что немного меньше, чем p-значение 0,05 (5%), иногда рекомендуемое при построении моделей. Хм, может быть, эти статистики что-то задумали… Из теории мы знаем, что если мы используем абсолютное предельное значение T, равное 2, то все равно есть вероятность, что наша переменная не будет значимой и должна быть удалена из модели. Мы не собираемся сообщать конкретное p-значение, которое соответствует этому T=2, потому что, опять же… Это быстро сбивает с толку. Если вы мне не верите, посмотрите вот это:

https://www.socscistatistics.com/pvalues/tdistribution.aspx

Вы имеете в виду «однохвостую» или «двустороннюю» гипотезу? Какие у вас «степени свободы»? Подсчитываете ли вы степени свободы до или после исключения переменных? О, подождите, нет, это неправильная математика, это неправильный тип p-значения, это для парного t-критерия для сравнения средних распределений… Или нет? Подождите, я забыл… Является ли Т-критерий в нижнем регистре тем же самым T, что и Т-критерий в верхнем регистре? Для регрессии нужны p-значения. И так далее. Все это настраивалось в Excel, а теперь они хотят спросить нас про 1 или 2 хвоста? На данный момент это уже слишком, не так ли?

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

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

Следовательно:

Т-баллы полезны при линейном моделировании; Доказательство на примере случайной величины. Колодец… Может быть, и не «доказательство», но… доказательство.

Часть 4: Векторизация входных потоков

Две опорные колонны иногда лучше, чем одна. Фото Даниэль Райс с сайта Unsplash
Рисунок 1: Высокоуровневая концептуальная схема того, что мы делаем. Распределения «масштабируются» по горизонтали. TSLA гораздо более волатилен, чем рынок в целом (грубо представленный SPY). Без шуток, правда? Эти графики были созданы с помощью нашего приложения MCarloRisk3D для macOS, составляющего часть приложения.

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

Предыдущие статьи начинаются здесь:

https://medium.com/@nttp/n-day-ahead-stock-return-forecasting-with-moment-like-predictors-5d73793c4f15

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

https://github.com/diffent/excel/blob/articlePart4/forecasttestRoll9TSLAztolBaddSPYmacroModsRun3.xlsm

Теперь мы расширим нашу модель, чтобы посмотреть, сможем ли мы получить еще большую предсказательную силу, включив в нашу модель величины, подобные моменту из другого актива. Для первого теста мы используем SPY в качестве другого актива (SPY = S&P 500 market-wide ETF). В каком-то смысле это аналогично переходу от модели авторегрессии к модели векторной авторегрессии, хотя мы пытаемся спрогнозировать только один выход за раз. Векторные авторегрессии и различные их разновидности являются одним из наших любимых типов моделей в концепции, потому что все, что они говорят, это: «Давайте посмотрим, сможем ли мы взять все эти данные из множества временных рядов из прошлого и попытаться предсказать будущее, без какого-либо априорного знания о том, как эти данные связаны с собой и с целью». Кажется, это довольно крутая вещь. Наше старое приложение [Примечание 1] делает что-то из этого; Хотя, видя достойные результаты этих моделей моментов, мы думаем, что мы должны дополнить это приложение моментами. Так много кода, так мало времени…

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

Изучая исходную таблицу, которую мы настроили для одного предиктора активов, мы вздыхаем и думаем: «Чувак… shouldda написал это на Python…» Поскольку добавление дополнительных столбцов данных приводит к перемещению других столбцов, и… тьфу. Но не все потеряно: Excel хорошо настраивает свои собственные формулы на листе при вставке столбцов, и мы не будем вставлять новые строки; Таким образом, нам нужно беспокоиться только о корректировке столбцов. Формула ЛИНЕЙН должна быть скорректирована, чтобы включить в нее новые столбцы данных, и некоторые другие корректировки в формулах должны быть внесены для обработки дополнительных переменных-кандидатов предикторов и связанных с ними величин; Но в целом это было не так уж и плохо.

Корректировки листа для другого актива в качестве входных данных

Давайте сначала посмотрим на нашу новую переменную предиктора-кандидата в левых столбцах таблицы:

Рисунок 2: Настройка столбца предиктора. Новые столбцы C, D и M — R, связанные с ресурсом SPY.

Мы добавляем столбцы [date, SPY] цены закрытия справа от аналогичных данных TSLA (SPY в столбцах C и D), затем добавляем столбец F (SPYclosertn), чтобы вычислить доходность для SPY так же, как мы делали это для TSLA. Столбец 2-й даты предназначен только для проверки, чтобы убедиться, что наши даты выровнены правильно (вы можете прокрутить вниз и убедиться, что даты совпадают в столбцах A и C, или вы можете добавить формулу для перепроверки соответствия этой даты, используя свой «wicked-awesome Excel skillz»). Затем мы пропускаем столбцы от G до L (ранее вычисленные метрики, подобные моменту TSLA, описанные в наших предыдущих статьях) и добавляем столбцы от M до R для вычисления аналогичных моментов и хвостовых отношений для SPY. Формулы те же, что и для TSLA, как указано в части 1 этого цикла статей, но относятся к возврату SPY (столбец F), а не к возврату TSLA. Лёгкий.

Решение модели

Далее мы рассмотрим обновления формулы ЛИНЕЙН.

Рисунок 3: Вывод формулы массива желтым цветом.

Эта формула массива теперь находится в ячейке Z2 (вверху слева от теперь уже желтого «прямоугольного диапазона массива Excel», в котором она хранится), из-за добавления новых столбцов:Note the non-Excel worthy comments starting with #

=LINEST(
OFFSET(OFFSET(U2,0,0,$S$12,1),$S$9,0), # Y value target to fit now U
OFFSET(OFFSET(OFFSET(G2:R2,0,0,$S$12),$S$6,0),$S$9,0), # X columns now G thru R
TRUE,
TRUE)

Критические параметры настройки модели автоматически преобразуются в формуле в столбец S, когда мы добавляем новые столбцы (теперь это S6, S9, S12) … Ранее они находились в столбце J с теми же номерами строк (в настройке одного актива из части 1). А запись ЛИНЕЙН «знает», что выходные данные Y (целевые данные для подгонки) переместились в столбец U. Таким образом, нам «всего лишь» пришлось добавить больше переменных в диапазон столбцов X (теперь G2:R2, первая строка блока данных X). Легче сказать, чем сделать при моддинге формул массивов. Если кто-то из Microsoft читает: «Excel — это круто и все такое, но ему нужен лучший UX-интерфейс формулы массива».

Нам также пришлось изменить прямоугольный диапазон выходного массива ЛИНЕЙН, что потребовало от нас удалить формулу массива, а затем снова добавить ее при большем количестве ячеек (ширине), чтобы учесть больше выходных данных (больше выходных коэффициентов, так как у нас больше входных переменных X). И мы очистили высоту этого блока вывода массива (установлен желтый), чтобы не было дополнительных строк или столбцов со значениями #N/A (по сравнению с предыдущим листом, где мы указали формулу массива в слишком большой области и просто проигнорировали избыточные значения #N/A). В соответствии с соглашением Excel, в теперь уже минимальном прямоугольнике формулы массива ЛИНЕЙН по-прежнему есть значения #N/A.

Хороший трюк, который мы нашли для выполнения этой записи формулы массива:

1. Выберите больше ячеек (ширина и высота), чем вам нужно для вывода ЛИНЕЙН

2. Введите или вставьте формулу в строку формул

3. нажмите ctrl-shift-enter, чтобы ввести его (стандартный метод ввода формулы массива Excel)

4. Обратите внимание на значения #N/A там, где их не должно быть, а затем раскрасьте фон ячейки (установите цвет формата ячейки) вручную, чтобы выделить прямоугольный диапазон ячейки, где должны быть выходные данные

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

6. Выделите ячейки, которые вы только что раскрасили, и снова введите ту же формулу массива в строку формул, затем с помощью (Ctrl-Shift-Enter)

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

Мы думаем, что при удалении нужно выделить весь диапазон ячеек, в который изначально была введена формула массива, иначе Excel выдаст ошибку «не удается изменить часть массива» или что-то подобное. Они действительно должны сделать эту обратную связь об ошибке лучше, например, выделить или очертить, каков фактический диапазон массива на момент ошибки… или… Я не знаю. Давайте просто вынесем это как: Улучшения UX формулы массива Excel.

Рисунок 4: Ваш альбатрос при плавании по бурным, но судоходным морям массива формул в Excel

И снова напоминаем, что, поскольку «ЛИНЕЙН инвертирует свои выходы», мы поместили некоторые аннотации в первую строку Z1:AL1, чтобы указать, какие выходы относятся к моментам TSLA, а какие — к моментам SPY (выходные данные константы модели находятся справа, как и раньше).

Затем, поскольку у нас больше переменных, нам нужно развернуть формулы оценки T ниже формулы ЛИНЕЙН «вправо» и добавить больше флагов маски переменных. Это просто, но если вы не поняли, перечитайте Часть 1 [раздел Выходные данные модели — Стандартные ошибки] этого цикла статей на эту тему.

Итак, функция ЛИНЕЙН теперь решает для удвоенного числа переменных X, как и раньше! Ячейка S12 по-прежнему равна 100 (100 точек на регрессию), так что у нас все еще есть много данных для нашего расширенного набора переменных X: 12 переменных плюс константа, то есть 13 коэффициентов, решенных с использованием 100 точек. Неплохая стартовая установка.

Оценка модели

Теперь нам нужно добавить новые члены в вычисление линейной модели в столбце V, начиная сверху с ячейки V2. Это просто линейная модель A*x1 + B*x2 + … + const. Напоминаем, что бизнес OFFSET предназначен только для того, чтобы мы могли отодвинуть эту модель назад (назад во времени) для нашего бэктеста со скользящим окном. Обратите внимание на то, что функция OFFSET ссылается на G — R (данные X для регрессии), а $AK через $Z (затем $AL) — это коэффициенты обратного порядка из выходных данных ЛИНЕЙН.

Отсчитайте вверх от $Z$2 внизу (следующей формулы), и вы увидите, что идет Z, AA, AB, последовательно до … AK, затем AL в конце для константы

Оценка линейной модели. Простая взвешенная сумма моментов и соотношений. Бум. Договорились.

Как мы уже упоминали в части 1 этого цикла статей, есть способы исправить это изменение коэффициента с помощью модификации формулы, но это может привести к тому, что взвешенная сумма будет казаться более сложной, чем она есть на самом деле, поэтому… Оставим это на потом.

Эта окончательная формула оценки модели, приведенная ниже, взята из V2, а затем скопирована в столбец V:=OFFSET(G2,$S$6,0) * $AK$2+
OFFSET(H2,$S$6,0) * $AJ$2 +
OFFSET(I2,$S$6,0) * $AI$2 +
OFFSET(J2,$S$6,0) * $AH$2 +
OFFSET(K2,$S$6,0) * $AG$2 +
OFFSET(L2,$S$6,0) * $AF$2 +
OFFSET(M2,$S$6,0) * $AE$2 +
OFFSET(N2,$S$6,0) * $AD$2 +
OFFSET(O2,$S$6,0) * $AC$2 +
OFFSET(P2,$S$6,0) * $AB$2 +
OFFSET(Q2,$S$6,0) * $AA$2 +
OFFSET(R2,$S$6,0) * $Z$2 + AL$2

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

Больше вариативных флагов маски

И мы должны быть уверены, что добавили флаги маски переменных от Z25 до AK25 в формулы столбцов переменных X в столбцах с G по R. Опять же, обратите внимание, что флаги маски связаны с оценками T, которые, в свою очередь, вычисляются из выходных данных ЛИНЕЙН, которые находятся в обратном порядке, как переменные X. Таким образом, крайняя правая переменная X в столбце R (tail7525SPY) получает флаг маски $Z$25, а крайняя левая переменная X в столбце G (meanTSLA) получает флаг маски $AK$25. Мысленно интерполируйте ссылки на ячейки между этими двумя конечными точками.

Рисунок 5: Маска для крайнего левого столбца данных G использует значение от $AK$25 (крайняя правая маска, из-за обратных выходов ЛИНЕЙН)
Рисунок 6: Флаг маски для крайнего правого столбца данных R использует значение от $Z$25 (крайняя левая маска, из-за почитаемых выходных данных LINEST)

Вспомните, что вы можете протестировать флаги маски вручную, изменив каждый из них на ноль и наблюдая, как связанные данные переменных X в столбцах с G по R устанавливаются в 0.

С этими изменениями сам лист теперь должен быть довольно хорошим. Если мы забыли упомянуть о каких-либо изменениях, которые мы сделали, пожалуйста, сообщите нам об этом, так как «diff» не работает так хорошо (или вообще?) в файлах Excel. Может быть, если мы сохраним лист в формате текстового файла, отличном от Excel, мы сможем сделать diff? Хм…

Коррекция макросъемки

Далее мы должны настроить ссылки на ячейки в макросах, потому что при добавлении столбцов макросы не знают об этих новых столбцах, и ссылки на ячейки должны быть скорректированы вручную в коде макроса. Теперь есть кое-что, что Microsoft могла бы сделать с некоторыми из своих инвестиций в ИИ в размере 10 миллиардов долларов! Исправьте макросы при добавлении/удалении строк и столбцов в Excel! В конце концов, они — вездесущие «они» — утверждают, что ИИ заменит тысячи рабочих мест в программировании. С таким же успехом можно начать с этого «простого» проекта, не так ли? Это всего лишь Visual Basic, которому уже несколько десятилетий, насколько это может быть сложно? (Ха!) Настраивайте макросы при добавлении или удалении строк, столбцов или ячеек! Мы шутим, это, наверное, очень сложно, особенно если вы используете в макросах числовые ссылки на ячейки вместо ссылок типа «A1». Тем не менее, это было бы хорошей проверкой того, что этот новый искусственный интеллект, ориентированный на кодирование, появится в сети.

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

Рисунок 7: Они продолжают перемещать меню в Excel, но вы можете найти функции, введя ключевые слова в поле поиска лампочки Эдисона. Поиск странный, правда, не такой, как у многих поисковиков. Вы увидите, если попробуете.

Мы внесли небольшие изменения в макрос тестирования на истории, чтобы дисплей обновлялся каждые 10-е испытания на истории. Это необходимо для того, чтобы мы могли отслеживать ход тестирования на истории и по-прежнему запускать макрос быстрее, чем если бы код обновлял экран при каждом изменении листа. Это делается с помощью параметра свойства Application в макросе тестирования на истории:If ((nback Mod 10) = 0) Then
Application.ScreenUpdating = True
Else
Application.ScreenUpdating = False
End If

Базовый тест

[Результаты, представленные в этих исследованиях, сведены в таблицу в конце этой статьи, рис. 12.]

Итак, во-первых: Базовый бэктест: T cutoff = 0 (все переменные сохранены), а все остальные параметры модели такие же, как и в предыдущих частях этой статьи… чтобы мы могли сравнить «яблоки с яблоками», чтобы увидеть, улучшают ли наши новые столбцы-кандидаты данных от SPY наши результаты.

Из этого бэктеста мы получаем OOS бэктест R2 = 0.282 и процент направленной коррекции 185/252 = 0.734 = 73.4%.

Рисунок 8A: Тестирование на истории за 1 год с добавлением SPY в качестве предиктора, T cutoff = 0 (сохранить все переменные)

Сравните с нашим базовым результатом, приведенным в части 2 этого исследования [раздел «Первые испытания элиминации терминов»]:

T отсечка = 0
R2 теста на истории 0.256
169/252 = 0.670 при тестировании на истории

→ Как тестирование R2 на истории, так и процент правильности направления были усилены добавлением в модель этих моментов и соотношений SPY. Не так много, но: Хорошо! ✅

Это более впечатляюще, чем может показаться на первый взгляд, потому что гипотеза эффективного рынка, кажется, говорит, что R2 при таком тестировании на истории должен быть близок к 0,0, только отклоняясь от 0,0 из-за случайности. Поэтому, когда мы увеличиваем наш R2 на пару процентов (и если это увеличение, конечно, реальное, то есть статистически значимое, а не случайное), это то, на что стоит обратить внимание. Мы пока не будем рассматривать «статистику» этих улучшений R2; Для начала мы просто смотрим на номинальные значения, когда мы строим эту модель. Точно так же, с 67% против 73% правильности направления: Абсолютные 6% лучше в прогнозе направления? Относительное улучшение примерно на 10%? Возьмем.

Испытания с вариабельной элиминацией

Если теперь мы установим предельное значение T равным 2 (ячейка S18), так что переменные с большей неопределенностью в своих коэффициентах будут исключены из моделей с помощью обратной пошаговой регрессии с помощью нашего пользовательского макроса (поскольку встроенный ЛИНЕЙН не имеет доступной пошаговой регрессии), OOS на истории R2 будет увеличен до 0,354, а коррекция направления OOS упадет до 71,4% (но все равно больше, чем в случае с одним активом). Это без каких-либо нулевых допусков, применяемых к направленным прогнозам, как обсуждалось в статье Части 2.

Рисунок 8B: T cutoff = 2 бэктест для модели с двумя активами

Проведя быстрый тест нашего метода допуска к нулю, мы можем установить нулевой тол прогноза, скажем, равным 0,05 (теперь в S21, та же строка, но новый столбец против ссылок на листы статей Части 2).

Рисунок 8C: Предельная точка T = 2 и установите нулевой допуск на 0,05

Теперь мы получаем 101/125 правильных (125 за пределами допуска +- 0,05 и 101 из них в правильном направлении) или 80,8% правильности направления. Еще около 9% прироста (абсолютный процент). Довольно неплохо для небольшой модификации модели.

Если мы увеличим нулевой тол до 0,1, как мы делали в нашем предыдущем исследовании в части 2, мы получим 42/46 = 91,3% правильного направления. Неплохо, правда? Осторожно, однако… Когда мы настраиваем нулевую терпимость, глядя на бэктест, мы заглядываем в будущее, утаивая данные на один шаг вперед… — А вот и драконы.

Рисунок 8D: Увеличение нулевой толерантности до 0,1, процент правильности направления увеличивается до 91,3%

Как только мы получим стабильную модель (а эта, похоже, близка к этому), мы могли бы провести сканирование параметров дизайна экспериментов, чтобы эффективно изучить влияние одновременных изменений параметров на эту модель, эксперименты, определяемые такими методами, как Тагутилатинский гиперкуб или подход к выборке в пространстве дизайна Соболя (что может стать темой для следующей статьи). И, конечно же, численный оптимизатор (Excel Solver, кто-нибудь?) может быть использован для повышения OOS R2. То есть, если вы можете заставить решатель решать. Иногда кажется, что он запирается и дает вам тот же ответ, с которого вы начали.

Но оптимизатору требуется что-то оптимизировать, поэтому мы должны быть осторожны, чтобы не пытаться слишком сильно настроиться на конкретный бэктест, иначе это может привести к неприятностям. Следовательно, возможно, лучше поработать над нашими критериями выбора модели перед настройкой модели, критериями, которые могут быть вычислены только из процесса подгонки, а не из номинально OOS данных (точки данных на 1 шаг вперед, которые мы проверяем). В первую очередь на ум приходит Simple Adjusted R2 (теперь, когда мы с успехом исключаем переменные), AIC, BIC и так далее.

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

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

Исходя из вышеупомянутых испытаний, мы можем сказать, что в этом году добавление SPY-моментов, похоже, заметно повысило качество прогнозирования при тестировании на истории. Является ли этот рост статистически значимым, мы пока не знаем. Для этого потребуется больше тестов. Но добавление этих дополнительных переменных, производных от SPY, похоже, двигает номинальные результаты в правильном направлении.

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

Рисунок 9: Обзор Т-оценок с высоты птичьего полета во время тестирования на истории, по одной строке на шаг тестирования на истории. Здесь мы не обращаем внимания на конкретные значения, мы просто хотим обратить внимание на короткие и длинные строки (999 короткая строка = переменная была исключена).

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

Мы не видим полного столбца из 999 (короткие ячейки), который указывал бы на то, что данная переменная не имела значения ни в одном из 252 дней тестирования.

Помня о наших выводах, сделанных в части 3 этой серии статей (где намеренно случайные величины время от времени оказывались значимыми), нам, вероятно, следует повторить этот бэктест с отсечкой T 3. Это мы и делаем дальше.

Отсечка по Т-баллу 3 … Слишком далеко?

При увеличении порогового значения T до 3 (чтобы исключить больше переменных), R2 при тестировании на истории немного снижается до 0,333, а OOS directionally correct теперь ниже 67,1%. Не выбрасываем ли мы слишком много информации, когда устанавливаем предельный уровень T до 3? Возможно…

Рисунок 10: T cutoff = 3 приводит к меньшему количеству правильных OOS, чем T cutoff = 2 case

Теперь, если мы установим нулевое значение tol равным 0.05 для этого случая, мы получим 103/134 = 76.8% направленно правильного OOS… также деградация по сравнению с отсечкой T = 2 в приведенном выше случае. Следовательно, представляется, что необходимо провести дополнительные исследования «критериев выбора модели» для этого типа моделей, как мы обсуждали в части 2. T cutoff = 2, по-видимому, дает лучшие результаты OOS, чем T cutoff = 3; Но являются ли эти результаты случайно лучшими или действительно лучшими? Мы надеемся на последнее, но такие модели нуждаются в тщательной проверке и проверке, поскольку надежда, хотя и является достойным восхищения состоянием ума, является плохой практикой моделирования.

Рисунок 11: T cutoff = 3 и использовать ztol 0.05
Рисунок 12: Таблица результатов неформального исследования параметров для тестирования этой новой модели двойного актива (пока не включающей все параметры модели)
Рисунок 13: T cutoff = 2 случая из таблицы (без нулевого допуска) на 1 шаг впереди результатов тестирования OOS. Фактические и прогнозируемые. Неплохо для линейной модели. Пунктирная линия на этой диаграмме взята из диаграмм Excel для визуализации; Это не наша модель.

Подсказки по дальнейшим улучшениям и проверкам

В качестве предисловия к следующим статьям этой серии статей, вы можете заменить столбец цены закрытия SPY любым другим рядом данных и повторно запустить эти тесты! Для опытных пользователей Excel здесь может быть полезен диспетчер сценариев Excel. Убедитесь, что даты правильно выровнены при добавлении или замене данных, иначе возникнут проблемы. Мы предлагаем попробовать ETF для такого сектора, как потребительские товары или технологии. VGT Vanguard tech ETF или VDC Consumer staples ETF кажутся интересными кандидатами:

https://finance.yahoo.com/quote/VGT?p=VGT&.tsrc=fin-srch

https://finance.yahoo.com/quote/VDC?p=VDC&.tsrc=fin-srch

[Обновление от 9 декабря 2023 г.: Мы должны были написать Vanguard Consumer Discretionary VCR вместо VDC. Может быть, это маленькая символическая шутка о том, что покупка видеомагнитофонов в 1980-х годах была вершиной дискреционных расходов? Во всяком случае, автомобили Tesla кажутся скорее дискреционными, чем основными, если только вы не являетесь поклонником Tesla Stan.]

https://investor.vanguard.com/investment-products/list/etfs

В приведенных выше ссылках Yahoo есть опция «загрузить исторические данные», если вы немного покопаетесь. Или, может быть, у вас есть свой любимый источник данных. Обычно мы получаем данные от iexcloud.io. Позаботьтесь также об удалении строк, в которых указано только делимое, если вы получаете данные от Yahoo. Это нарушит последовательный характер временных рядов, поэтому, как всегда, подготовка и изучение данных перед моделированием имеют важное значение.

При добавлении данных о ценах в таблицу Excel убедитесь, что вы сначала отсортировали их так, чтобы самые последние данные находились в строке 2, так как это соглашение о формулах на этом листе. Если вы поместите данные «вверх ногами», вы, вероятно, получите огромные значения R2 вне выборки и подумаете, что нашли золотую жилу. Но увы…

Возможно, вы также захотите попробовать промышленный ETF, поскольку TLSA является производственным концерном? Может быть, попробовать курс акций другого автоконцерна? Тойота, Хонда и так далее.

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

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

Наконец, несмотря на то, что мы сообщаем о том, что OOS в процентах верно направления, как только мы добьемся того, что наша модель улучшится еще больше, нам, вероятно, следует начать проверять аспекты временных рядов этой правильности. То есть, сгруппированы ли дни с правильным результатом где-либо во время тестирования на истории или они более равномерно распределены по временному окну тестирования на истории?

Сводка

Добавление SPY-моментов и хвостовых коэффициентов в качестве потенциальных предикторов N-ступенчатых возвратов TSLA, по-видимому, несколько повышает качество предсказания — хотя и не впечатляюще — и без какой-либо дополнительной настройки модели. Мы ожидаем, что небольшая настройка модели может быть полезной, но мы не хотим перенастраиваться на бэктесты, иначе с моделью могут произойти плохие вещи при ее запуске в будущем. Поэтому мы откладываем эту настройку до тех пор, пока не исследуем другие активы, кроме SPY. Эти другие активы могут повысить качество прогнозов даже больше, чем это делает SPY. Мы отмечаем, что наш обратный ступенчатый подход к исключению переменных дал повышенное качество тестирования на истории, теперь, когда у нас есть больший набор предикторов-кандидатов в модели. Это улучшение прогноза OOS при исключении переменных не было замечено, когда мы тестировали исключение терминов для модели TSLA одного актива в части 2 этого исследования. Таким образом, наши усилия, вложенные в написание макроса исключения переменных, теперь, похоже, наконец-то окупились.

Обновления

9 декабря 2023 г.: добавлена новая фотография обложки. Добавьте примечание о других ETF Vanguard, которые стоит попробовать.

Примечания

[Примечание 1] Приложение MVAR Market Vector Auto Regression можно найти в магазинах приложений для macOS и iOS, Google Play Store и store.microsoft.com (последний для версии для Windows).

Источник

Источник