<?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: Kael Zhang</title>
    <description>The latest articles on DEV Community by Kael Zhang (@kaelzhang).</description>
    <link>https://dev.to/kaelzhang</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%2F4036347%2F3f79432b-6a80-4089-b30a-6bbc3eea0b50.jpg</url>
      <title>DEV Community: Kael Zhang</title>
      <link>https://dev.to/kaelzhang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kaelzhang"/>
    <language>en</language>
    <item>
      <title>Stop recomputing OHLCV indicators after every new bar</title>
      <dc:creator>Kael Zhang</dc:creator>
      <pubDate>Sun, 19 Jul 2026 10:01:18 +0000</pubDate>
      <link>https://dev.to/kaelzhang/stop-recomputing-ohlcv-indicators-after-every-new-bar-4jbn</link>
      <guid>https://dev.to/kaelzhang/stop-recomputing-ohlcv-indicators-after-every-new-bar-4jbn</guid>
      <description>&lt;p&gt;A four-year, 15-minute stock backtest is about 140k bars for one stock. With 50 stocks, that is already around 7 million rows before parameter sweeps. If you are preparing features for a model, it is easy to spend 10 minutes just building the data table before training even starts.&lt;/p&gt;

&lt;p&gt;That is the part that kept bothering me. The strategy or model is supposed to be the hard part, but the research loop often gets stuck rebuilding the feature table: RSI, MACD, ATR, Bollinger Bands, and dozens more. In a live loop or a bar-by-bar backtest, every new OHLCV bar can trigger a full-column recompute even though most of the column is already valid.&lt;/p&gt;

&lt;p&gt;I built &lt;a href="https://github.com/kaelzhang/volas" rel="noopener noreferrer"&gt;&lt;code&gt;volas&lt;/code&gt;&lt;/a&gt; for that workflow: keep the OHLCV table familiar, but make indicator refresh cheap.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/kaelzhang/volas" rel="noopener noreferrer"&gt;&lt;code&gt;volas&lt;/code&gt;&lt;/a&gt; is a Rust-backed Python DataFrame for OHLCV/candlestick pipelines. Indicators are addressed like DataFrame columns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rsi:14&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;new_bar&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;df&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rsi:14&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# refreshes only the affected tail
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What it gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a pandas-shaped API for market data;&lt;/li&gt;
&lt;li&gt;250+ built-in trading indicators;&lt;/li&gt;
&lt;li&gt;indicator directives as cached columns;&lt;/li&gt;
&lt;li&gt;append/update semantics for live bars;&lt;/li&gt;
&lt;li&gt;Rust kernels for the hot paths;&lt;/li&gt;
&lt;li&gt;NumPy/Torch output for downstream Python code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The benchmark suite is public and reproducible:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;benchmark report: &lt;a href="https://volas.ost.ai/" rel="noopener noreferrer"&gt;https://volas.ost.ai/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;benchmark challenge issue: &lt;a href="https://github.com/kaelzhang/volas/issues/13" rel="noopener noreferrer"&gt;https://github.com/kaelzhang/volas/issues/13&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you work with live OHLCV pipelines, crypto bots, technical screeners, or ML feature tables, I would be interested in feedback on three things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Does the directive API fit how you write indicator pipelines?&lt;/li&gt;
&lt;li&gt;Which indicators or market conventions are still missing?&lt;/li&gt;
&lt;li&gt;Do you have realistic cases where this approach loses to TA-Lib, pandas-ta, or your own implementation?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub: &lt;a href="https://github.com/kaelzhang/volas" rel="noopener noreferrer"&gt;https://github.com/kaelzhang/volas&lt;/a&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>rust</category>
      <category>finance</category>
      <category>performance</category>
    </item>
  </channel>
</rss>
