<?xml version="1.0" encoding="UTF-8"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" >

  <channel>
    <title><![CDATA[Комментарии / Профиль quantaiengineer]]></title>
    <link>https://habr.com/ru/users/quantaiengineer/comments/</link>
    <description><![CDATA[Хабр: комментарии пользователя quantaiengineer]]></description>
    <language>ru</language>
    <managingEditor>editor@habr.com</managingEditor>
    <generator>habr.com</generator>
    <pubDate>Sun, 19 Jul 2026 05:14:40 GMT</pubDate>
    
    
      <image>
        <link>https://habr.com/ru/</link>
        <url>https://habrastorage.org/webt/ym/el/wk/ymelwk3zy1gawz4nkejl_-ammtc.png</url>
        <title>Хабр</title>
      </image>
    

    
      

      
        
  
    <item>
      <title>16.06.2026 09:53:31 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1022254/#comment_30116794</guid>
      <link>https://habr.com/ru/articles/1022254/#comment_30116794</link>
      <description><![CDATA[<p>Спасибо! Проект развивается нормально.</p><p>Главное направление сейчас: переход от single-asset версии к управлению портфелем. Идея остаётся той же: модель обучается не на прокси-цели, а через дифференцируемый торговый симулятор напрямую под торговую метрику.</p><p>В первой версии модель управляла одной позицией:</p><p><br><img class="formula inline" source="p_t = \tanh\left(\frac{d_t}{\tau_d}\right) \cdot \sigma\left(\frac{g_t}{\tau_g}\right)" alt="p_t = \tanh\left(\frac{d_t}{\tau_d}\right) \cdot \sigma\left(\frac{g_t}{\tau_g}\right)" src="https://habrastorage.org/getpro/habr/formulas/2/22/22b/22b2260723259ddbf54b9b3dc6b8acdf.svg" width="200" height="40" data-width="25.728" data-height="5.499" data-vertical-align="-2.184"><br></p><p>где <img class="formula inline" source="p_t \in [-1, 1]" alt="p_t \in [-1, 1]" src="https://habrastorage.org/getpro/habr/formulas/2/2b/2b3/2b34fb6de44abbbc09a730cb177c8614.svg" width="80" height="16" data-width="10.956" data-height="2.262" data-vertical-align="-0.566">. Отрицательное значение означает short, положительное значение означает long, значение около нуля означает отсутствие активной позиции.</p><p>В портфельной версии модель выдаёт уже не одну позицию, а сырой сигнал по каждому активу:</p><p><br><img class="formula inline" source="s_{i,t} = \tanh\left(\frac{d_{i,t}}{\tau_d}\right) \cdot \sigma\left(\frac{g_{i,t}}{\tau_g}\right)" alt="s_{i,t} = \tanh\left(\frac{d_{i,t}}{\tau_d}\right) \cdot \sigma\left(\frac{g_{i,t}}{\tau_g}\right)" src="https://habrastorage.org/getpro/habr/formulas/2/20/202/202b23dda3609b73dd2a9f29a0c49104.svg" width="224" height="40" data-width="28.479" data-height="5.499" data-vertical-align="-2.184"><br></p><p>Здесь <img class="formula inline" source="s_{i,t}" alt="s_{i,t}" src="https://habrastorage.org/getpro/habr/formulas/f/fb/fb4/fb489802e97c9b28479a945f8749ca3b.svg" width="16" height="12" data-width="2.823" data-height="1.65" data-vertical-align="-0.65"> ещё не финальный вес портфеля. Это score по активу <img class="formula inline" source="(i)" alt="(i)" src="https://habrastorage.org/getpro/habr/formulas/e/ec/ec6/ec679f15073b718baac49d374fb821de.svg" width="16" height="16" data-width="2.541" data-height="2.262" data-vertical-align="-0.566">: знак отвечает за направление, модуль отвечает за силу сигнала.</p><p>Дальше эти сигналы превращаются в относительные long/short веса портфеля. Например, через рыночно-нейтральную проекцию:</p><p><br><img class="formula inline" source="u_{i,t} = s_{i,t} - \frac{1}{N}\sum_{j=1}^{N}s_{j,t}" alt="u_{i,t} = s_{i,t} - \frac{1}{N}\sum_{j=1}^{N}s_{j,t}" src="https://habrastorage.org/getpro/habr/formulas/9/97/978/97850c26f29bdb584c3153f7936205cf.svg" width="168" height="48" data-width="21.618" data-height="6.935" data-vertical-align="-2.902"></p><p><br><img class="formula inline" source="w_{i,t} = G \cdot \frac{u_{i,t}}{\sum_{j=1}^{N}\sqrt{u_{j,t}^{2}+\varepsilon}}" alt="w_{i,t} = G \cdot \frac{u_{i,t}}{\sum_{j=1}^{N}\sqrt{u_{j,t}^{2}+\varepsilon}}" src="https://habrastorage.org/getpro/habr/formulas/2/24/242/242ead01f1dfdde183f72e36caef9fd9.svg" width="200" height="48" data-width="25.756" data-height="6.808" data-vertical-align="-2.838"></p><p>где <img class="formula inline" source="(N)" alt="(N)" src="https://habrastorage.org/getpro/habr/formulas/6/6e/6e6/6e622d72b90c249c3e04aebf0eb12ca4.svg" width="24" height="16" data-width="3.769" data-height="2.262" data-vertical-align="-0.566"> это число активов, <img class="formula inline" source="(G)" alt="(G)" src="https://habrastorage.org/getpro/habr/formulas/e/e0/e0f/e0ff771ea90f1d51689441ea3343d44f.svg" width="24" height="16" data-width="3.538" data-height="2.262" data-vertical-align="-0.566"> это заданный общий gross exposure портфеля, а <img class="formula inline" source="w_{i,t}" alt="w_{i,t}" src="https://habrastorage.org/getpro/habr/formulas/9/94/943/9435e74575187b25c3878ef202e518f0.svg" width="24" height="12" data-width="3.382" data-height="1.652" data-vertical-align="-0.65"> это финальный вес актива <img class="formula inline" source="(i)" alt="(i)" src="https://habrastorage.org/getpro/habr/formulas/e/ec/ec6/ec679f15073b718baac49d374fb821de.svg" width="16" height="16" data-width="2.541" data-height="2.262" data-vertical-align="-0.566">.</p><p>Например, если <img class="formula inline" source="(G = 1)" alt="(G = 1)" src="https://habrastorage.org/getpro/habr/formulas/3/34/34a/34a1622612c26095868aff874e94ac9c.svg" width="56" height="16" data-width="7.687" data-height="2.262" data-vertical-align="-0.566">, то сумма абсолютных весов портфеля будет около 100%.</p><p>После такой нормализации положительные веса становятся long-позициями, отрицательные веса становятся short-позициями, а общий размер портфеля остаётся контролируемым.</p><p>Портфельная доходность считается уже по всей корзине активов:</p><p><br><img class="formula inline" source="gross_t = \sum_{i=1}^{N} w_{i,t-1} \cdot r_{i,t}" alt="gross_t = \sum_{i=1}^{N} w_{i,t-1} \cdot r_{i,t}" src="https://habrastorage.org/getpro/habr/formulas/5/59/59c/59cfdd922df3b8dde990dea783887877.svg" width="176" height="48" data-width="22.589" data-height="6.74" data-vertical-align="-2.804"></p><p>где <img class="formula inline" source="r_{i,t}" alt="r_{i,t}" src="https://habrastorage.org/getpro/habr/formulas/c/c1/c15/c15d81ab56679218f63a0530ba366987.svg" width="16" height="12" data-width="2.782" data-height="1.65" data-vertical-align="-0.65"> это доходность актива <img class="formula inline" source="(i)" alt="(i)" src="https://habrastorage.org/getpro/habr/formulas/e/ec/ec6/ec679f15073b718baac49d374fb821de.svg" width="16" height="16" data-width="2.541" data-height="2.262" data-vertical-align="-0.566"> на шаге <img class="formula inline" source="(t)" alt="(t)" src="https://habrastorage.org/getpro/habr/formulas/9/98/989/9891b4e1a5fb6b75333bab87dabf392f.svg" width="16" height="16" data-width="2.577" data-height="2.262" data-vertical-align="-0.566">.</p><p>Дальше учитываются комиссии, проскальзывание и стоимость ребалансировки:</p><p><br><img class="formula inline" source="\Delta w_{i,t} = w_{i,t} - w_{i,t-1}" alt="\Delta w_{i,t} = w_{i,t} - w_{i,t-1}" src="https://habrastorage.org/getpro/habr/formulas/0/03/038/0385cf0b0c0482ec5d1ccd471e393e36.svg" width="152" height="16" data-width="19.858" data-height="2.347" data-vertical-align="-0.608"></p><p><br><img class="formula inline" source="cost_t = \sum_{i=1}^{N} c_i \cdot \left|\Delta w_{i,t}\right|" alt="cost_t = \sum_{i=1}^{N} c_i \cdot \left|\Delta w_{i,t}\right|" src="https://habrastorage.org/getpro/habr/formulas/a/a7/a7b/a7b624d9d89d3540221b82e70e08f8f4.svg" width="168" height="48" data-width="21.259" data-height="6.74" data-vertical-align="-2.804"></p><p><br><img class="formula inline" source="net_t = gross_t - cost_t" alt="net_t = gross_t - cost_t" src="https://habrastorage.org/getpro/habr/formulas/d/db/db3/db3c59b7006997d2ee37ea97058feca8.svg" width="160" height="12" data-width="20.581" data-height="1.88" data-vertical-align="-0.464"></p><p>То есть <img class="formula inline" source="tanh" alt="tanh" src="https://habrastorage.org/getpro/habr/formulas/5/5c/5c0/5c0dbba3a6ee4ac0eb26cfee75ccb8b4.svg" width="32" height="12" data-width="4.674" data-height="1.595" data-vertical-align="-0.025"> не исчезает, он просто перестаёт быть финальной позицией. В single-asset версии он сразу задавал позицию, а в портфельной версии он даёт сырой сигнал по каждому активу. Финальные веса появляются уже после портфельной нормализации.</p><p>Если интересно, такую версию можно реализовать довольно прямо: заменить single-asset head на multi-asset score head, добавить слой нормализации весов и считать уже portfolio-level PnL / Sharpe с учётом комиссий, проскальзывания и оборота.</p>]]></description>
      <pubDate>Tue, 16 Jun 2026 09:53:31 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>12.04.2026 13:05:21 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1022254/#comment_29817242</guid>
      <link>https://habr.com/ru/articles/1022254/#comment_29817242</link>
      <description><![CDATA[<p>Спасибо за хороший вопрос.</p><p>По OHLCV, я не исхожу из того, что эти данные детерминированно определяют будущее. Гипотеза слабее: в них могут существовать локальные статистические зависимости и режимные асимметрии, которые проверяются только эмпирически. Объёмы здесь не "магический предиктор", а прокси ликвидности и интенсивности движения. Два положительных held-out квартала это сигнал к дальнейшей проверке, не закрытый вопрос.</p><p>Для технического обсуждения - GitHub Issues: github.com/YuriyKolesnikov/diffquant</p>]]></description>
      <pubDate>Sun, 12 Apr 2026 13:05:21 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>12.04.2026 08:17:20 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1022254/#comment_29816092</guid>
      <link>https://habr.com/ru/articles/1022254/#comment_29816092</link>
      <description><![CDATA[<p>Спасибо за вопрос по существу. <br>По первому пункту: строгого доказательства существования решения у меня нет, и я на него не претендую. Два положительных held-out квартала это эмпирический сигнал, а не теорема. Именно поэтому раздел "Ограничения" написан как принципиальная часть статьи, а не как формальная оговорка. <br>По второму: финансовая специфика здесь не в самой алгебре, а в интерпретации переменных и в постановке задачи. <em>p</em> - торговая позиция <em>(long/short)</em>, <em>r</em> - рыночная доходность, вычисленная из реальных цен, <em>cost</em> - комиссия и проскальзывание. <em>Objective</em> - коэффициент Шарпа. Именно это и делает абстрактный time-series framework торговой постановкой.</p>]]></description>
      <pubDate>Sun, 12 Apr 2026 08:17:20 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.04.2026 13:38:46 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/1022254/#comment_29813618</guid>
      <link>https://habr.com/ru/articles/1022254/#comment_29813618</link>
      <description><![CDATA[<p>Проект заточен под финансовые временные ряды, так что для food truck напрямую не подойдёт. Но дифференцируемый симулятор в теории адаптируем под любую задачу с end-to-end оптимизацией метрики.</p>]]></description>
      <pubDate>Sat, 11 Apr 2026 13:38:46 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>04.03.2026 07:56:05 </title>
      <guid isPermaLink="true">https://habr.com/ru/companies/finam_broker/articles/1005638/#comment_29616404</guid>
      <link>https://habr.com/ru/companies/finam_broker/articles/1005638/#comment_29616404</link>
      <description><![CDATA[<p>Отличный эксперимент с реальными целями - одна из первых прикладных работ в этом направлении, команде отдельная благодарность за слой исполнения.</p><p>Наши исследования схожих задач привели нас к выводу, что языковые модели как агентный подход наиболее эффективны в гибридной архитектуре, где взаимодействуют квантовые модели и ИИ-агенты.</p><p>Если проводить аналогию с Канеманом: квантовая модель это Система 1, быстрый интуитивный слой, агент это Система 2, медленный аналитический. Система 1 реагирует быстро и инстинктивно, Система 2 принимает этот контекст, обогащает его дополнительными данными и оценивает риск. Важный нюанс: в задачах прогнозирования агент быстро деградирует, но в задачах оценки риска он работает значительно лучше и таким образом эффективно «страхует» квантовую модель. </p>]]></description>
      <pubDate>Wed, 04 Mar 2026 07:56:05 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>25.09.2025 11:42:14 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28880372</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28880372</link>
      <description><![CDATA[<p>Здравствуйте!<br>В конфиге комиссия задаётся в долях, а не в процентах. Значение 0.0004 = 0.04% = 4 <em>bps</em>, что соответствует стандартным комиссиям <em>Binance</em>. Дополнительное умножение на 100 не требуется. Когда вы подставляете 0.05, то это уже 5% комиссии за сделку, что не имеет никакого отношения к реальности и естественно полностью убивает торговлю.</p>]]></description>
      <pubDate>Thu, 25 Sep 2025 11:42:14 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>15.09.2025 18:33:50 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28839868</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28839868</link>
      <description><![CDATA[<p>Спасибо за внимание к статье и отличный вопрос!<br>Хочу <strong>вас</strong> отдельно <strong>похвалить</strong> — вы сами нашли ответ на ваш вопрос. Это действительно бесценный опыт, когда человек самостоятельно разбирается в технических деталях, понимание остаётся с ним навсегда и формирует настоящий исследовательский навык.</p><p>Вы абсолютно правы, <strong><em>CCXT</em> в некоторых режимах агрегирует сделки</strong>, из-за чего поле <em>num_trades</em> может отличаться от нативных значений <em>Binance</em>. Поэтому для точных исследований я всегда рекомендую использовать оригинальные данные напрямую из <strong><em>Binance Futures API</em></strong>. Один из самых удобных способов — через библиотеку <em>python-binance</em> (<a href="https://github.com/sammchardy/python-binance" rel="noopener noreferrer nofollow">https://github.com/sammchardy/python-binance</a>, устанавливается через <code>pip install python-binance</code>). Важно учитывать, что библиотека неофициальная (<em>Binance</em> её напрямую не поддерживает), но это самый используемый и функциональный инструмент в сообществе.</p><p>Минимальный пример получения минутных свечей по фьючерсам:</p><pre><code class="python">import datetime as dt
from binance.client import Client, BaseClient
from binance.enums import HistoricalKlinesType

symbol = "*USDT"
start_dt = dt.datetime(..., tzinfo=dt.timezone.utc)
end_dt = dt.datetime(..., tzinfo=dt.timezone.utc)

klines_type = HistoricalKlinesType.FUTURES
interval = BaseClient.KLINE_INTERVAL_1MINUTE

client = Client()

data = client.futures_klines(
    klines_type=klines_type,
    symbol=symbol,
    interval=interval,
    startTime=int(start_dt.timestamp() * 1000),
    endTime=int(end_dt.timestamp() * 1000),
)

client.close_connection()
</code></pre><p>Чтобы окончательно снять сомнения, я ещё раз вручную проверил через официальный API Binance и сравнил с локальной базой проекта. <strong><em>Все данные полностью совпали</em></strong>. Для прозрачности привожу три последовательные котировки (14:45, 14:46, 14:47 UTC), включая ту, которая вызвала вопрос:</p><p><strong>=== Raw quotes ===</strong></p><pre><code>[1746456240000, '0.2720500', '0.2728000', '0.2712000', '0.2726500', '110004', 1746456299999, '29917.2349400', 557, '51011', '13887.8376800', '0']
[1746456300000, '0.2724100', '0.2732700', '0.2718400', '0.2721300', '99912', 1746456359999, '27229.3868100', 464, '41200', '11236.2752000', '0']
[1746456360000, '0.2723500', '0.2726500', '0.2719900', '0.2724700', '49486', 1746456419999, '13476.6411000', 349, '24452', '6662.0162200', '0']
</code></pre><p><strong>=== Human-readable ===</strong></p><pre><code>[Date: 2025-05-05  Time: 14:45:00] Open=0.272050, High=0.272800, Low=0.271200, Close=0.272650, Volume=110004.00, Num Trades=557
[Date: 2025-05-05  Time: 14:46:00] Open=0.272410, High=0.273270, Low=0.271840, Close=0.272130, Volume=99912.00, Num Trades=464
[Date: 2025-05-05  Time: 14:47:00] Open=0.272350, High=0.272650, Low=0.271990, Close=0.272470, Volume=49486.00, Num Trades=349
</code></pre><p>Таким образом, в бэктесте использовались именно «чистые» данные <em>Binance Futures API</em>, без сторонней агрегации.</p>]]></description>
      <pubDate>Mon, 15 Sep 2025 18:33:50 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>01.09.2025 07:30:44 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28780310</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28780310</link>
      <description><![CDATA[<p>Спасибо за интересный вопрос!<br><br>Агент действительно не учится на отдельных тикерах, а воспринимает весь рынок целиком. Это даёт ему возможность усваивать более сложные и универсальные паттерны поведения, которые затем применяются к любому активу. Когда появляется новый сигнал, агент не «знает» историю конкретной монеты — он опирается на свой общий опыт, накопленный на данных всего рынка <strong><em>Binance Futures</em></strong>.<br></p><p>Благодаря этому он способен работать даже с тикерами, у которых мало исторических данных. Когда появляется новый сигнал, агент старается найти под него оптимальную стратегию действий и, если уровень уверенности достаточно высок, принимает решение и торгует — подобно профессиональному трейдеру, который использует общие принципы и накопленный опыт, а не заученную историю конкретного актива.</p>]]></description>
      <pubDate>Mon, 01 Sep 2025 07:30:44 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>31.08.2025 18:10:57 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28778836</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28778836</link>
      <description><![CDATA[<p>Спасибо за интерес к проекту!</p><p>Подготовка данных для обучения в данном случае не является сложной задачей — вся логика и структура уже подробно описаны в статье. Реализацию <strong><em>data layer </em></strong>я оставил на усмотрение исследователей, чтобы было пространство для творчества.<br>Вы можете написать свой <strong><em>data layer</em></strong> под разные площадки (<em>Binance, Bybit, OKX</em> и др.) и тем самым реально прокачать свои навыки.</p><p>Более того, если вы будете самостоятельно активно разрабатывать подобные решения и делиться результатами с сообществом, то такой подход ускоряет прогресс и расширяет экосистему открытых инструментов.</p>]]></description>
      <pubDate>Sun, 31 Aug 2025 18:10:57 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>30.08.2025 19:18:52 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28776064</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28776064</link>
      <description><![CDATA[<p>Binance публикует офлайн-архивы сделок (trades, aggTrades) и снимков стакана (bookDepth) на data.binance.vision. Эти данные можно скачивать и использовать для исследований.</p><p>Что касается стакана.<br>Глубина заявок критична в HFT и субсекундных стратегиях, где важна микроструктура рынка. Для минутных моделей, как описано в статье, достаточно OHLCV и при желании тиковых данных, а расширенный стакан добавляет сложность и не всегда даёт прирост качества.</p>]]></description>
      <pubDate>Sat, 30 Aug 2025 19:18:52 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>30.08.2025 14:53:44 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28775324</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28775324</link>
      <description><![CDATA[<p>Благодарю за отзыв и отличный вопрос.</p><p>Что касается влияния дополнительных фич — на практике классические индикаторы теханализа (RSI, скользящие и т.п.), построенные на основе тех же ценовых рядов, редко дают прирост качества. Современные нейросетевые архитектуры уже умеют извлекать локальные и глобальные паттерны непосредственно из «сырых» OHLCV-данных. Тем не менее, я сторонник экспериментальной проверки: при грамотном комбинировании технических индикаторов и feature engineering вполне возможен прирост точности или устойчивости. Важно не ограничиваться минутными свечами, а рассматривать другие источники данных — например тиковые потоки.</p><p>Что касается <code>volume_weighted_average</code> — здесь речь идёт о VWAP (Volume Weighted Average Price). В идеальном случае это считается на тиковом уровне по формуле:</p><p><img class="formula inline" source="VWAP = \frac{\sum (price \times volume)}{\sum volume}" alt="VWAP = \frac{\sum (price \times volume)}{\sum volume}" src="https://habrastorage.org/getpro/habr/upload_files/5d4/66d/80e/5d466d80e4685011d5ed24432acf3d89.svg" width="310" height="58"></p><p>В нашем случае доступны только минутные <em>OHLCV</em>-свечи, поэтому применяется упрощённый вариант — усреднение по (Open, High, Low, Close). Это приближение, которое позволяет хотя бы частично сохранить информацию о «средней цене сделки» в рамках свечи. Если у вас есть доступ к тиковым данным, всегда стоит использовать точный расчёт.</p><p>По поводу мониторинга: агент онлайн отслеживает <strong>все активные фьючерсные контракты Binance Futures</strong> со статусом <em>TRADING</em>. На текущий момент (30.08.2025) это 521 тикер. Действительно, прибыльные возможности возникают преимущественно на волатильных рынках, но фильтрация делается уже на этапе обработки сигналов. Ошибочные входы случаются — их стоимость контролируется встроенным риск-менеджментом. Это обязательный элемент любой продакшен-системы: ошибки неизбежны, но важно, чтобы они стоили кратно меньше, чем приносят прибыльные сделки.</p>]]></description>
      <pubDate>Sat, 30 Aug 2025 14:53:44 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>26.08.2025 15:43:41 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28757324</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28757324</link>
      <description><![CDATA[<p>В предыдущем ответе в псевдокоде при расчёте волатильности была опечатка.<br>Правильный вариант:</p><pre><code>avg_volatility = mean( |Close[i+10] - Close[i]| / Close[i] for i in [t-90 .. t-10] )
</code></pre><p>Это гарантирует, что волатильность рассчитывается только на 90-минутном предшествующем участке, без захвата импульсного окна.</p>]]></description>
      <pubDate>Tue, 26 Aug 2025 15:43:41 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>26.08.2025 08:16:05 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28755050</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28755050</link>
      <description><![CDATA[<p>Спасибо за вопрос!</p><p><strong>Обучение именно на высоковолатильных сегментах рынка не является «общепринятой практикой»</strong>, <em>но у этого подхода есть очевидные преимущества</em>.<br>Так мы исключаем длительные флетовые участки, которые не несут информации для обучения, и тем самым снижаем уровень противоречивых сигналов. Часто рынок может демонстрировать схожее поведение с диаметрально разными исходами — это создаёт у агента высокий уровень неопределённости. Отбор по волатильности позволяет концентрировать обучение на ключевых аномалиях, давая агенту более разнообразные паттерны и повышая устойчивость стратегии к новым данным.</p><p><br><strong>Что касается отбора локальных окон</strong> — в проекте предусмотрена гибкая конфигурация: можно менять длину исторического контекста, длительность торговой сессии и набор используемых каналов данных.<br>Однако сам <strong><em>процесс первичного формирования датасетов</em></strong> (например, под другие биржи или иные условия) действительно остаётся на стороне исследователя: описанная в статье логика легко переносится и может быть реализована в отдельном data layer.</p><p><strong>Теперь про 10-минутное окно.</strong> Оно не входит в предшествующее 90-минутное окно «тишины». Алгоритм работает так:</p><ol><li><p>Сначала скользящим окном ищется 10-минутный отрезок с изменением цены ≥ 5%.</p></li><li><p>Если условие выполняется — мы берём 90 минут, предшествующих началу этого окна, и проверяем их на отсутствие сильных движений (контрастность).</p></li><li><p>Только если обе проверки пройдены — событие фиксируется как сигнал, и формируется финальная 150-минутная сессия (90 мин до + 60 мин после).</p></li></ol><p>Псевдокод:</p><pre><code>for each index t in close_prices:
    # проверяем 10-минутное окно на сильный импульс
    change = (Close[t+10] - Close[t]) / Close[t]
    if |change| &gt;= MinAbsChange:

        # считаем среднюю волатильность за 90 минут до начала этого окна
        avg_volatility = mean( |Close[i+10] - Close[i]| / Close[i] for i in [t-90 .. t] )

        if avg_volatility * ContrastCoeff &lt; |change|:
            record signal at time (t+10)
</code></pre><p>Таким образом, итоговое окно состоит из 90 минут контекста (без резких движений), за которыми следует 60-минутная торговая сессия, начинающаяся сразу после обнаруженного импульса.</p>]]></description>
      <pubDate>Tue, 26 Aug 2025 08:16:05 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>13.08.2025 04:41:21 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28699492</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28699492</link>
      <description><![CDATA[<p>Спасибо за вопрос. Выбранные параметры в проекте — это не жёсткие константы, а демонстрационный пресет. Проект изначально сделан так, чтобы вы могли строить свой <strong><em>data layer,</em></strong> подставлять любые значения и тестировать разные комбинации.</p><p>Направления для экспериментов:</p><ol><li><p><strong>Порог волатильности</strong>: ниже — больше сигналов и выше чувствительность, но больше шума; выше — сигналы реже, но чище.</p></li><li><p><strong>Окно волатильности</strong>: короче — реакция быстрее, но больше ложных входов; длиннее — меньше шум, но медленнее реакция.</p></li><li><p><strong>Длина сессии</strong>: короче — чаще сброс контекста; длиннее — больше истории, полезно для трендов.</p></li></ol><p>Мой выбор — лишь пример для демонстрации работы пайплайна. Оптимальные значения зависят от ваших целей. Генерируйте гипотезы, проверяйте их и делитесь результатами — проект создан именно для этого.</p>]]></description>
      <pubDate>Wed, 13 Aug 2025 04:41:21 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>12.08.2025 12:06:58 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28696822</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28696822</link>
      <description><![CDATA[<p>Для удобства добавил в репозиторий утилиту для просмотра <strong><em>top-N</em></strong> лучших триалов <strong><em>Optuna</em></strong> (не только одного победителя). Это помогает выбирать конфигурацию под свой риск-профиль (например, меньше сделок, но выше точность).</p><p>Команда:</p><pre><code class="bash">python get_info_from_optuna.py configs/alpha.py --n-best-trials 10
</code></pre><p>Все результаты автоматически сохраняются в той же папке рядом с файлом исследования: <code>output/cfg_name/optuna_cfg_optimization_results/</code> —&gt; как <code>best_&lt;N&gt;_trials_&lt;metric&gt;.txt</code> и <code>.csv</code>.</p>]]></description>
      <pubDate>Tue, 12 Aug 2025 12:06:58 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>11.08.2025 09:06:57 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28691594</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28691594</link>
      <description><![CDATA[<p><em>Коротко:</em> <strong>«утечки из будущего» -&gt; нет</strong>. </p><p>Я не делаю сессионную нормализацию по окну 150 минут. Per-канальные <em>mean/std</em> считаются один раз <strong>только по train-сету</strong>, <strong>фиксируются и</strong> <strong>применяются</strong> к любому наблюдению на <em>val / test / backtest / онлайне</em>. Каждое состояние в момент времени <img class="formula inline" source="t" alt="t" src="https://habrastorage.org/getpro/habr/upload_files/437/0c7/316/4370c73163b18e726a0148f4f95311c6.svg" width="8" height="18"> строится <strong>каузально</strong> из последних <img class="formula inline" source="N" alt="N" src="https://habrastorage.org/getpro/habr/upload_files/e93/ff5/9dc/e93ff59dc8413a72373cf72365078e8e.svg" width="20" height="19"> минут до <img class="formula inline" source="t" alt="t" src="https://habrastorage.org/getpro/habr/upload_files/81e/218/829/81e218829d2c7961817672b6ed6d4269.svg" width="8" height="18">; будущие данные в расчёт не попадают.</p><p>Разберем по пунктам:</p><ul><li><p><strong>Никакой “150-минутной” z-нормализации.</strong> Статистики нормализации не считаются «по текущей сессии» и не знают о её пост-сигнальной части. Это базовый продакшн-паттерн: единое масштабирование, замороженное на train.</p></li><li><p><strong>Кауза соблюдена.</strong> Сначала формирую историческое окно до <img class="formula inline" source="t" alt="t" src="https://habrastorage.org/getpro/habr/upload_files/f4b/61a/851/f4b61a85148b9fcddf6483daf835f570.svg" width="8" height="18">, затем <strong>apply_normalization(...)</strong> применяет <strong>train-статистики</strong>, и только после этого добавляются экстра данные (позиция, <em>unrealized PnL, elapsed/remaining time, one-hot</em> история действий).</p></li><li><p><strong>“В реальной торговле таких данных не получить”.</strong> Это неверная предпосылка, как раз наоборот: в онлайне используются <strong>предварительно посчитанные train-статистики</strong>, а не «динамические» <em>stats</em> по текущему окну. Это исключает дрейф масштабирования и исключает <em>leakage</em>.</p></li><li><p><strong>Про “отрезание первых 90 минут”.</strong> Резать ни в коем случае ничего не надо: <em>stats</em> не считаются по индивидуальному 150-минутному эпизоду в принципе. Даже если искусственно пересчитать <em>mean/std</em> только по первым 90 минутам каждой сессии и перегнать оценку, разница в метриках окажется в пределах статистического шума; выигрыша от такой «локальной» нормализации нет, а стабильность хуже.</p></li><li><p><strong>RL ≠ SL.</strong> Здесь нет таргетов как в обучение с учителем (возможно именно этот момент вашего опыта в SL пробудил в вас сомнения), которые можно «подсмотреть». Агент видит только историю до <img class="formula inline" source="t" alt="t" src="https://habrastorage.org/getpro/habr/upload_files/bc3/998/888/bc3998888de549719a61c96818b5f0c8.svg" width="8" height="18">, получает <em>reward</em> каузально по шагам, а нормализация выполняет сугубо инженерную функцию — стабилизацию входов под фиксированные train-масштабы.</p></li></ul><p><strong>Дополнительно</strong>: <em>для онлайна именно такая схема (фиксированные train‑stats) и применяется в индустрии: она устойчива и корректно переносится в продакшн‑поток без «онлайн‑оценок будущего».</em></p>]]></description>
      <pubDate>Mon, 11 Aug 2025 09:06:57 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.08.2025 15:21:40 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28688314</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28688314</link>
      <description><![CDATA[<p>В проекте, описанном выше, используется <strong>модель исполнения</strong>, приближённая к рыночным ордерам: вход осуществляется по цене закрытия минуты, на которой зафиксирован сигнал, с учётом заданного проскальзывания (±0.05%) и комиссии (0.04%). Это стандартная практика в исследовательских <strong><em>backtest</em></strong>-платформах, где <strong>цель — проверка стратегии принятия решений</strong> на минутном таймфрейме, а <strong>не симуляция</strong> <strong><em>HFT</em></strong> с тиковой глубиной стакана.</p><p>Агент <strong>не “покупает по цене из прошлого”</strong> — момент принятия решения и входа синхронизированы. Проскальзывание моделирует разрыв между последней сделкой и лучшим bid/ask на момент исполнения, что даёт усреднённо реалистичный результат без необходимости хранения L2/L3 данных.</p><p>В реальном исполнении система использует отдельный <strong><em>Execution Layer</em></strong>, который работает по логике, исключающей описанные вами риски:</p><ul><li><p>Подключение к <strong><em>Binance Futures WebSocket</em></strong> через <code>ThreadedWebsocketManager</code> для получения ценовых данных в режиме высокой частоты.</p></li><li><p>Фиксация решения агента о входе → поиск лучшей цены в стакане для лимитного ордера.</p></li><li><p>Если лимитный ордер не исполняется в заданный временной интервал — ордер отменяется (<code>_clean_orders()</code>), чтобы избежать входа по невыгодной цене.</p></li><li><p>Возможность переключения на рыночный ордер для гарантированного входа, если торговая логика в конкретной стратегии это предусматривает.</p></li></ul><p>Пример кода <strong><em>Execution Layer</em></strong>:</p><pre><code class="python"># Инициализация WebSocket
self._web_socket = ThreadedWebsocketManager(
  api_key=cfg.BINANCE_API, 
  api_secret=cfg.BINANCE_SECRET, 
  testnet=cfg.USE_TESTNET
)

# Подписка на поток котировок
self._web_socket.start_kline_futures_socket(
    callback=self._get_update_event_by_stream(ticker),
    symbol=ticker_name,
    interval=KLINE_INTERVAL
)

# Логика ордера
# ...
self._clean_orders()
position_values, prices = self._get_position_values_and_prices(req_pos)
# …выставление нового лимитного ордера по лучшей цене
</code></pre><p>Таким образом:</p><ul><li><p>В <strong><em>backtest</em></strong> мы моделируем немедленное исполнение по рынку с параметрами, отражающими усреднённые издержки <strong><em>Binance Futures</em></strong>.</p></li><li><p>В боевой системе <strong><em>Execution Layer</em></strong> обеспечивает динамическое размещение и отзыв лимитных ордеров в реальном времени, либо немедленное исполнение по рынку.</p></li><li><p><strong><em>Проблема «зависших» ордеров или исполнения по цене, которая уже ушла, в системе не существует.</em></strong></p></li></ul><p>Это полноценный инженерный контур исполнения, а не теоретическая модель. </p><p><em>Вопрос “</em><strong><em>что будет делать агент</em></strong><em>” в подобных случаях имеет конкретный ответ — он либо обновляет лимитный ордер по лучшей цене, либо отказывается от сделки, либо входит по рынку в зависимости от заложенной политики риска.</em></p>]]></description>
      <pubDate>Sun, 10 Aug 2025 15:21:40 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>10.08.2025 12:24:11 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28687528</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28687528</link>
      <description><![CDATA[<p>Спасибо за вопрос — разберу механику на примере этого графика.</p><p>Вертикальная пунктирная линия — это момент фиксации высоковолатильного импульса по процедуре, описанной в разделе «Данные» статьи. До этого момента агент не торгует.</p><p>В проекте используются <em>минутные</em> котировки <em>OHLCV</em>. Полная свеча за минуту <img class="formula inline" source="t" alt="t" src="https://habrastorage.org/getpro/habr/upload_files/6ca/1a5/124/6ca1a512406d0c071fa3a47b8f596ac7.svg" width="8" height="18"> загружается сразу после её закрытия.</p><p><strong>Дальнейший алгоритм:</strong></p><ol><li><p>Минута <img class="formula inline" source="t " alt="t " src="https://habrastorage.org/getpro/habr/upload_files/33a/266/24a/33a26624a700290d3b0a2045d0a91b14.svg" width="8" height="18">закрылась → в систему поступает её <em>OHLCV</em>.</p></li><li><p>Формируется входное состояние из последних <em>N</em> минут истории (в зависимости от конфигурации).</p></li><li><p>Агент принимает решение.</p></li><li><p>При открытии позиции исполнение моделируется по цене <strong>закрытия этой же минуты </strong><img class="formula inline" source="t" alt="t" src="https://habrastorage.org/getpro/habr/upload_files/1a3/ae9/eb5/1a3ae9eb58fae1bb511f716c154b486d.svg" width="8" height="18"> с учётом параметров среды: <em>slippage ±0.05%</em> и <em>taker-fee 0.04%</em>.</p></li></ol><p>В данном примере сигнал был зафиксирован 2025-01-10 08:56 <em>UTC</em> (индекс 10 на оси времени). Вход в позицию происходит по цене закрытия минуты возникновения сигнала ≈ 0.65, скорректированной на проскальзывание и комиссию. Дальнейшее движение до ~0.78 относится уже к последующим минутам удержания позиции.</p><p>Таким образом, агент не «покупает по цене из прошлого» и не ждёт ещё одну минуту: <strong><em>решение и исполнение синхронизированы с моментом появления полной минутной котировки</em></strong>. Именно эти цены учитываются в расчёте <strong><em>PnL</em></strong> и визуализациях действий агента.</p>]]></description>
      <pubDate>Sun, 10 Aug 2025 12:24:11 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>08.08.2025 09:26:55 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28678920</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28678920</link>
      <description><![CDATA[<p>Хороший вопрос.</p><p>Этот проект не относится к категории «установил и начал зарабатывать». Он изначально задумывался как <strong>исследовательская платформа,</strong> которая имитирует реальную торговлю с учётом всех ключевых факторов: комиссий, проскальзываний, ограниченной наблюдаемости и меняющихся рыночных условий.</p><p>Его цель — показать, как можно построить архитектуру, способную учиться принимать решения в среде, где ошибки стоят дорого. Здесь можно экспериментировать с агентами, менять модели, тестировать гипотезы, добавлять новые типы данных — но всё это уже на базе готового, воспроизводимого фреймворка с прозрачными метриками и бэктестом.</p><p>Если задача — просто «запустить и заработать», то рынок не прощает такой простоты. Но если цель — понять механику и выстроить систему, которая выдерживает реальную рыночную динамику, то это именно тот фундамент, с которого стоит начинать.</p>]]></description>
      <pubDate>Fri, 08 Aug 2025 09:26:55 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

  
    <item>
      <title>07.08.2025 17:20:36 </title>
      <guid isPermaLink="true">https://habr.com/ru/articles/934258/#comment_28675908</guid>
      <link>https://habr.com/ru/articles/934258/#comment_28675908</link>
      <description><![CDATA[<p>Спасибо, ценю ваш отклик. Рад, что проект оказался вам интересен.</p>]]></description>
      <pubDate>Thu, 07 Aug 2025 17:20:36 GMT</pubDate>
      <dc:creator><![CDATA[]]></dc:creator>
    </item>
  

      

      

    
  </channel>
</rss>
