<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Frank Tore</title>
    <description>The latest articles on DEV Community by Frank Tore (@franktore).</description>
    <link>https://dev.to/franktore</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4024556%2F74ad06ac-ca53-4daa-8275-9bd24289515e.jpg</url>
      <title>DEV Community: Frank Tore</title>
      <link>https://dev.to/franktore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/franktore"/>
    <language>en</language>
    <item>
      <title>Porting physics to finance: How I learned market mechanics by building a trading simulator</title>
      <dc:creator>Frank Tore</dc:creator>
      <pubDate>Tue, 21 Jul 2026 10:53:43 +0000</pubDate>
      <link>https://dev.to/franktore/porting-physics-to-finance-how-i-learned-market-mechanics-by-building-a-trading-simulator-250o</link>
      <guid>https://dev.to/franktore/porting-physics-to-finance-how-i-learned-market-mechanics-by-building-a-trading-simulator-250o</guid>
      <description>&lt;p&gt;A few weeks ago, a friend asked me a question that perfectly summed up the current state of tech:&lt;/p&gt;

&lt;p&gt;"So, did you build a trading bot yet? Everyone has one now. Mine hasn't started earning yet, but soon... oh, very soon."&lt;/p&gt;

&lt;p&gt;My immediate, instinctive thought was: Nope. I’m not building a trading bot.&lt;/p&gt;

&lt;p&gt;Right now, the internet points you in exactly one direction: wrap a Python script around an LLM, write a moving-average crossover strategy, hook it up to a broker API, and wait for the passive income. &lt;/p&gt;

&lt;p&gt;Trusting a generic momentum script with live execution seemed like a great way to aggressively automate losing money.&lt;/p&gt;

&lt;p&gt;But that conversation planted a seed. I didn't want a "bot." But what about a systematic copilot?&lt;/p&gt;

&lt;p&gt;So, I didn’t build a trading bot - I built a lab where a physics-style equilibrium has to earn its keep against daily market data, on paper, before anyone trusts it with money.&lt;/p&gt;

&lt;p&gt;I don't have a background in finance, but I know mathematics and backend architecture. I wanted to see if I could take a mental model from a completely different industry, port it over, and test it against the European ETF market.&lt;/p&gt;

&lt;p&gt;The result is FunTrade - an open-source, paper-first, long-only daily research simulator for UCITS mutual funds and ETFs. No on-chain crypto trading, no HFT, and no broker hooks.&lt;/p&gt;

&lt;p&gt;Here's how I built it by mashing different domains together and going against the hype.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Hypothesis: Rubber bands vs. Momentum
&lt;/h3&gt;

&lt;p&gt;I previously used perturbation theory to model energy markets - defining a stable baseline and measuring localized shocks against it to predict shifts. &lt;/p&gt;

&lt;p&gt;I had a hypothesis: What if the ETF market isn't just a momentum trend, but a rubber band?&lt;/p&gt;

&lt;p&gt;Instead of assuming "the trend is your friend," I wanted to test if extreme market movements eventually snap back to a slow-moving baseline (mean-reversion).&lt;/p&gt;

&lt;p&gt;I also had to sharpen the metaphor. A market doesn’t behave like a perfect “always snap back to yesterday’s price” machine: every stretch changes its effective state, and repeated extreme pulls start to look less like elasticity and more like a regime shift.&lt;/p&gt;

&lt;p&gt;In FunTrade that’s not hand-waving - it’s enforced with two layers.&lt;/p&gt;

&lt;p&gt;First, the equilibrium anchor 

&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 isn’t fixed; it’s a seasonal OU baseline whose “μ” can drift as the calibration window updates (the band slowly creeps).&lt;/p&gt;

&lt;p&gt;Second, I only treat large deviations 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ε&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 as potentially temporary when the market still looks “elastic”: spike + consecutive-bar regime gates explicitly block mean-reversion buys when the dislocation looks structural rather than a short-lived stretch. &lt;/p&gt;

&lt;p&gt;If you keep pulling hard enough, the model decides the band has stopped behaving like a spring - and buys are disabled.&lt;/p&gt;
&lt;h2&gt;
  
  
  Translating the Math
&lt;/h2&gt;

&lt;p&gt;To test this, I split the logic into distinct layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 (The Anchor): This is the baseline equilibrium. Instead of just smoothing the last 50 days, I model a &lt;em&gt;seasonal&lt;/em&gt; Ornstein–Uhlenbeck process on &lt;strong&gt;log prices&lt;/strong&gt;. Then I “nudge” the equilibrium using macro inputs (interest rates, credit spreads, and &lt;strong&gt;FX = foreign-exchange rates&lt;/strong&gt;), because currency moves change the &lt;strong&gt;EUR value&lt;/strong&gt; of funds priced elsewhere - even if the local NAV hasn’t “explained” the move.&lt;/li&gt;
&lt;li&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord mathnormal"&gt;ε&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 (The Perturbation): This is the fast, daily deviation score. I compute a blended z-score (price vs. the 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 band, plus volume/strength signals) to measure how statistically distant today is from the equilibrium.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Crucially, a high or low ε doesn't mean the asset is "fundamentally" cheap or expensive in the real world. It just means it is statistically dislocated from the modelled 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 band.&lt;/p&gt;
&lt;h2&gt;
  
  
  Hitting a Wall: The "Falling Knife" Problem
