Стратегия фактора импульса цены

Знакомство

Предыдущее исследование ценового импульса обнаружило положительную корреляцию между 26-недельным коэффициентом отклонения цен и будущей доходностью акций на фондовом рынке США. Джегадиш и Титман выявили эффект импульса на фондовом рынке США — покупка акций с лучшей доходностью за последние 6-12 месяцев и одновременная продажа акций с худшей доходностью за последние 6-12 месяцев принесла значительную избыточную доходность с экономической и статистической точки зрения. Последующие исследования, проведенные многими учеными, также показали, что эффекты импульса преобладают на международных фондовых рынках и в различных классах активов.

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

  • Однофакторный анализ показывает, что JTMOM3, сформированный в течение трех месяцев, и переменная импульса MAD, основанная на дивергенциях скользящих средних, демонстрируют наиболее экономически и статистически значимую предсказательную способность для ожидаемой доходности акций.
  • Многофакторный анализ показывает, что даже после учета однолетних значений бета, соотношения цены к балансовой стоимости, рыночной капитализации и 12-месячных характеристик импульса, взаимосвязь между переменными импульса JTMOM3 и MAD и ожидаемой доходностью акций остается значительно положительной. Это указывает на их предсказательную и объяснительную силу для ожидаемой доходности акций.
Momentum Factor Strategy

Следовательно, в этой статье мы будем в первую очередь использовать переменные импульса JTMOM3 и MAD для анализа на истории.
Для получения более подробной информации, пожалуйста, обратитесь к разделу «Взаимосвязь между ценовым импульсом и ожидаемой доходностью акций».

Стратегия фактора импульса

  • Рассчитайте среднюю доходность акций за последние три месяца.
  • Рассчитайте дивергенцию скользящей средней (MAD) в качестве условия выхода для Золотого креста.
  • Разделите торговлю на регистрируемые месяцы (первые три месяца) и торговые месяцы (четвертый месяц), используя четырехмесячный цикл:

Фиксируйте импульс для каждой акции за последние три месяца в течение отчетного месяца и выполняйте ордера в течение торгового месяца.

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

Выход из длинных позиций при краткосрочном MAD > долгосрочном MAD.

Закрывайте короткие позиции, когда краткосрочный MAD < долгосрочный MAD.

Редактирование требований к среде и модулю

В этой статье в качестве редактора используются MacOS и Jupyter Notebook.

Импорт данных

Период данных варьируется от 01.02.2018 до 31.12.2023. Случайным образом выбираются сорок акций, и в качестве рыночного ориентира включается тайваньский взвешенный индекс (IX0001).

Создание функции конвейера

Создание функции пользовательского коэффициента

Пользовательский фактор позволяет пользователям создавать желаемые индивидуальные коэффициенты. В данном случае мы будем использовать его для обработки:
3-месячный фактор Momentum, подробности можно найти в разделе Пользовательские факторы).from zipline.pipeline.filters import StaticAssets
class Momentum(CustomFactor):
inputs = [TWEquityPricing.close]
window_length = 63 # finding past n days’ return

def compute(self, today, assets, out, close):

monthly_return_1 = ((close[21-1]-close[0])/close[0])*100
monthly_return_2 = ((close[42-1]-close[20])/close[0])*100
monthly_return_3 = ((close[63-1]-close[41])/close[0])*100
formation_return = (((monthly_return_1)+(monthly_return_2)+(monthly_return_3))/3).round(5) # 3 months average return
out[:] = formation_return
from numpy import average, abs as np_abs
from zipline.pipeline.factors.basic import _ExponentialWeightedFactor, exponential_weights
class WeightedMovingAbsDev(_ExponentialWeightedFactor):
def compute(self, today, assets, out, data, decay_rate):
weights = exponential_weights(len(data), decay_rate = 1)
mean = average(data, axis=0, weights=weights)
abs_deviation = average(np_abs(data — mean), axis=0, weights=weights)
out[:] = abs_deviation

Pipeline() позволяет пользователям быстро обрабатывать количественные показатели и данные о ценах-объемах для нескольких целей. В данном случае мы будем использовать его для обработки:

  • Рассчитаем индикатор MAD в качестве условия выхода (встроенный коэффициент: WeightedMovingAbsDev; подробности можно найти в разделе Встроенные коэффициенты конвейера).
  • MAD window_length составляет 21 день для краткосрочной и 120 дней для долгосрочной.
  • Когда High имеет значение True, он указывает на 8 самых эффективных акций с точки зрения доходности, в то время как когда Low имеет значение True, он указывает на восемь акций с наименьшими показателями. (Пользователи могут торговать только двумя акциями на 5% из 40 акций, но рекомендуется расширять пул акций; в противном случае количество торгуемых акций будет слишком малым. Здесь мы будем рассчитывать, используя по восемь акций каждая.)

