Quick update for you.
Yesterday I noticed something off in the ETH signal log. Wednesday BEARISH, Thursday NEUTRAL, Friday BEARISH. But when I pulled up the chart Friday night, it showed BEARISH the whole stretch.. as if Thursday never happened.
That’s the textbook definition of repainting. Same dates, same engine, different answer depending on when you ask.
Not acceptable for a published signal product.
What was happening
Two problems, both rooted in how yfinance serves crypto data.
One.. yfinance keeps revising crypto OHLC days after the bar closes. High and low values shift 0.1 to 0.3% even on supposedly settled days.
For a vol-regime engine using Parkinson volatility (which is sensitive to log(H/L)²), a 0.2% revision near a regime threshold can retroactively flip a past day’s classification.
Two.. the pipeline ran at ~9PM EST, smack in the middle of yfinance’s bar rollover window. UTC midnight is 8PM EST.
From there until about 7AM EST the next morning, yfinance is mid-finalization.. sometimes yesterday’s bar literally disappears from the dataset before getting republished with revised values. I caught this in real time by writing a watch script that pulled OHLC every couple hours over 24 hours. There’s a clear twilight zone where the data is unreliable.

So the engine was reading partial data at 9 PM, emitting a signal off it, then reading revised data the next day and emitting a different signal for the same date. Repaint in both directions.
The Fix
OHLC freeze. Once a date is more than 2 days old in the local cache, it’s locked. yfinance can keep revising on their end. We don’t anymore.
Drop in-progress bars. The engine only computes signals on fully closed bars now. Today’s still-ticking bar gets ignored until UTC midnight rolls over. No more partial-bar lookahead.
Cron moved to 7:30 AM EST. Past the yfinance rollover window. Yesterday’s crypto bar is settled, equity bars from the 4 PM close locked long ago. Pull, compute, publish.. all on data that won’t change. This means the members dashboard will now update the signals ~2 hours before market open so that two things are true:
I have time to send out a signal change substack post/email after confirmation.
All subscribers with access to the dashboard can wake up and check the ‘latest signals’ with full confidence.
Result
Signals are write-once now. The chart for any given date will look the same a month from now as it does today. The signal-change emails you get are real, not “wait, did it flip back” artifacts.
Sometimes the bug is in the pipes, not the engine. This one took 24 hours to track down because every individual run looked correct in isolation.. it was only the cross-run drift that exposed it.
— Durden out.
✊🧼
Disclaimer: This content is for educational and informational purposes only. It does not constitute financial advice, investment advice, or a recommendation to buy or sell any asset. Trading equities and futures involves substantial risk of loss, including the potential for loss exceeding your initial investment.
Past performance, whether backtested or live, does not guarantee future results. Backtested performance has inherent limitations: it is designed with the benefit of hindsight, does not reflect actual trading, and does not account for all factors that may affect real-world execution.
The author is not a licensed financial advisor. Always do your own research and consult a qualified financial professional before making investment decisions. You are solely responsible for your own trading decisions.
Want the live dashboards behind these insights?
Subscribe on Substack Free subscribers get research updates. Paid subscribers get live macro tools + signal alerts.