Inspiration
We loved the idea of having an objective evaluation of our hackathon project, and also being able to spend our full brain-power on backend code, not having to worry about frontend-backend integration. We also wanted to learn more about portfolio management and trading.
What it does
Our bot consists of three complementary components:
Sentiment-Driven News Trader
We built two versions: a deterministic classifier (zero-shot text classification + FinBERT) and a multi-ticker LLM-based sentiment model. Each news item is classified as bullish, bearish, or neutral for each of the five root tickers. The strategy places directional trades and updates a persistent per-ticker “sentiment bias.” For the deterministic classifier we also trained a logistic regression model on (log_returns, sentiment_p) pairs we got from our backtesting dataset, and got decent accuracy values for each ticker that allowed us to bin the data based on our historic sentiment log odds and classify new ones on-the-fly. This allows us to get an edge over just using simple sentiment analysis.Bias-Aware Avellaneda–Stoikov Market Maker We developed an extended AS market making engine that adapts spreads, sizes, and reservation prices dynamically based on volatility, inventory, and sentiment bias. When bullish news arrives, the MM shifts its quotes upward; when bearish news arrives, it shifts downward. This allows the system to both capture the spread and position for short-term directional moves that occur in the 5-15 seconds after news hits.
Lightweight Statistical Arbitrage
We tested short-horizon mean-reversion and cointegration-based signals to complement the other two engines and provide baseline stability.
Together, the three approaches reinforce one another: the news signal provides direction, the MM captures spread and handles fills safely, and the stat-arb layer stabilizes returns.
How we built it
We designed a modular architecture in Python using Optiver’s exchange interface.
The news strategy computes sentiment and exposes a get_bias(root) API. The AS market maker reads this bias on every step and adjusts quotes accordingly.
We engineered safe quoting logic (no crossing, inventory-aware sizing, rate limiting), integrated real-time volatility estimates, and added decay, clipping, and normalization to keep the system stable.
We also built a full backtesting pipeline from scratch. Throughout the weekend, we continuously pulled all market data from Optibook and stored it locally. This allowed us to replay any segment of the challenge environment and run our strategies offline. As a result, we could iterate safely, benchmark variants, tune hyperparameters, and identify failure modes without relying exclusively on the live environment.
Challenges we ran into
- Balancing multiple strategies: avoiding situations where arbitrage, news trades, and market making interfered with each other
- Preventing crossed quotes, and handling leftover resting orders correctly
- Integrating sentiment without causing runaway inventory: early versions overreacted to news and violated position limits
- Managing volatility and spread dynamics
- Latency and request limits: keeping quote updates efficient under a strict 25-requests/second limit
Accomplishments that we're proud of
- Implementing a robust and extensible Avellaneda–Stoikov market maker with bias integration
- Building a multi-ticker LLM sentiment classifier that works reliably in real time
- Creating good internal documentation along the way + managing the team effectively.
- Sticking and growing together even more as a team
What we learned
- A lot about portfolio management
- Trading algorithms
- How different strategies interact in a unified trading engine
- Creating the backtesting framework theoretically allows us to accelerate development and improve reliability, however we didn't have enough time to check all our strategies against the data yet.
What's next for TUM.ai Dreamteam
- Sleep, a McFlurry, cats, and puppies.
Built With
- optibook
- python

Log in or sign up for Devpost to join the conversation.