&lt;/h2&gt;

&lt;p&gt;When you test a hypothesis against real data, you quickly find the holes in your logic.&lt;/p&gt;

&lt;p&gt;My initial failure mode was obvious: pure mean-reversion is dangerous. If a fund drops off a cliff due to a massive structural market panic, the pure 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 math screams, "It’s a massive statistical deviation! Buy!" But in reality, catching that falling knife will destroy your portfolio, at least in the short term.&lt;/p&gt;

&lt;p&gt;I had to adapt the system so it understood context. I went back to the architecture and added two things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Regime Validity Filters: Spike and consecutive-bar gates that explicitly block buy signals when the dislocation looks structural rather than temporary.&lt;/li&gt;
&lt;li&gt;
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 (The Trend Dampener): An overlay that adjusts the ε score and optionally gates sell signals in strong uptrends, based strictly on the medium-term trend.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv3qt7ihkavnat2g1phk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ftv3qt7ihkavnat2g1phk.png" alt="Grafana visualizing the slow fair-price equilibrium" width="800" height="240"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 1: Grafana visualizing the slow 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 equilibrium band against actual price, with the fast ε perturbation scores tracking the deviations below. Red annotations mark stretches where regime filters block mean-reversion buys (possible structural dislocation, not a "buy now" signal).&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Laboratory: Strict Boundary Architecture
&lt;/h2&gt;

&lt;p&gt;To actually run these tests, you can't just run a Jupyter notebook. You need a strict boundary that runs walk-forward backtests without accidentally leaking tomorrow's data into today's calibration—otherwise, you are just lying to yourself.&lt;/p&gt;

&lt;p&gt;I built the v1 stack purely for offline rigor:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Storage: TimescaleDB via Docker. Essential for handling daily OHLC bars and keeping calibration stored per symbol without memory bottlenecks.&lt;/li&gt;
&lt;li&gt;Engine: Python 3.12 (managed via uv) to crunch the daily matrices and sweep the data.&lt;/li&gt;
&lt;li&gt;Observability: Grafana to visualize the 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 bands vs. ε deviations over time, plus a Streamlit UI for human-readable daily recommendations.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Mixing it all together
&lt;/h2&gt;

&lt;p&gt;Adapting a physics model taught me more about financial regime shifts and structural market failures than reading a dozen finance books ever could. Seeing those regime filters actually step in to block the system from blindly buying every crash-day ε spike was the exact moment this went from a math experiment to a functional copilot.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fourk37e0to7f77homswz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fourk37e0to7f77homswz.png" alt="Funtrade Copilot recommendations" width="800" height="414"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Figure 2: The Streamlit frontend: abstracting the TimescaleDB and Python calibration matrices into daily, human-readable tactical overlays.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Going against the traditional lines of thought forces you to build better systems. If you want to poke around the time-series pipelines, look at the 
&lt;span class="katex-element"&gt;
  &lt;span class="katex"&gt;&lt;span class="katex-mathml"&gt;&lt;/span&gt;&lt;span class="katex-html"&gt;&lt;span class="base"&gt;&lt;span class="strut"&gt;&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="mord"&gt;/&lt;/span&gt;&lt;span class="mord"&gt;&lt;span class="mord mathnormal"&gt;H&lt;/span&gt;&lt;span class="msupsub"&gt;&lt;span class="vlist-t vlist-t2"&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;span class="pstrut"&gt;&lt;/span&gt;&lt;span class="sizing reset-size6 size3 mtight"&gt;&lt;span class="mord mtight"&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-s"&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span class="vlist-r"&gt;&lt;span class="vlist"&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;/span&gt;
 math, or run the offline demo on synthetic data, I open-sourced the whole thing.&lt;/p&gt;

&lt;p&gt;GitHub Repository: &lt;a href="https://github.com/SpektrNO/fun-trade/" rel="noopener noreferrer"&gt;https://github.com/SpektrNO/fun-trade/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To spin it up locally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make setup &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make run &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make demo &lt;span class="nv"&gt;SYMBOL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;VWCE.DE
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;make demo&lt;/code&gt; uses synthetic bars so you can run offline; swap in &lt;code&gt;make ingest&lt;/code&gt; for real symbols.&lt;/p&gt;

&lt;p&gt;Has anyone else successfully (or disastrously) ported a mental model from a completely unrelated field into software architecture?&lt;/p&gt;

</description>
      <category>python</category>
      <category>backend</category>
      <category>opensource</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
