Type/to search
2
Follow
484
Followers
Дистилляция опыта 99 трейдеров в одну стратегию: идея реализации KOL-дистилляции консенсуса на Inventor
Discussions
Created 2026-04-30 14:07:08  Updated 2026-05-09 10:24:15
 0
 305

img

В последнее время термин «дистилляция» используется всё чаще. В области ИИ он обычно означает извлечение сложных способностей в более компактные и многократно используемые структуры; в контексте исследования стратегий эта идея также актуальна. Если говорить прямо, то это преобразование разрозненных, нечётких и основанных на субъективном опыте знаний в систему, которую можно вычислять, проверять и корректировать.

Проект crypto-kol-quant в последнее время стал очень популярен. Самое интересное в нём — не то, сколько KOL он собрал, и не то, что он использует LLM, а то, что он пытается сделать нечто необычное в количественных исследованиях: дистиллировать опыт трейдеров в набор вычислимых факторных способностей, а затем объединить их в консенсусный сигнал. Сам по себе этот вопрос заслуживает серьёзного внимания. Если группа давно活跃, со стабильным стилем трейдеров действительно сформировала в рынке собственные когнитивные рамки, то эти рамки теоретически не должны существовать только в твитах, графиках и обрывках фраз; они заслуживают того, чтобы быть извлечёнными, систематизированными и включёнными в рабочую цепочку стратегий.

img

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

Объект дистилляции — не мнение, а торговая способность

Многие, впервые сталкиваясь с такими проектами, склонны воспринимать их как «стратегию на настроениях KOL». Но это не совсем верно. Исходный проект на самом деле занимается не простым определением того, кто сегодня оптимистичнее, и не подсчётом того, кто кричал «buy», а кто «sell». Он идёт дальше: задаётся вопросом, как именно этот трейдер понимает рынок? При какой структуре он склонен к бычьему настрою? На что он обращает больше внимания: тренд, позиция, паттерн, волатильность или макроэкономическая среда? Можно ли систематизировать эти способы суждения в стабильные наборы меток способностей?

Как только вопрос ставится так, фокус стратегии смещается. Системе больше не важно конкретное высказывание, ей важна методология, стоящая за этим высказыванием. Другими словами, объект дистилляции в этой стратегии — не текст, а сами торговые знания. Она пытается перевести субъективный опыт, который обычно требует человеческого понимания, в формализованные способности, которые программа может распознать и использовать. Это и есть её главное отличие от обычных моделей настроений: она не оценивает, насколько горяч рынок, а реконструирует реакцию различных торговых фреймворков на текущую рыночную ситуацию.

Шаг первый: сначала перевести рынок в переменные состояния

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

Поэтому первое, что должна сделать система, — не дать выводы о лонг/шорт, а преобразовать сырые рыночные данные в набор структурированных состояний. Самый базовый слой — использование цены для построения признаков тренда и импульса. Такие переменные, как скользящие средние, экспоненциальные скользящие средние, RSI, MACD, не нужны для нагромождения индикаторов, а для ответа на простой вопрос: в каком примерно состоянии находится рынок сейчас.

img

Ключевой код:

python
# Использование скользящих средних разных периодов для описания положения цены относительно тренда f['ma20'] = _sma(c,20) f['ma50'] = _sma(c,50) f['ma100'] = _sma(c,100) f['ma200'] = _sma(c,200) # Экспоненциальные скользящие средние более чувствительны к недавним изменениям цены f['ema20'] = _ema(c,20) f['ema50'] = _ema(c,50) # RSI описывает, находится ли рынок в зоне перекупленности/перепроданности или импульс ослабевает f['rsi14'] = _rsi(c,14) # MACD, его сигнальная линия и гистограмма для наблюдения за изменениями тренда и импульса ml, ms, mh = _macd(c) f['macd'] = ml f['macd_sig'] = ms f['macd_hist'] = mh