start_dt, end_dt = pd.Timestamp(start, tz=’utc’), pd.Timestamp(end, tz=’utc’)
bundle = bundles.load(‘tquant’)
benchmark_asset = bundle.asset_finder.lookup_symbol(‘IX0001’,as_of_date = None)
def make_pipeline():
mom = Momentum()
mad_short = WeightedMovingAbsDev(inputs = [TWEquityPricing.close], window_length = 21, decay_rate = 1)
mad_long = WeightedMovingAbsDev(inputs = [TWEquityPricing.close], window_length = 120, decay_rate = 1)
curr_price = TWEquityPricing.close.latest

return Pipeline(
columns = {
‘curr_price’: curr_price,
‘Momentum’: mom,
‘High’: mom.top(8),
‘Low’: mom.bottom(8),
‘MAD_short’: mad_short,
‘MAD_long’: mad_long,
},
screen = ~StaticAssets([benchmark_asset])
)
my_pipeline = run_pipeline(make_pipeline(), start_dt, end_dt)
my_pipeline.tail(20)

Momentum Factor Strategy

Установка функции инициализации

Функция initialize() используется для определения ежедневного торгового окружения перед началом торговли. В этом примере мы задаем:

  • Стоимость проскальзывания
  • Комиссии
  • Возвращает индекс (IX0001) в качестве эталонного индекса
  • Интеграция стратегии фактора импульса, разработанной с помощью Pipeline, в торговый процесс

Создание функции handle_data

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

С подробными правилами торговли по данной стратегии можно ознакомиться на сайте Momentum Factor.ipynb# record month -> record 3 months’ momentum
if (context.day_count == 1) and (High == True) and (len(context.high_list) < 45):
context.high_list.append(i)
if (context.day_count == 1) and (Low == True) and (len(context.low_list) < 45):
context.low_list.append(i)

# trade month (Long, Short) -> first day in trade month, context.high_list and context.low_list have values
if (context.day_count == 0) and (i in context.high_list) and (cash_position > curr_price * 2000):
order(i, 2000)
buy = True
record(buy = buy)
context.high_list = [x for x in context.high_list if x != i]
elif (context.day_count == 0) and (i in context.low_list) and (cash_position >= 0):
order(i, -2000)
buy = True
record(buy = buy)
context.low_list = [x for x in context.low_list if x != i]

# Exiting the position (clearing the position from the previous trading month on the 21st day of the recording month) -> MAD_short > MAD_long or MAD_short > MAD_long
if (21 <= context.day_count <= 63) and (MAD_short > MAD_long) and (stock_position > 0) and (i in context.history_high):
order_target(i, 0)
sell = True
record(sell = sell)
context.history_high = [x for x in context.history_high if x != i]
elif (21 <= context.day_count <= 63) and (MAD_short < MAD_long) and (i in context.history_low):
order_target(i, 0)
sell = True
record(sell = sell)
context.history_low = [x for x in context.history_low if x != i]

Исполнение торговой стратегии

Run_algorithm() используется для выполнения настроенной стратегии фактора импульса. Торговый период установлен с start_dt (2018-02-01) по end_dt (2023-12-31) с использованием датасета tquant, с начальным капиталом в десять миллионов долларов. Выходные результаты представляют собой ежедневную производительность и детали торговли.

Momentum Factor Strategy

Оценка производительности с помощью Pyfolio

import pyfolio as pf
from pyfolio.utils import extract_rets_pos_txn_from_zipline
returns, positions, transactions = pf.utils.extract_rets_pos_txn_from_zipline(results)
benchmark_rets = results.benchmark_return
# Creating a Full Tear Sheet
pf.create_full_tear_sheet(returns, positions = positions, transactions = transactions,
benchmark_rets = benchmark_rets,
round_trips=False)

Momentum Factor Strategy

Мы видим, что стратегия фактора импульса достигла годовой доходности примерно 16,56% за эти 68 месяцев, а совокупная доходность составила 140,25%. Показатели прибыли впечатляют. Однако, относительно характеристик стратегии, может наблюдаться запаздывание во входе. Например, мы не можем сразу следить за акциями с хорошей динамикой в этом месяце; Вместо этого мы должны подождать какое-то время, чтобы внести бай-ин. Таким образом, отсутствие точки входа может быть причиной расхождения в производительности между 1 и 2 кварталами 20 лет по сравнению с бенчмарком. Однако этот запаздывающий эффект также может принести больше избыточной доходности стратегии. Например, когда рыночные настроения в определенном секторе улучшаются, стратегия уже купила из-за своего предыдущего хорошего импульса, эквивалентного раннему позиционированию. Поэтому предполагается, что столь значительный опережение произошел во второй половине 21-го и 23-го годов. Однако, что касается проблемы запаздывания, мы можем дополнить ее такими индикаторами, как RSI (стратегия скользящих средних TQuant Lab RSI) или индикаторами, связанными с волатильностью, которые могут быть дополнительно изучены.

Momentum Factor Strategy
Momentum Factor Strategy

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

Заключение

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

Источник