- Регистрация
- 23 Август 2023
- Сообщения
- 2 822
- Лучшие ответы
- 0
- Реакции
- 0
- Баллы
- 51
Offline
На криптовалютном рынке цены очень хаотично движутся, прогнозы сбываются не каждый раз (особенно если вы полагаетесь на мнение инфлов), а новостной фон подливает масла в огонь. В этом хаосе многие пытаются найти хоть какие-то закономерности, опираясь не на догадки, а на измеримые данные.
Сегодня мы как раз и займемся таким анализом — разберем популярный в узких кругах индикатор Hash Ribbons. Но сделаем это не как трейдеры в поисках кнопки "бабло", а разберем, что там под условно капотом.
Важный дисклеймер: Эта статья — исключительно техническое и математическое исследование. Это не финансовая рекомендация, не торговый совет и не попытка предсказать будущее. Моя цель — разобрать логику и код конкретного инструмента, а не предложить готовую стратегию. Любые действия на финансовых рынках сопряжены с высоким риском
.
Итак, наша задача — взять экономическую гипотезу, посмотреть, как ее формализовали с помощью математики, и как в итоге она превратилась в код на Pine Script, который может запустить любой желающий.
Концепция.
Чтобы понять логику индикатора, для начала нужно разобраться с двумя вещами: что такое хешрейт и кто такие майнеры.
Если говорить максимально просто, хешрейт (Hash Rate) — это общая вычислительная мощность всех устройств, которые участвуют в работе сети Bitcoin. Это своего рода "пульс" сети. Чем он выше, тем больше вычислительных ресурсов задействовано, тем безопаснее и стабильнее сеть.
Майнеры — это те, кто предоставляет эти вычислительные мощности. Для них это бизнес: они тратят деньги на оборудование и электричество, а взамен получают вознаграждение в виде новых биткоинов и комиссий за транзакции. И как в любом бизнесе, здесь есть своя точка безубыточности.
В этом и кроется суть гипотезы, на которой построен индикатор Hash Ribbons:
С точки зрения данных, капитуляция майнеров выглядит как заметное и устойчивое падение общего хешрейта сети. Автор индикатора, Чарльз Эдвардс, предположил, что момент, когда майнеры прекращают капитулировать и начинают снова включать оборудование (хешрейт восстанавливается), исторически был благоприятным для покупки актива.
Мы не будем оценивать прибыльность этой гипотезы. Мы просто примем ее как данность и посмотрим, как ее можно измерить и превратить в алгоритм.
Для начала взглянем на исходный код индикатора. Он написан на Pine Script — языке для платформы TradingView. Вот так выглядит его "шапка" и основные настраиваемые параметры:
//@version=5
indicator('Hash Ribbons (Capriole Investments)', overlay=false)
// INPUTS - Пользовательские настройки
type = input.string('Ribbons', options=['Ribbons', 'Oscillator'], title='Plot Type')
// Позволяет переключать вид: "ленты" или осциллятор
len_s = input(30, 'Hash Rate Short SMA (days).')
// Период для короткой (быстрой) скользящей средней хешрейта. По умолчанию 30 дней.
len_l = input(60, 'Hash Rate Long SMA (days).')
// Период для длинной (медленной) скользящей средней. По умолчанию 60 дней.
signals = input(true, 'Plot Signals')
// Включить/выключить отображение сигналов на графике (кружочки и надписи).
plot_halvings = input(true, 'Plot Halvings')
// Показывать ли на графике вертикальные линии в моменты халвингов Bitcoin.
raw = input(false, 'Plot Raw Hash Rate')
// Отображать "сырой" график хешрейта вместо индикатора.
source = input.string('INTOTHEBLOCK:BTC_HASHRATE', options=['QUANDL:BCHAIN/HRATE', 'INTOTHEBLOCK:BTC_HASHRATE'], title='Source Hash Rate')
// Источник данных. Позволяет выбрать, откуда брать информацию о хешрейте.
Как видим, в основе лежат всего несколько ключевых параметров, главные из которых — это периоды для двух скользящих средних. Именно они и являются ядром математической модели индикатора. В следующей части мы разберем, как они работают.
Математическая модель.
Итак, у нас есть гипотеза и поток "сырых" данных — ежедневные значения хешрейта. Проблема в том, что эти данные "шумные": хешрейт может колебаться день ко дню по множеству причин. Нам нужно отделить значимый тренд от этого шума. Как это сделать?
Самый простой и проверенный способ в анализе временных рядов — скользящие средние (Moving Averages).
Если вы не сталкивались с ними, представьте, что вы анализируете среднюю температуру. Можно смотреть на температуру каждый день, но она будет скакать. А можно посчитать среднюю за последние 30 дней и среднюю за последние 60 дней. Сравнивая эти два сглаженных значения, вы сможете понять общий тренд: становится в целом холоднее или теплее, игнорируя при этом разовые потепления или похолодания.
Индикатор Hash Ribbons использует тот же подход, применяя простую скользящую среднюю (SMA) к данным о хешрейте. В коде это выглядит так:
// ЗАПРОС ДАННЫХ И РАСЧЕТ SMA
// Запрашиваем дневные данные о хешрейте из указанного источника.
// lookahead=barmerge.lookahead_on нужен, чтобы на текущем, еще не закрытом дневном баре, использовать данные за вчера. Это защищает от "перерисовки" индикатора в реальном времени.
live_HR_short = request.security(source, 'D', ta.sma(close, len_s), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
live_HR_long = request.security(source, 'D', ta.sma(close, len_l), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
// Для исторических данных "заглядывание вперед" не нужно
hist_HR_short = request.security(source, 'D', ta.sma(close, len_s), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
hist_HR_long = request.security(source, 'D', ta.sma(close, len_l), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
// ... далее идет код для склейки исторических и real-time данных ...
// В переменные HR_short и HR_long попадают итоговые значения SMA
HR_short := barstate.isrealtime ? live_HR_short : hist_HR_short
HR_long := barstate.isrealtime ? live_HR_long : hist_HR_long
Здесь len_s и len_l — это те самые периоды (30 и 60 дней по умолчанию), которые мы видели в настройках. ta.sma(close, len_s) — это встроенная функция Pine Script, которая и вычисляет среднее значение хешрейта за указанный период.
Теперь у нас есть две линии:
1. Быстрая SMA (30 дней) — более чувствительна к свежим изменениям.
2. Медленная SMA (60 дней) — более инертная, показывает долгосрочный тренд.
Именно взаимодействие этих двух линий и формирует логику индикатора):
Начало «капитуляции»: Быстрая SMA пересекает медленную сверху вниз. Это означает, что краткосрочная тенденция стала хуже долгосрочной. Математически это и есть наш сигнал о начале проблем у майнеров.
Конец «капитуляции» (Восстановление): Быстрая SMA возвращается обратно и пересекает медленную снизу вверх. Тренд меняется на позитивный, хешрейт восстанавливается.
В коде эти моменты отслеживаются с помощью специальных функций:
// ОПРЕДЕЛЕНИЕ СОСТОЯНИЙ
// ta.crossunder() возвращает true в тот момент, когда первая линия пересекает вторую сверху вниз.
capitulation = ta.crossunder(HR_short, HR_long)
// ta.crossover() делает то же самое для пересечения снизу вверх.
recovered = ta.crossover(HR_short, HR_long)
// Также вводится промежуточное состояние, когда майнеры находятся в процессе капитуляции
miner_capitulation = HR_short < HR_long
Таким образом, мы формализовали нашу гипотезу. "Капитуляция майнеров" — это больше не абстрактное понятие, а конкретное, измеримое состояние системы: HR_short < HR_long.
Но это еще не все. Индикатор не просто фиксирует эти пересечения, а строит на их основе более сложный, композитный сигнал.
Композитный сигнал.
Автор индикатора пошел дальше и добавил второе условие, которое завязано уже не на хешрейт, а на ценовой моментум. Идея в том, чтобы совместить два события: восстановление хешрейта и начало роста цены.
Для оценки ценового моментума используются те же SMA, но уже от цены закрытия (close) и с периодами 10 и 20 дней (s10 и s20).
Финальная логика, формирующая сигнал "Buy", выглядит так:
// ЛОГИКА СИГНАЛА "BUY"
buy = false
buy := ta.crossover(s10, s20) and ta.barssince(recovered) < ta.barssince(ta.crossunder(s10, s20)) and ta.barssince(recovered) < ta.barssince(capitulation) or s10 > s20 and ta.crossover(HR_short, HR_long)
Это сложное логическое выражение, которое, по сути, проверяет два сценария:
Таким образом, то, что называется сигналом "Buy", на самом деле является композитным событием, требующим совпадения нескольких факторов.
Визуализация.
Помимо основной логики, в коде есть несколько полезных дополнений, отвечающих за визуализацию и удобство использования.
1. Отрисовка сигналов
Для отображения всех ключевых событий (начало капитуляции, восстановление, покупка) на графике используется функция plotshape. Она рисует цветные кружки в нужные моменты времени.
// PLOT - SIGNALS
// Рисуем серый круг в момент начала капитуляции
plotshape(signals ? capitulation : na, style=shape.circle, location=location.top, color=color.new(color.gray, 50), size=size.normal, text='Capitulation')
// ... (аналогично для других состояний) ...
// Рисуем синий круг для сигнала "Buy"
plotshape(signals ? buy_plot : na, style=shape.circle, location=location.top, color=color.new(color.blue, 0), size=size.normal, text='Buy')
2. Режим осциллятора
В настройках индикатора можно переключить вид с "лент" на "осциллятор". Это просто альтернативный способ визуализации. Вместо двух линий он показывает гистограмму, отражающую разницу между быстрой и медленной SMA в процентах.
// OSCILLATOR
delta = HR_short - HR_long
diff = delta / HR_short * 100
// PLOT - OSCILLATOR
plot(type == 'Oscillator' ? diff : na, style=plot.style_columns, color=diff < 0 ? color.red : color.blue, title='Oscillator')
Если гистограмма ниже нуля — хешрейт в "зоне капитуляции", если выше — в "зоне роста".
3. Отображение халвингов
Индикатор также умеет отмечать на графике даты халвингов Bitcoin — событий, когда награда майнерам сокращается вдвое. Это чисто визуальная метка, она не влияет на расчеты, но помогает сориентироваться в макроциклах рынка.
// HALVINGS
halving_1 = timestamp(2012, 11, 28, 0, 0)
// ... (даты для 2-го и 3-го халвингов) ...
// Закрашиваем фон красным в районе даты халвинга
bgcolor(h1_range and plot_halvings ? color.new(color.red,20) : na)
Заключение
Мы с вами проделали путь от абстрактной экономической гипотезы до ее конкретной реализации в коде. Мы увидели, как с помощью простого, но эффективного аппарата скользящих средних можно формализовать идею о "капитуляции майнеров" и превратить ее в измеримый и визуализируемый алгоритм.
И здесь я хочу еще раз, в последний раз, вернуться к тому, с чего мы начали.
Это не алгоритм для предсказаний. Это всего лишь одна из сотен моделей, которая пытается найти логику в хаосе, и работает с числами. Рынок может и будет вести себя иррационально, и любой, даже самый продуманный алгоритм, может давать сбои. Данная статья — это образовательное упражнение, демонстрация того, как можно применять инженерный подход к анализу рыночных данных. Не более того.
А теперь вопрос к вам. Какие еще неценовые, фундаментальные метрики (on-chain данные) вы считаете интересными для анализа с точки зрения программирования? Сталкивались ли вы с похожими задачами моделирования?
Делитесь идеями в комментариях!
Сегодня мы как раз и займемся таким анализом — разберем популярный в узких кругах индикатор Hash Ribbons. Но сделаем это не как трейдеры в поисках кнопки "бабло", а разберем, что там под условно капотом.
Важный дисклеймер: Эта статья — исключительно техническое и математическое исследование. Это не финансовая рекомендация, не торговый совет и не попытка предсказать будущее. Моя цель — разобрать логику и код конкретного инструмента, а не предложить готовую стратегию. Любые действия на финансовых рынках сопряжены с высоким риском
Итак, наша задача — взять экономическую гипотезу, посмотреть, как ее формализовали с помощью математики, и как в итоге она превратилась в код на Pine Script, который может запустить любой желающий.
Концепция.
Чтобы понять логику индикатора, для начала нужно разобраться с двумя вещами: что такое хешрейт и кто такие майнеры.
Если говорить максимально просто, хешрейт (Hash Rate) — это общая вычислительная мощность всех устройств, которые участвуют в работе сети Bitcoin. Это своего рода "пульс" сети. Чем он выше, тем больше вычислительных ресурсов задействовано, тем безопаснее и стабильнее сеть.
Майнеры — это те, кто предоставляет эти вычислительные мощности. Для них это бизнес: они тратят деньги на оборудование и электричество, а взамен получают вознаграждение в виде новых биткоинов и комиссий за транзакции. И как в любом бизнесе, здесь есть своя точка безубыточности.
В этом и кроется суть гипотезы, на которой построен индикатор Hash Ribbons:
Майнеры несут реальные расходы. Главная статья — электричество.
Когда рыночная цена Bitcoin падает, доход от майнинга снижается.
Если цена падает ниже точки безубыточности, наименее эффективные майнеры (те, у кого дорогое электричество или устаревшее оборудование) начинают работать в убыток.
Чтобы остановить потери, они отключают свои устройства. Этот процесс массового отключения и называется «капитуляцией майнеров».
С точки зрения данных, капитуляция майнеров выглядит как заметное и устойчивое падение общего хешрейта сети. Автор индикатора, Чарльз Эдвардс, предположил, что момент, когда майнеры прекращают капитулировать и начинают снова включать оборудование (хешрейт восстанавливается), исторически был благоприятным для покупки актива.
Мы не будем оценивать прибыльность этой гипотезы. Мы просто примем ее как данность и посмотрим, как ее можно измерить и превратить в алгоритм.
Для начала взглянем на исходный код индикатора. Он написан на Pine Script — языке для платформы TradingView. Вот так выглядит его "шапка" и основные настраиваемые параметры:
//@version=5
indicator('Hash Ribbons (Capriole Investments)', overlay=false)
// INPUTS - Пользовательские настройки
type = input.string('Ribbons', options=['Ribbons', 'Oscillator'], title='Plot Type')
// Позволяет переключать вид: "ленты" или осциллятор
len_s = input(30, 'Hash Rate Short SMA (days).')
// Период для короткой (быстрой) скользящей средней хешрейта. По умолчанию 30 дней.
len_l = input(60, 'Hash Rate Long SMA (days).')
// Период для длинной (медленной) скользящей средней. По умолчанию 60 дней.
signals = input(true, 'Plot Signals')
// Включить/выключить отображение сигналов на графике (кружочки и надписи).
plot_halvings = input(true, 'Plot Halvings')
// Показывать ли на графике вертикальные линии в моменты халвингов Bitcoin.
raw = input(false, 'Plot Raw Hash Rate')
// Отображать "сырой" график хешрейта вместо индикатора.
source = input.string('INTOTHEBLOCK:BTC_HASHRATE', options=['QUANDL:BCHAIN/HRATE', 'INTOTHEBLOCK:BTC_HASHRATE'], title='Source Hash Rate')
// Источник данных. Позволяет выбрать, откуда брать информацию о хешрейте.
Как видим, в основе лежат всего несколько ключевых параметров, главные из которых — это периоды для двух скользящих средних. Именно они и являются ядром математической модели индикатора. В следующей части мы разберем, как они работают.

Математическая модель.
Итак, у нас есть гипотеза и поток "сырых" данных — ежедневные значения хешрейта. Проблема в том, что эти данные "шумные": хешрейт может колебаться день ко дню по множеству причин. Нам нужно отделить значимый тренд от этого шума. Как это сделать?
Самый простой и проверенный способ в анализе временных рядов — скользящие средние (Moving Averages).
Если вы не сталкивались с ними, представьте, что вы анализируете среднюю температуру. Можно смотреть на температуру каждый день, но она будет скакать. А можно посчитать среднюю за последние 30 дней и среднюю за последние 60 дней. Сравнивая эти два сглаженных значения, вы сможете понять общий тренд: становится в целом холоднее или теплее, игнорируя при этом разовые потепления или похолодания.
Индикатор Hash Ribbons использует тот же подход, применяя простую скользящую среднюю (SMA) к данным о хешрейте. В коде это выглядит так:
// ЗАПРОС ДАННЫХ И РАСЧЕТ SMA
// Запрашиваем дневные данные о хешрейте из указанного источника.
// lookahead=barmerge.lookahead_on нужен, чтобы на текущем, еще не закрытом дневном баре, использовать данные за вчера. Это защищает от "перерисовки" индикатора в реальном времени.
live_HR_short = request.security(source, 'D', ta.sma(close, len_s), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
live_HR_long = request.security(source, 'D', ta.sma(close, len_l), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_on)
// Для исторических данных "заглядывание вперед" не нужно
hist_HR_short = request.security(source, 'D', ta.sma(close, len_s), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
hist_HR_long = request.security(source, 'D', ta.sma(close, len_l), gaps=barmerge.gaps_off, lookahead=barmerge.lookahead_off)
// ... далее идет код для склейки исторических и real-time данных ...
// В переменные HR_short и HR_long попадают итоговые значения SMA
HR_short := barstate.isrealtime ? live_HR_short : hist_HR_short
HR_long := barstate.isrealtime ? live_HR_long : hist_HR_long
Здесь len_s и len_l — это те самые периоды (30 и 60 дней по умолчанию), которые мы видели в настройках. ta.sma(close, len_s) — это встроенная функция Pine Script, которая и вычисляет среднее значение хешрейта за указанный период.
Теперь у нас есть две линии:
1. Быстрая SMA (30 дней) — более чувствительна к свежим изменениям.
2. Медленная SMA (60 дней) — более инертная, показывает долгосрочный тренд.
Именно взаимодействие этих двух линий и формирует логику индикатора):
Начало «капитуляции»: Быстрая SMA пересекает медленную сверху вниз. Это означает, что краткосрочная тенденция стала хуже долгосрочной. Математически это и есть наш сигнал о начале проблем у майнеров.
Конец «капитуляции» (Восстановление): Быстрая SMA возвращается обратно и пересекает медленную снизу вверх. Тренд меняется на позитивный, хешрейт восстанавливается.
В коде эти моменты отслеживаются с помощью специальных функций:
// ОПРЕДЕЛЕНИЕ СОСТОЯНИЙ
// ta.crossunder() возвращает true в тот момент, когда первая линия пересекает вторую сверху вниз.
capitulation = ta.crossunder(HR_short, HR_long)
// ta.crossover() делает то же самое для пересечения снизу вверх.
recovered = ta.crossover(HR_short, HR_long)
// Также вводится промежуточное состояние, когда майнеры находятся в процессе капитуляции
miner_capitulation = HR_short < HR_long
Таким образом, мы формализовали нашу гипотезу. "Капитуляция майнеров" — это больше не абстрактное понятие, а конкретное, измеримое состояние системы: HR_short < HR_long.
Но это еще не все. Индикатор не просто фиксирует эти пересечения, а строит на их основе более сложный, композитный сигнал.
Композитный сигнал.
Автор индикатора пошел дальше и добавил второе условие, которое завязано уже не на хешрейт, а на ценовой моментум. Идея в том, чтобы совместить два события: восстановление хешрейта и начало роста цены.
Для оценки ценового моментума используются те же SMA, но уже от цены закрытия (close) и с периодами 10 и 20 дней (s10 и s20).
Финальная логика, формирующая сигнал "Buy", выглядит так:
// ЛОГИКА СИГНАЛА "BUY"
buy = false
buy := ta.crossover(s10, s20) and ta.barssince(recovered) < ta.barssince(ta.crossunder(s10, s20)) and ta.barssince(recovered) < ta.barssince(capitulation) or s10 > s20 and ta.crossover(HR_short, HR_long)
Это сложное логическое выражение, которое, по сути, проверяет два сценария:
Сначала восстановился хешрейт, и только после этого начала расти цена.
Цена уже находится в растущем тренде (s10 > s20), и в этот момент происходит восстановление хешрейта, подтверждая позитивный настрой.
Таким образом, то, что называется сигналом "Buy", на самом деле является композитным событием, требующим совпадения нескольких факторов.
Визуализация.
Помимо основной логики, в коде есть несколько полезных дополнений, отвечающих за визуализацию и удобство использования.
1. Отрисовка сигналов
Для отображения всех ключевых событий (начало капитуляции, восстановление, покупка) на графике используется функция plotshape. Она рисует цветные кружки в нужные моменты времени.
// PLOT - SIGNALS
// Рисуем серый круг в момент начала капитуляции
plotshape(signals ? capitulation : na, style=shape.circle, location=location.top, color=color.new(color.gray, 50), size=size.normal, text='Capitulation')
// ... (аналогично для других состояний) ...
// Рисуем синий круг для сигнала "Buy"
plotshape(signals ? buy_plot : na, style=shape.circle, location=location.top, color=color.new(color.blue, 0), size=size.normal, text='Buy')
2. Режим осциллятора
В настройках индикатора можно переключить вид с "лент" на "осциллятор". Это просто альтернативный способ визуализации. Вместо двух линий он показывает гистограмму, отражающую разницу между быстрой и медленной SMA в процентах.
// OSCILLATOR
delta = HR_short - HR_long
diff = delta / HR_short * 100
// PLOT - OSCILLATOR
plot(type == 'Oscillator' ? diff : na, style=plot.style_columns, color=diff < 0 ? color.red : color.blue, title='Oscillator')
Если гистограмма ниже нуля — хешрейт в "зоне капитуляции", если выше — в "зоне роста".
3. Отображение халвингов
Индикатор также умеет отмечать на графике даты халвингов Bitcoin — событий, когда награда майнерам сокращается вдвое. Это чисто визуальная метка, она не влияет на расчеты, но помогает сориентироваться в макроциклах рынка.
// HALVINGS
halving_1 = timestamp(2012, 11, 28, 0, 0)
// ... (даты для 2-го и 3-го халвингов) ...
// Закрашиваем фон красным в районе даты халвинга
bgcolor(h1_range and plot_halvings ? color.new(color.red,20) : na)
Заключение
Мы с вами проделали путь от абстрактной экономической гипотезы до ее конкретной реализации в коде. Мы увидели, как с помощью простого, но эффективного аппарата скользящих средних можно формализовать идею о "капитуляции майнеров" и превратить ее в измеримый и визуализируемый алгоритм.
И здесь я хочу еще раз, в последний раз, вернуться к тому, с чего мы начали.
Это не алгоритм для предсказаний. Это всего лишь одна из сотен моделей, которая пытается найти логику в хаосе, и работает с числами. Рынок может и будет вести себя иррационально, и любой, даже самый продуманный алгоритм, может давать сбои. Данная статья — это образовательное упражнение, демонстрация того, как можно применять инженерный подход к анализу рыночных данных. Не более того.
А теперь вопрос к вам. Какие еще неценовые, фундаментальные метрики (on-chain данные) вы считаете интересными для анализа с точки зрения программирования? Сталкивались ли вы с похожими задачами моделирования?
Делитесь идеями в комментариях!