Этот код не делает ничего сложного. Скользящие средние помогают системе определить положение текущей цены относительно долгосрочного тренда, а RSI и MACD используются для описания того, усиливается или ослабевает импульс. Система ещё не перешла к торговым суждениям, а только создаёт слой «описания рыночного состояния».

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

Соответствующий код:

python
# Логарифмическая доходность — основа для расчёта волатильности logr = np.log(c / c.shift(1)) # Годовая волатильность за последние 30 дней, используется для оценки текущего уровня волатильности рынка f['rv30'] = logr.rolling(30, min_periods=10).std() * np.sqrt(365) # Максимумы и минимумы за последние 20 и 50 дней для определения положения цены f['high_20d'] = h.rolling(20, min_periods=1).max() f['low_20d'] = l.rolling(20, min_periods=1).min() f['high_50d'] = h.rolling(50, min_periods=1).max() f['low_50d'] = l.rolling(50, min_periods=1).min()

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

python
# DXY как фоновый показатель силы доллара if 'DXY' in macro: dxy = _align(macro['DXY']) f['dxy_ret_20d'] = dxy.pct_change(20) f['dxy_trend_down'] = (dxy.pct_change(20) < -0.01).astype(int) # SPX как фоновый показатель аппетита к риску if 'SPX' in macro: spx = _align(macro['SPX']) f['spx_ret_20d'] = spx.pct_change(20) f['spx_trend_up'] = (spx.pct_change(20) > 0).astype(int)

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

Шаг второй: записать субъективный опыт в факторные способности

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

Этот шаг — самая сильная часть дистилляции стратегии. Потому что здесь уже не говорится абстрактно «какая-то структура важна», а она действительно записывается в виде программных условий. В текущей реализации факторные способности охватывают несколько уровней: формации, структуру, индикаторы, циклы и макроэкономику. Например, одни способности основаны на распознавании паттернов (бычий флаг, медвежий флаг, двойная вершина/дно, голова и плечи, треугольник); другие — на структурном анализе (фреймворки Wyckoff, SMC, ICT); третьи — на самих индикаторах (дивергенция RSI, золотой/смертный крест скользящих средних, пробой сжатия Боллинджера); а также на циклах и макроэкономической среде (цикл халвинга, переключение между трендовым и боковым рынком, падение DXY, улучшение аппетита к риску).

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

python
# Определение, находится ли текущая цена рядом с 50-дневной скользящей средней near_ma50 = abs(close - ma50_v) / close < 0.02 if close > 0 else False # Если 50-дневная средняя всё ещё выше 200-дневной средней, и после отката к средней появилась зелёная свеча (поддержка) # то фиксируем сигнал способности продолжения тренда s['cap_014_trend_pullback_continuation'] = 0.6 if (ma50_gt and near_ma50 and is_green) else 0.0

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

python
# Если ширина полос Боллинджера предыдущей свечи ниже порога сжатия, считаем, что произошло сжатие squeezed = bb_w_p1 < bb_w20_p1 if bb_w20_p1 > 0 else False # После сжатия пробой верхней полосы — положительный сигнал; пробой нижней полосы — отрицательный сигнал s['cap_021_bollinger_squeeze_breakout'] = ( 0.6 if (squeezed and close > bb_u) else -0.6 if (squeezed and close < bb_l) else 0.0 )

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

python
# DXY回落通常被视为对BTC偏正面的背景 s['cap_027_dxy_inverse_btc'] = 0.4 if (not _nm(dxy_r20) and dxy_r20 < -0.01) else 0.0 # 标普上涨可视为风险偏好改善 s['cap_028_spx_risk_on_off'] = 0.4 if (not _nm(spx_r20) and spx_r20 > 0.02) else 0.0 # 短端利率回落可视为流动性边际改善 s['cap_029_yields_liquidity'] = 0.4 if (not _nm(y_r20) and y_r20 < -0.02) else 0.0

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

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

img

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

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

Соответствующая логика чтения профилей выглядит следующим образом:

python
# Считываем используемые факторы способностей и их веса для каждого трейдера caps = {c['id']: float(c.get('weight', 0.5)) for c in p.get('capabilities_used', [])} profiles.append({ 'handle': p.get('handle', item['name'][:-5]), 'caps': caps })

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

