На початку 2000-х років розширювалися мережі У той час Чикаго був основним центром для торгівлі фьючерсами, а Нью-Йорк займався акціями.Регулярні маршрути брали повороти, які додали десятки кілометрів, але новий кабель скоротив затримку з ~17 до ~13 мілісекунд. інвестували інвестували Для високочастотної торгівлі ці 3-4 мс були величезною перевагою. Хто бачив дані трохи раніше, міг поставити замовлення спочатку і захопити ліквідність. Якщо фірми були готові витратити сотні мільйонів тільки на 3-4 мілісекунди, уявіть собі краю моделі ML, яка не реагує (навіть якщо миттєво), але насправді передбачає рух ринку. Якщо така модель коли-небудь існувала, ринок відразу помітив би. Отже, чому ми не бачимо публічних історій успіху ML у фінансах? Ви можете подивитися на це двома способами. Один з них полягає в тому, що результати існують, але не діляться. Іноді ви побачите папір з хорошими цифрами, але вони рідкісні і зазвичай вибираються з вишні. Інший полягає в тому, що існують реальні перешкоди. Фінансові дані просто важче працювати з даними в інших областях, в основному з трьох причин: Занадто багато шуму недостатньо даних Постійно змінюються ринки Ця комбінація робить фінансові дані дуже відмінними від погодних даних, де шум нижчий, тому що система слідує законам фізики, дані рясні завдяки супутникам і датчикам, які виробляють терабайти спостережень щодня, а основна фізика залишається стабільною, так що навіть старі дані залишаються корисними. Для кожної з цих проблем у фінансах існують відомі виправлення. Я перейду через них нижче. Проблема полягає в тому, що вони працюють тільки в ізоляції. Як кажуть, можна вибрати тільки два. Reducing noise with filters and aggregation Зменшення шуму за допомогою фільтрів та агрегації Фінансова серія приходить з слабким сигналом, похованим в шумі. Ціни коливаються кожну секунду - новини, чутки, рухи великих гравців. Навіть прості посилання, такі як "хороші новини → ціна зростає" часто розриваються. Існує два основних джерела шуму: The first source of noise is a The core issue is not the magnitude of the noise itself, but the weakness of the signal: meaningful price movements are usually fractions of a percent, while random swings can easily reach several percent. As a result, the share of informative changes within the overall data stream is extremely small. weak signal-to-noise ratio. According to the Efficient Market Hypothesis, prices already reflect all available information from news — which is exactly what we typically aim to predict. However, markets also include whose actions generate additional noise. uninformed participants Noise filtering Noise filtering via FFT remains a staple tool. The approach decomposes a time series into frequency components: low frequencies capture the underlying trend, while high frequencies represent noise. By discarding the high-frequency parts and reconstructing only the low-frequency component, we obtain a smoothed signal that’s much easier to model. (The high-frequency remainder can still serve for volatility estimation if needed.) was able to augment classical computing workflows to better unravel hidden pricing signals in noisy market data than standard, classical-only approaches in use by HSBC, resulting in strong improvements in the bond trading process. IBM Heron Heuristics and reframing the problem Noise from market participants is handled differently. One useful trick is to reframe the question itself. Instead of asking you can ask: “What will Apple’s stock price be one second from now?” “What will it cost to buy 1 share?” “What will it cost to buy 100k shares?” In the second case we predict the average price for a large volume, and that is much more stable and better reflects market movement. def avg_price(order_book, volume): taken, cost = 0, 0 for price, avail in order_book: take = min(avail, volume - taken) cost += take * price taken += take if taken >= volume: break return cost / taken Example: the averaged price for 100k shares y = avg_price(order_book, 100_000) Компанія IBM Heron «Яка буде ціна акцій Apple за одну секунду?» When More Volume Means More Noise Однак існує і зворотний ефект: іноді враховуючи Порівняйте дві графіки: вони показують середні ціни BTCUSDT на Binance, зважені за різними обсягами торгівлі. У першому випадку графік, зважений на обсяг в 50 мільйонів доларів, виглядає «менш шумним» – це сталося під час швидкого падіння ціни. У другому випадку, однак, однакова зважена середня показує набагато більше «навмисних» стрибків. Це сталося тому, що під час більш спокійного періоду ціни учасники частіше рухали свої великі замовлення глибше в книзі замовлень, що, у свою чергу, вплинуло на зважену середню ціну. більше Це може здатися дивним: якщо просто порахувати кількість змін для кожного з цих трьох показників за період з 22 серпня по 22 вересня, ви фактично отримуєте збільшення даних при «середньому» оцінці ціни. P1_1_market_hits.csv: 2 374 605 точок даних P2_500k_market_hits.csv: 51,309,973 точок даних P3_50m_market_hits.csv: 133,191,896 точок даних Справа в тому, що в середньому іноді все може погіршитися, однак попереджати можна заздалегідь. Smarter Targets Beat Raw Prices Інший спосіб «зменшити шум» і «допомогти ML» полягає в тому, щоб переформулювати саму мету прогнозування, середняючи шум з плином часу. Більш міцним є: Це вирішує дві проблеми одночасно: "Давайте передбачимо точну ціну за 10 секунд відтепер". «Прогнозуємо середню вартість за обсягом протягом наступних 10 секунд». If a price jump occurs within those 10 seconds, the exact moment doesn’t matter as much — averaging smooths it out. The algorithm therefore has fewer ways to fail. Secondly (and here we get a bit more mathematical), averaging the target also reduces the average penalty the model receives during training for “wrong predictions.” In the simplest case of a regression model, the loss is proportional to (y^* - y)^2, where y^* is the “true answer” and y is the model output. The larger the error, the quadratically higher the penalty. Now, suppose that over the next 10 seconds the price trend is generally upward, but at some random moment there is a brief downward spike. The model would have to predict that spike, otherwise it gets penalized. But in reality, we don’t care much about that random blip — what we want the model to capture is the overall upward movement.\ Як приклад: на графіку ми порівнюємо середнє значення за 1 секунду проти 10 секунд. 10-секундну мету набагато простіше передбачити, принаймні для простої регресії - тому що в ній міститься набагато менше випадкового шуму. Don’t Predict Price, Predict the Crowd Іноді розумніше передбачати не саму ціну, а реакцію натовпу. Технічні закономірності, такі як "голова і плечі", можуть не мати наукової строгості - однак, якщо достатньо трейдерів в них вірять і діють, ціна насправді рухається. Іншими словами, якщо ви «натякаєте» на модель ML, що саме ми шукаємо в даних (наприклад, випадки, коли учасники ринку намагаються завершити певну модель технічного аналізу), модель дізнається набагато ефективніше. Bootstrapping and augmenting limited data Bootstrapping та збільшення обмежених даних Якщо ви вибираєте ціни раз на секунду, ви в кінцевому підсумку отримаєте щось на кшталт 60 разів × 60 разів × 8 торгових годин × 5 днів на тиждень × ~ 50 тижнів (за винятком свят) ≈ 7 200 000 пунктів на рік - нижче 10 мільйонів. Звичайно, є дані HFT, де щось відбувається кожні мілісекунди, але це тільки приносить назад першу проблему: тонни шуму і дуже мало фактичного сигналу. В основі машинного навчання лежить статистика, а статистика має трюки для роботи з невеликими зразками. Bootstrapping Ідея проста: скажімо, що у вас є 100 спостережень, але ви хотіли б 1000. Ви неодноразово приймаєте випадкові піднабори — наприклад, 50 елементів кожен — і обчислюєте статистику. Кількість можливих комбінацій «100 вибирайте 50» величезна. Зловживання полягає в тому, що для часової серії це ледве працює — ви не можете просто розрізати послідовність на шматки, не втрачаючи хронології.Ось чому класичний bootstrapping рідко використовується для прогнозування цін.Але в завданнях, таких як аналіз 100 торговельних угод, його можна застосувати: ви можете в середньому перевищувати оригінальну сотню, або побудувати кілька випадкових піднаборів 50 і в середньому ці результати. Data augmentation Друга стратегія полягає в штучному розширенні набору даних. На зображеннях це просто: обертатися, спотворювати — і ви отримуєте новий приклад. У тексті теж. З фінансами це складніше, але деякі трюки все ще працюють. Простий приклад: якщо модель тренується тільки на ринку биків, вона завжди запропонує «купити». Як тільки ринок повертається вниз — починаються втрати. перетворення зростання в спад, перетворювати покупки на продажі, Перетворюємо хороші новини на погані. Алгоритм вчиться на таких сценаріях і починає продавати на падінні ринку. Synthetic trade generation is a that still has many open questions field Поле Поле Підхід відносно простий: візьміть реальні торгівлі, приєднайте їх до розподілу (або набору розподілів), а потім візьміть зразок з цього розподілу, щоб отримати додаткові синтетичні дані.Але ключовою проблемою залишаються хвости розподілу (жирні хвости) - рідкісні, але великі події. Останні дослідження все частіше спираються на генеративні моделі: дифузійні моделі, GAN, варіаційні автокодери. Наприклад, стаття «Генерація синтетичних фінансових часових серій за допомогою дифузійних моделей» описує метод, при якому серії книг замовлень перетворюються в простір wavelet, що генерується за допомогою DDPM, а потім перетворюються назад у часові серії. Іншим прикладом є TransFusion, яка поєднує в собі архітектури дифузії та трансформатора для створення довгих синтетичних серій часу високої вірогідності. Головне завдання полягає в узгодженні двох вимог: з одного боку, збереження стилізованих фактів ринку (жирний хвіст, скупчення волатильності, автокореляції тощо), а з іншого, уникнення надсинтетичних артефактів. на сьогоднішній день немає універсальної моделі в літературі, яка надійно відтворює всі статистичні властивості. Time shifts Є також техніка зміщення часу: використовуючи ті ж дані, але з затримкою. Проблема полягає в тому, що легко випадково «подивитися в майбутнє» (пристрасть попереду). Це класична інженерна помилка: набір тренувань закінчується з даними, які повинна передбачити модель. Інша техніка - це зміни часу: повторне використання тих самих даних з затримкою.Головна проблема тут полягає в ризику введення упередження - класична інженерна помилка, де набір тренувань випадково містить саме ті дані, які модель повинна передбачити.На графах це часто здається переконливим, але на живих ринках це швидко впаде. Корисною аналогією є погода: якщо зараз дощ, то ймовірність того, що він продовжить дощу, висока. Але прогнозуючи дощ, коли всі вже несуть парасольки, додається мало цінності. Торгівля працює аналогічним чином: коли тільки що відбувся великий рух цін, наступний крок також, ймовірно, буде великим. ** Адаптація до мінливих ринків за допомогою ансамблів та розсувних вікон **Третя проблема – ринки поводяться як Дикий Захід. Все швидко змінюється. Ви могли б сказати: “Давайте попрацювати тільки на свіжі дані з останніх кількох місяців.” Ensembles Один практичний підхід - це ансамблі. Ви тренуєте кілька моделей: one on the most recent days or weeks, another on the entire history, a third on some mid-range horizon. and a fourth that focuses on special cases — for example, detecting noise patterns or technical-analysis formations, as discussed earlier. Then you aggregate their predictions (e.g., by averaging, or taking the min/max). This is a standard trick for dealing with heteroscedastic data — where the distribution is non-stationary and constantly shifting. Markets are exactly that kind of case. pred1 = model_recent.predict(x) pred2 = model_history.predict(x) pred3 = model_midterm.predict(x) final = np.mean([pred1, pred2, pred3]/ # final = np.max([pred1, pred2, pred3]) The idea is that the market may change tomorrow, but some of the old information is still useful. Averaging helps smooth out these distortions. Sliding windows Another technique is training on sliding windows. Take the last 7 days, predict the next one. Then shift the window: add new data, drop the old. The model keeps updating, allowing it to adapt to new market regimes. window = 7 for t in range(window, len(data)): model.fit(data[t-window:t]) pred = model.predict(data[t]) So why is there no universal ML for trading? So, each of the three problems can be solved on its own, but together they don’t add up to a universal solution. One reason is the lack of quality feedback for training models. In finance, you don’t have the usual ML metrics like accuracy or F1-score. The only metric is money made. Imagine two hedge funds. One shows average returns, the other twice as high. If someone consistently outperforms the rest, everyone immediately assumes it’s a scam. Why? First, because nothing like that shows up in the market — other participants don’t feel like someone is “skimming” them on every trade. Second, there’s the survivor bias. Classic example: take a thousand people, half go long on oil, half go short. The next day, half of them are right. From the remaining 500, split again, and repeat for several rounds. After ten days, you’ll have one “genius” who made the right call ten times in a row. But in reality, he was just lucky — the illusion comes from starting with a thousand players. This is the core problem of verification. There isn’t much data to train on, and there’s even less to validate results. Even if we could see trades from a fund that outperforms the market twofold, over a relatively short horizon we still wouldn’t be able to tell luck from real skill. A good example is the many “one-day wonders” — funds or companies that show great returns when the overall market is going up (say, during an S&P 500 rally). But as soon as conditions turn south, their performance collapses. Over the long run, there are indeed legendary cases like the Medallion Fund. They consistently beat the market, delivering returns above so-called risk-free bonds. But the edge isn’t by orders of magnitude — it’s a few percentage points. To do better than them means being ahead by fractions of a percent, sustained over a very long horizon. The reality is that few funds survive long enough to prove such stability. Over six months, almost anyone can “look like a genius” if they get lucky — that’s the classic survivor bias. And not surprisingly, it’s exactly this illusion that a lot of flashy marketing campaigns for “successful” funds are built on. The philosophical takeaway is a harsh one: an algorithm can’t be called successful until it’s been tested by time. Even if it’s profitable on average, in real life it can get wiped out in a single day with a million-dollar drawdown — simply because you don’t have an extra million lying around to survive that day.