В началото на 90-те години на миналия век мрежата По това време Чикаго беше основният център за търговия с фючърси, докато Ню Йорк се занимаваше с акции.Редовните маршрути взеха отклонения, които добавиха десетки километри, но новият кабел намали латентността от ~17 до ~13 милисекунди. Инвестиране Инвестиране За високочестотната търговия тези 3-4 ms бяха огромно предимство.Който е видял данните малко по-рано, можеше да постави поръчки първо и да вземе ликвидността.Достъпът до линията струваше милиони долари годишно, но се изплати - милисекунди буквално се превръщат в пари. Ако фирмите бяха готови да похарчат стотици милиони само за 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 Херон "Каква ще бъде цената на акциите на 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 и увеличаване на ограничени данни Второто голямо предизвикателство е липсата на данни.Вземете акциите на Apple, например.Ако вземете проби от цените веднъж в секунда, ще завършите с нещо като 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, вариационни автокодери. Например, в статията „Генерация на синтетични финансови времеви серии чрез дифузионни модели“ се описва метод, при който сериите от книги за поръчки се трансформират в пространство на вълни, генерирани чрез 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.