python
for p in profiles: sig = 0.0 wt = 0.0 # Проходим по всем факторам способностей, которые отслеживает этот трейдер for cap_id, w in p['caps'].items(): score = factor_scores.get(cap_id, 0.0) # Текущая оценка фактора умножается на вес предпочтения трейдера по данному фактору sig += w * score wt += abs(w) # После нормализации получаем персональный сигнал трейдера на текущем рынке trader_raw = sig / wt if wt > 0 else 0.0

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

Шаг четвертый: от персональных сигналов к взвешенному консенсусу

img

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

Два наиболее важных результата в текущем коде – это ic_weighted и trust_adjusted. Соответствующая основная логика:

python
# Сначала взвешиваем трейдеров с положительным IC в положительном направлении, получаем ic_weighted pos_w = sum(max(t['ic'], 0) for t in trader_signals) ic_wt = ( sum(t['signal'] * max(t['ic'], 0) for t in trader_signals) / pos_w if pos_w > 0 else 0.0 ) # trust_adjusted идёт дальше: # Положительный IC используется напрямую, отрицательный IC – обратно, затем взвешиваем по абсолютной величине IC abs_w = sum(abs(t['ic']) for t in trader_signals) trust = ( sum((t['signal'] if t['ic'] >= 0 else -t['signal']) * abs(t['ic']) for t in trader_signals) / abs_w if abs_w > 0 else 0.0 )

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

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

img

img

Что на самом деле заработало в реализации на Inventor

Если бы всё осталось только в рамках исследовательского проекта, эта система была бы скорее «анализатором консенсуса». А реализация на Inventor сделала главное – собрала всю цепочку воедино, чтобы она могла работать непрерывно. Самый важный код состоит всего из трёх строк:

python
# Шаг 1: преобразование исходных данных рынка и макропеременных в структурированное состояние feat_df = build_features(records, macro if macro else None) # Шаг 2: на основе переменных состояния оцениваем, какие факторы способностей сработали в данный момент factor_scores = evaluate_factors(feat_df) # Шаг 3: отображение факторов способностей на профили трейдеров и агрегация в консенсусный результат consensus = compute_consensus(factor_scores)

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

Почему это всё ещё прототип

Конечно, эта реализация – не финальная версия. Текущий код использует дневной фрейм BTC, поэтому он больше подходит для средне-низкочастотных консенсусных решений, а не для высокочастотных торговых систем. Его ядро по-прежнему вращается вокруг дневных структур, циклических позиций, макрофона и предпочтений трейдеров по способностям. Кроме того, профили трейдеров и IC всё ещё являются статическим входом и не перешли на стадию онлайн-эволюции. То есть система хотя и завершила первый шаг «дистилляции знаний», но ещё не полностью достигла «самокоррекции дистиллированных знаний».

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

Заключение

crypto-kol-quant по-настоящему вдохновляет не количеством использованных модных концепций, а тем, что он действительно продвинул вперёд одну очень трудно систематизируемую вещь: превращение опыта трейдеров из выражений в способности, из способностей в факторы, а из факторов в консенсус. А реализация на Inventor сделала именно то, что сделала эту цепочку дистилляции реально работающей. Она не преувеличивает, что уже является финалом, и не пытается скрыть, что всё ещё остаётся лишь ранним прототипом. Но она как минимум доказала: торговый опыт не обязательно остаётся только в графиках и языке – он может быть дистиллирован, структурирован, запущен и даже помещён в систему, непрерывно оценивающую рынок.

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

Оригинальный проект: 锁妖塔 Skill —炼化99个加密交易员

Особая благодарность пользователю "GiantBin" за предоставленные идеи и соображения. Если у кого-то есть хорошие идеи, добро пожаловать к обмену и обсуждению.

Comment
All comments (0)
No data
No data
  • 1
iPhone Download
Forums
PINE Language
© 2015 - ∞ INVENTOR PTE LTD (SG)