<?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: Neu Portal</title>
    <description>The latest articles on DEV Community by Neu Portal (@neu_portal_999f2396dbff8d).</description>
    <link>https://dev.to/neu_portal_999f2396dbff8d</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%2F4023952%2F37c55d7b-1080-40ac-987d-b7205d7ebe97.png</url>
      <title>DEV Community: Neu Portal</title>
      <link>https://dev.to/neu_portal_999f2396dbff8d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/neu_portal_999f2396dbff8d"/>
    <language>en</language>
    <item>
      <title>AI and Volatility: Forecasting How Much a Market Moves, Not Which Way</title>
      <dc:creator>Neu Portal</dc:creator>
      <pubDate>Fri, 24 Jul 2026 13:16:35 +0000</pubDate>
      <link>https://dev.to/neu_portal_999f2396dbff8d/ai-and-volatility-forecasting-how-much-a-market-moves-not-which-way-3451</link>
      <guid>https://dev.to/neu_portal_999f2396dbff8d/ai-and-volatility-forecasting-how-much-a-market-moves-not-which-way-3451</guid>
      <description>&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%2Fbvea8bf6axa7w723sfzx.jpg" 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%2Fbvea8bf6axa7w723sfzx.jpg" alt="AI and volatility" width="800" height="447"&gt;&lt;/a&gt;&lt;br&gt;
Ask almost any machine pointed at a market the same question and it will answer confidently: where is the price going next. It is the question with the screenshots and the viral threads, and it is the one machine learning is worst at, because a liquid market has already absorbed whatever the model just noticed. There is a different question you can ask the same machine, quieter and far more useful: not which way, but how far. How much is this asset likely to move over the next day? That is a volatility forecast, and unlike a price target it is something a model can genuinely deliver — and, just as importantly, something you can hold it to afterwards.&lt;/p&gt;

&lt;p&gt;This is the honest home of AI in markets, and it is a very different thing from prediction. It is worth walking through carefully, because the difference between a volatility forecast that means something and one that is decoration is measurable, and most of the genre fails the measurement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why direction is the wrong question for a liquid market
&lt;/h2&gt;

&lt;p&gt;A deep market is not a puzzle sitting still. It is an adversary that has already priced whatever your model just discovered. By the time a directional pattern is visible in the data, it is visible to everyone with the same data, and the price reflects it. Forecasting the direction of the next move, in that setting, is close to calling a coin the market has already flipped.&lt;/p&gt;

&lt;p&gt;This is not a limitation that a bigger model removes. It is the structure of the problem. The information that would tell you which way the price is about to go is exactly the information a liquid market competes away fastest. So a system built to answer that question is built to lose, slowly, in a way that only shows up over enough calls to be inconvenient to count.&lt;/p&gt;

&lt;h2&gt;
  
  
  Volatility is predictable in a way returns are not
&lt;/h2&gt;

&lt;p&gt;Volatility is different, and the difference is a real statistical property: it persists. Calm days cluster with calm days, violent days with violent days, and a shock today raises the odds of a large move tomorrow. Returns are close to unpredictable; the size of the moves is not. That autocorrelation of magnitude — volatility clustering — is stable enough to learn from.&lt;/p&gt;

&lt;p&gt;Give a model realised volatility over several lookbacks, options-implied surfaces where they exist, funding rates and open interest, and it can return a forward range that carries information even when the centre of that range is genuinely unknowable. Notice how much humbler that output is than an arrow on a chart. It does not say what will happen. It says how wide to expect the outcomes to be. And that single estimate is what everything downstream depends on: how large a position holds risk constant, where a stop is noise and where it is real, when to brace before a violent session instead of flinching after it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The band most people draw is wrong in both directions
&lt;/h2&gt;

&lt;p&gt;Here is where measurement separates from vibes. The standard way to turn a volatility number into a band is to multiply by the square root of the horizon — sigma times root-t. It is one line of code, it is everywhere, and for fat-tailed assets it misprices the distribution in a way that is worth stating precisely.&lt;/p&gt;

&lt;p&gt;We measured it against the entire Binance history rather than a flattering recent window — 3,261 daily bars for Bitcoin back to 2017. The quantity of interest is the ratio of an empirically-measured 80% band to the sigma-root-t band at each horizon. For Bitcoin it runs about 0.80 at one day, roughly 0.88 at seven days, and about 1.00 by thirty days. Read that carefully: at short horizons the parametric band is too wide, and by a month it is about right. The error changes sign as the horizon extends, so there is no single correction factor that fixes it.&lt;/p&gt;

&lt;p&gt;The reason the short-horizon band is too wide despite genuinely fat tails is that the excess kurtosis — around sixteen on daily returns, against three for a normal distribution — lives in the extreme tails, not in the tenth-to-ninetieth-percentile shoulders. So the 80% interval is actually narrower than a Gaussian would imply, while the 99% interval is much wider. Fat tails and a narrow 80% band coexist. A parametric shortcut hides exactly that, and hiding it is how a band ends up quietly lying about what it knows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Read the band off the data, and count your samples honestly
&lt;/h2&gt;

&lt;p&gt;The fix is to stop parameterising and read the interval straight off the empirical distribution of realised moves over the matching horizon, tilting the midpoint only with a momentum lean that engages when a trend gate clears — never with a hand-drawn line. Every number then has a stated source: it is a quantile of real history, not an assumption.&lt;/p&gt;

&lt;p&gt;There is one trap in doing this, and it is a subtle one. The multi-day moves overlap — consecutive thirty-day windows share twenty-nine days of data — so the samples are heavily autocorrelated. If you report the raw count of overlapping windows as your sample size, you overstate your evidence by roughly the horizon. Bitcoin's thirty-day band, drawn from about 3,231 overlapping windows, rests on only around 107 independent months. That is a materially different epistemic object, and collapsing the two is how a backtest manufactures confidence it has not earned. We print the independent count on every chart for exactly this reason: a band should show how much history actually stands behind it, not how much it can appear to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coverage: the honesty metric that cuts both ways
&lt;/h2&gt;

&lt;p&gt;The metric for an interval forecast is coverage, and its most important feature is that it fails in both directions. If you claim a 50% range, the outcome should land inside it about half the time across many days — not most of the time. A band that contains the price ninety percent of the time is not precise, it is padded, and padding is cowardice dressed as confidence: it can never be caught being wrong, which is exactly why it is worthless. A band too narrow gets caught immediately. Both are failures, and the only way to tell which one you are looking at is to score the same forecaster over many out-of-sample days against outcomes fixed in advance.&lt;/p&gt;

&lt;p&gt;This is the measure a volatility model lives or dies by, and it is the one almost no public market analysis reports, because reporting it means publishing the times the band was wrong. Over-coverage has to count as a miss or the whole exercise is theatre. Say so in those words, or the number means nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a volatility forecast has to be committed before the fact
&lt;/h2&gt;

&lt;p&gt;A forecast is only evidence if it existed before the event. This is the plainest thing in the field and the most routinely ignored, because the entire "AI called this move" genre survives on screenshots taken afterward, on ranges that were never written down until they looked good.&lt;/p&gt;

&lt;p&gt;The fix is not a better model. It is a timestamp. We write each forecast down first, serialise it, hash it with SHA-256, and anchor that hash to the Bitcoin blockchain through OpenTimestamps before any of it is public. Then we score it openly, the misses on the same page as the hits, with no filter that hides them. The Bitcoin block does not prove the forecast was good — the coverage score does that. It proves the number existed before the outcome did, which is the one claim no amount of after-the-fact narration can fake. One practical note from building this, because it is the kind of detail that quietly discredits an honest record: hash the exact bytes you publish. Write the file, hash the file, timestamp the file — if a reader runs the hash themselves and gets a different digest because you re-serialised in between, it reads as fraud even when nothing was wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a volatility model is not
&lt;/h2&gt;

&lt;p&gt;The deflation belongs here, because leaving it out is how the genre gets away with itself. None of this is an edge. Reading volatility well lowers the cost of being wrong; it does not tell you the future, and it will not beat the market. No method reliably beats a liquid market, and anyone promising that is selling something — usually a subscription, sometimes a token, always a screenshot.&lt;/p&gt;

&lt;p&gt;What an honest volatility model buys you is not prophecy. It is a band whose width means what it says, scored in the open where it is allowed to look bad, committed before the candle closed so the record cannot be curated later. A forecast is a risk object before it is anything else, and the machine earns its keep not in the arrow on the chart but in the honest width of the band around it — and in being able to prove, afterwards, that the width was honest.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Educational content — not financial advice, and not a betting tip.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Grading a probabilistic forecast: Brier score &amp; log loss in Python · tags: python, machinelearning, datascience</title>
      <dc:creator>Neu Portal</dc:creator>
      <pubDate>Fri, 17 Jul 2026 20:13:40 +0000</pubDate>
      <link>https://dev.to/neu_portal_999f2396dbff8d/grading-a-probabilistic-forecast-brier-score-log-loss-in-python-tags-python-machinelearning-1fd4</link>
      <guid>https://dev.to/neu_portal_999f2396dbff8d/grading-a-probabilistic-forecast-brier-score-log-loss-in-python-tags-python-machinelearning-1fd4</guid>
      <description>&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%2Feowugbi0njtzkj81gzns.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%2Feowugbi0njtzkj81gzns.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
If your model outputs probabilities ("70% chance of X"), accuracy is the wrong way to grade it. A proper scoring rule rewards calibration and punishes confident wrongness — its best score comes only from reporting your true belief. The two workhorses: Brier score and log loss.&lt;br&gt;
import numpy as np&lt;/p&gt;

&lt;p&gt;def brier(p, y):                 # p: predicted prob, y: 0/1 outcome&lt;br&gt;
    return np.mean((p - y) ** 2) # lower is better&lt;/p&gt;

&lt;p&gt;def log_loss(p, y, eps=1e-15):&lt;br&gt;
    p = np.clip(p, eps, 1 - eps)&lt;br&gt;
    return -np.mean(y*np.log(p) + (1-y)*np.log(1-p))&lt;/p&gt;

&lt;p&gt;p = np.array([0.9, 0.6, 0.3, 0.8]); y = np.array([1, 0, 0, 1])&lt;br&gt;
print(brier(p, y), log_loss(p, y))&lt;br&gt;
Hedge everything to 0.5 to "look safe" and a proper rule penalizes you; inflate to 0.99 and, when you're wrong, it penalizes you far more. Accuracy rewards bluffing; proper scoring rules make bluffing expensive.&lt;/p&gt;

&lt;p&gt;Pair it with a reliability diagram (bucket predictions by probability, plot predicted vs realized frequency — the diagonal is honesty) and you can actually tell whether a probabilistic model is any good, instead of cherry-picking the calls it got right.&lt;/p&gt;

&lt;p&gt;We score every forecast this way in public — wins and losses both — at neuportal.ai/experiment.&lt;/p&gt;

&lt;p&gt;Educational content — not financial advice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>Survivorship Bias: Why the Data You Can See Is Already Filtered</title>
      <dc:creator>Neu Portal</dc:creator>
      <pubDate>Wed, 15 Jul 2026 08:13:14 +0000</pubDate>
      <link>https://dev.to/neu_portal_999f2396dbff8d/survivorship-bias-why-the-data-you-can-see-is-already-filtered-789</link>
      <guid>https://dev.to/neu_portal_999f2396dbff8d/survivorship-bias-why-the-data-you-can-see-is-already-filtered-789</guid>
      <description>&lt;p&gt;Imagine judging how safe a sport is by interviewing only the people at the finish line. Everyone you talk to is fine, so you conclude the sport is harmless — never noticing that the people who got hurt are not in the room to be counted. That is &lt;strong&gt;survivorship bias&lt;/strong&gt;: drawing conclusions from a sample that has already been filtered down to the winners.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Planes That Came Back
&lt;/h2&gt;

&lt;p&gt;In WWII, analysts studied bullet holes on returning bombers and wanted to add armor where the holes clustered. The statistician Abraham Wald pointed out the flaw: they were only looking at the planes that &lt;em&gt;came back&lt;/em&gt;. The areas with the fewest holes on survivors — the engines — were exactly where a hit was fatal. The armor belonged where the survivors had &lt;strong&gt;no&lt;/strong&gt; holes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How It Poisons Financial Data
&lt;/h2&gt;

&lt;p&gt;Funds that perform badly get closed and drop out of databases. Delisted companies fall out of indices. Blown-up strategies never get written about. What's left is a highlight reel, and any "average return" computed from it is flattering by construction.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Backtests Inherit It
&lt;/h2&gt;

&lt;p&gt;Test a strategy on "the companies currently in the index" and you've quietly excluded every company that went to zero. The backtest looks robust because it was never shown the wreckage. Combined with overfitting, the equity curve is confident precisely because the hard cases are absent.&lt;/p&gt;

&lt;h2&gt;
  
  
  How We Guard Against It
&lt;/h2&gt;

&lt;p&gt;The only real defense is keeping the failures in the data. In our public forecasting experiment every call is locked and Bitcoin-timestamped &lt;em&gt;before&lt;/em&gt; the event, so we can't delete the ones that turn out wrong — the losers stay permanently on the record next to the winners. Right now the market is ahead of our model, and that number stays visible on purpose. A track record only means something when nothing has been edited out of it: &lt;a href="https://neuportal.ai/experiment" rel="noopener noreferrer"&gt;neuportal.ai/experiment&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Educational content — not financial advice, and not a betting tip.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>datascience</category>
      <category>statistics</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Monte Carlo Simulation for Tournament Forecasting: From a Match Model to Bracket Probabilities</title>
      <dc:creator>Neu Portal</dc:creator>
      <pubDate>Sat, 11 Jul 2026 12:54:59 +0000</pubDate>
      <link>https://dev.to/neu_portal_999f2396dbff8d/monte-carlo-simulation-for-tournament-forecasting-from-a-match-model-to-bracket-probabilities-8fm</link>
      <guid>https://dev.to/neu_portal_999f2396dbff8d/monte-carlo-simulation-for-tournament-forecasting-from-a-match-model-to-bracket-probabilities-8fm</guid>
      <description>&lt;p&gt;Suppose you have a decent model for a single game вАФ say a Poisson model that, given two teams, spits out the probability of a home win, a draw, and an away win. Now someone asks the bigger question: "What's the probability this team lifts the trophy?" It's tempting to reach for a calculator and start multiplying. Resist that instinct. For anything past the simplest bracket, hand-multiplication quietly falls apart, and Monte Carlo simulation is the tool that actually works.&lt;/p&gt;

&lt;p&gt;This article explains how to go from a match-level model to tournament-level probabilities by simulating the whole event thousands of times вАФ how the loop works, how many runs you need, how to attach confidence intervals, and where the approach can mislead you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why multiplying probabilities by hand breaks down
&lt;/h2&gt;

&lt;p&gt;Picture a knockout bracket. For a team to win, it has to survive the round of 16, the quarter-final, the semi, and the final. If those four matches had fixed opponents and fixed win probabilities, you could just multiply: 0.7 √Ч 0.6 √Ч 0.55 √Ч 0.5 and be done.&lt;/p&gt;

&lt;p&gt;The problem is that the opponents are not fixed. Who your team meets in the quarter-final depends on who won the other round-of-16 tie вАФ which is itself uncertain. To do this by hand you'd have to enumerate every possible path through the bracket, weight each path by the probability that this exact set of results occurred, compute your team's chance along that specific path, and sum over all of them. The number of paths explodes combinatorially. Add group stages with tie-breakers, seeding, re-seeding, byes, or extra-time-then-penalties, and the bookkeeping becomes hopeless.&lt;/p&gt;

&lt;p&gt;Worse, the naive approach silently assumes independence and a single path, throwing away exactly the branching structure that makes a tournament a tournament. You need something that respects the bracket without writing down every branch. That something is simulation.&lt;/p&gt;

&lt;h2&gt;
  
  
  From a match model to a tournament: the core idea
&lt;/h2&gt;

&lt;p&gt;Monte Carlo simulation flips the problem from &lt;em&gt;calculating&lt;/em&gt; to &lt;em&gt;playing&lt;/em&gt;. Instead of computing the probability of a path, you just play the tournament out once, at random, according to your match model. Then you do it again. And again вАФ tens of thousands of times.&lt;/p&gt;

&lt;p&gt;Each simulated tournament is one plausible history of the event. In one run, the favourite crashes out early; in another, it cruises to the title; in a third, a mid-table side goes on an improbable run. No single run means anything. But run the whole thing 50,000 times and count how often each team ends up as champion, and those counts вАФ divided by the number of runs вАФ converge on the probabilities you actually wanted. You never enumerate a single path by hand. You let the branches sort themselves out.&lt;/p&gt;

&lt;p&gt;The engine underneath is your match model. A common choice for football is a Poisson model: estimate each side's expected goals from attack/defence strength, then treat goals as Poisson-distributed. But the tournament layer doesn't care what the match model is. Poisson, an Elo-style win probability, a machine-learning classifier вАФ any model that turns "Team A vs Team B" into an outcome you can sample from will slot straight in.&lt;/p&gt;

&lt;h2&gt;
  
  
  The simulation loop, step by step
&lt;/h2&gt;

&lt;p&gt;One simulated tournament is just a loop: sample every match in the current round, advance the winners, repeat until one team remains. Then wrap that in an outer loop and tally the results.&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="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Counter&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;play_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;knockout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;lam_a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;lam_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;expected_goals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   &lt;span class="c1"&gt;# your match model
&lt;/span&gt;    &lt;span class="n"&gt;goals_a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;poisson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lam_a&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;goals_b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;random&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;poisson&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lam_b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;goals_a&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;goals_b&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;knockout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;resolve_tie&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;          &lt;span class="c1"&gt;# extra time / penalties
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;goals_a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;goals_b&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;simulate_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;alive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first_round&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;                  &lt;span class="c1"&gt;# list of (teamA, teamB)
&lt;/span&gt;    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;alive&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;winners&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nf"&gt;play_match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;for &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;alive&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winners&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;winners&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;                      &lt;span class="c1"&gt;# champion
&lt;/span&gt;        &lt;span class="n"&gt;alive&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;pair_up&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;winners&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;                   &lt;span class="c1"&gt;# next round's matchups
&lt;/span&gt;
&lt;span class="n"&gt;N&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50_000&lt;/span&gt;
&lt;span class="n"&gt;champs&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;simulate_once&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;bracket&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ratings&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;wins&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;champs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;most_common&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;wins&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;
    &lt;span class="n"&gt;se&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;N&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt; &lt;span class="mf"&gt;0.5&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;team&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  ¬±&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="mf"&gt;1.96&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;se&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the &lt;code&gt;resolve_tie&lt;/code&gt; step. In a knockout, a level score can't stand, so you need a rule for extra time and penalties вАФ often modeled as something close to a coin flip, sometimes tilted by strength. That little function is a real modeling decision, not a detail, and we'll come back to why.&lt;/p&gt;

&lt;h2&gt;
  
  
  How many runs? Convergence and confidence intervals
&lt;/h2&gt;

&lt;p&gt;Because the estimate is a proportion вАФ champions counted over runs вАФ the law of large numbers guarantees it settles toward the true model-implied probability as the number of runs grows. The useful fact is &lt;em&gt;how fast&lt;/em&gt;. The Monte Carlo standard error of an estimated probability p over N runs is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SE = sqrt( p * (1 - p) / N )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That square root is the whole story. Error shrinks with the square root of N, so to halve your uncertainty you need four times the runs. A worked example: for a coin-flip-ish p вЙИ 0.5 at N = 10,000, the standard error is about 0.005 вАФ half a percentage point. A 95% interval is roughly ¬±1.96 √Ч SE, so ¬±1 point. Push to N = 100,000 and that tightens to about ¬±0.3 points.&lt;/p&gt;

&lt;p&gt;Two practical rules follow. First, report the interval. If one team comes out at 12.3% and another at 12.1%, and your Monte Carlo error is ¬±0.5 points, those two numbers are indistinguishable вАФ pretending otherwise is false precision. Second, rare events need more runs. Estimating a longshot's 0.5% title chance to a sensible relative accuracy takes far more runs than nailing the favourite's 30%, because when p is tiny you see very few successes. For headline numbers, 10,000 runs are usually plenty; for stable tails, 100,000 or more.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reading the output: probabilities, not predictions
&lt;/h2&gt;

&lt;p&gt;The output is a distribution, not a call. "Team A: 28% ¬± 0.4%" does not say Team A will win; it says that across many simulated tournaments built on this model, Team A came out on top about 28% of the time. Same discipline applies to every stage вАФ you get reach-the-final and reach-the-quarters probabilities from the same runs for free, just by tallying at each round.&lt;/p&gt;

&lt;p&gt;This is also why simulation beats a single point forecast: it hands you the full shape of what's plausible, including the ugly-but-real chance the whole thing goes sideways.&lt;/p&gt;

&lt;h2&gt;
  
  
  Garbage in, garbage out: the limits
&lt;/h2&gt;

&lt;p&gt;Here's the discipline. Monte Carlo simulation is an amplifier, not an oracle. It faithfully propagates whatever your match model believes вАФ including everything your match model gets wrong. Run a biased model 100,000 times and you get a beautifully tight, confidently wrong answer.&lt;/p&gt;

&lt;p&gt;Keep three failure modes in view. Model error dwarfs Monte Carlo error: the ¬±0.4% from your runs is the &lt;em&gt;easy&lt;/em&gt; uncertainty. The real uncertainty lives in your goal estimates, your ratings, and that &lt;code&gt;resolve_tie&lt;/code&gt; coin-flip assumption вАФ and it's much larger. Independence is an assumption, not a fact: real tournaments carry injuries, fatigue, and momentum across matches, while a naive loop treats each game as a clean slate. And garbage inputs stay garbage вАФ stale ratings or a mis-specified home advantage don't get laundered by volume. More runs only make a wrong answer more precise, never more correct.&lt;/p&gt;

&lt;p&gt;None of this makes the method less valuable. It makes it honest: a way to turn a match model into tournament probabilities that you can then test against reality, rather than a machine for manufacturing certainty.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Monte Carlo simulation is the right tool for tournament forecasting because it respects the branching structure a bracket creates, which hand-multiplication cannot. Build a match model you trust, sample outcomes, advance winners, repeat thousands of times, and count. Report confidence intervals so you don't over-read the noise, run more iterations for rare events, and never forget that the simulation is only as good as the model feeding it.&lt;/p&gt;

&lt;p&gt;The honest test of any such model isn't how clean the code looks вАФ it's whether the probabilities hold up once the games are played. That's the part worth committing to in public, before kickoff.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Educational content вАФ not financial advice, and not a betting tip.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;At NeuPortal we lock each forecast as explicit probabilities before the event, timestamp it onto the Bitcoin blockchain so it can't be backdated, and then score it in the open. The running board вАФ every locked forecast and its result, wins and losses alike вАФ is public at &lt;a href="https://neuportal.ai/experiment" rel="noopener noreferrer"&gt;neuportal.ai/experiment&lt;/a&gt;. Check the claims yourself; that's the entire point.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>datascience</category>
      <category>ai</category>
      <category>statistics</category>
      <category>python</category>
    </item>
    <item>
      <title>How to Prove a Prediction Was Made Before the Event (with OpenTimestamps)</title>
      <dc:creator>Neu Portal</dc:creator>
      <pubDate>Sat, 11 Jul 2026 12:47:26 +0000</pubDate>
      <link>https://dev.to/neu_portal_999f2396dbff8d/how-to-prove-a-prediction-was-made-before-the-event-with-opentimestamps-4p5d</link>
      <guid>https://dev.to/neu_portal_999f2396dbff8d/how-to-prove-a-prediction-was-made-before-the-event-with-opentimestamps-4p5d</guid>
      <description>&lt;p&gt;Everyone who has ever been right about something loud enough to remember it will tell you they called it. The screenshot arrives after the match, after the candle, after the election. And there is no way to know whether it was written on Monday or edited on Friday. This is the quiet rot at the center of most "track records": a prediction you cannot date is not a prediction at all. It is a memory with good lighting.&lt;/p&gt;

&lt;p&gt;The technical name for the problem is &lt;em&gt;look-ahead&lt;/em&gt;. If a forecast can be created, tweaked, or cherry-picked after the outcome is known, then it carries zero information about skill. The only fix is to make the &lt;em&gt;timing&lt;/em&gt; of a prediction independently checkable вАФ to prove a document existed in a specific form before a specific moment, without asking anyone to trust you, your server clock, or your database. That is precisely what OpenTimestamps does, using the Bitcoin blockchain as a shared, tamper-evident clock.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why timing is the whole game
&lt;/h2&gt;

&lt;p&gt;A forecast is a bet against the future. Its value comes entirely from the fact that the future was unknown when the forecast was fixed. The instant you allow post-hoc editing, every desirable property collapses: calibration becomes meaningless, Brier scores become fiction, and "I predicted this" becomes unfalsifiable.&lt;/p&gt;

&lt;p&gt;So an honest forecasting system needs one hard guarantee before anything else: &lt;em&gt;this exact text existed at this exact time, and has not changed since.&lt;/em&gt; Note what that guarantee does &lt;strong&gt;not&lt;/strong&gt; require. It does not require publishing the forecast publicly in advance (you might want it sealed). It does not require a notary, a lawyer, or a trusted timestamping company that could be subpoenaed, hacked, or simply go out of business. It requires a clock that nobody controls and nobody can wind backward.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "proof of existence" actually means
&lt;/h2&gt;

&lt;p&gt;The building block is a cryptographic hash вАФ typically SHA-256. Feed any file into it and you get a 64-character fingerprint. Change a single comma and the fingerprint changes completely. Crucially, the process only runs one way: from the fingerprint you cannot reconstruct the document, and you cannot craft a &lt;em&gt;different&lt;/em&gt; document that produces the same fingerprint.&lt;/p&gt;

&lt;p&gt;That property gives us a clean trick. Instead of proving "this document existed at time T," we only need to prove "this &lt;em&gt;hash&lt;/em&gt; existed at time T." If the hash is provably that old, and the hash uniquely identifies the document, then the document is provably that old too. You never have to reveal the content to prove its age вАФ you only reveal the hash. This is the difference between timestamping and publishing, and it is why sealed-then-scored forecasting is possible at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  How OpenTimestamps works, step by step
&lt;/h2&gt;

&lt;p&gt;OpenTimestamps (created by Bitcoin developer Peter Todd) turns that hash into a permanent, verifiable anchor on Bitcoin. The flow looks like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Hash the document.&lt;/strong&gt; Your forecast file is reduced to a single SHA-256 fingerprint on your own machine. The content never leaves your control.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Submit the hash to a calendar server.&lt;/strong&gt; Free, public aggregator servers collect hashes from users all over the world during a short window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Aggregate into a Merkle tree.&lt;/strong&gt; The server combines thousands of these hashes into a single Merkle tree вАФ a structure where every submitted hash is a leaf, and pairs of hashes are hashed together, level by level, up to one final value called the Merkle root. Your hash is now cryptographically bound to that root.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anchor the root in a Bitcoin transaction.&lt;/strong&gt; The server publishes just the Merkle root into a Bitcoin transaction. One transaction economically timestamps every hash in the tree at once, which is why the service can be free.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait for a block.&lt;/strong&gt; When Bitcoin miners include that transaction in a block, the block header carries a timestamp and, more importantly, the immense proof-of-work behind it. From this moment on, your hash is provably older than that block.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The output you keep is a small &lt;code&gt;.ots&lt;/code&gt; proof file. It contains the exact Merkle path from your document's hash up to the Bitcoin block вАФ every sibling hash needed to walk from your leaf to the anchored root. That path is the whole proof, and it is self-contained.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Bitcoin is the "honest clock"
&lt;/h2&gt;

&lt;p&gt;You could, in principle, timestamp against any authority. The reason Bitcoin is the right one is that its clock is expensive to lie to. Each block is secured by proof-of-work вАФ a global, ongoing expenditure of real energy. To move a confirmed transaction to an earlier or later block, an attacker would have to re-mine that block and every block after it, out-racing the entire honest network. Nobody can quietly backdate a hash into last week's block, because last week's block is buried under a mountain of accumulated work.&lt;/p&gt;

&lt;p&gt;Just as important, no single party owns the record. There is no company whose database you must trust, no admin who can edit a row, no jurisdiction that can compel a change. The timestamp is agreed on by a decentralized network and replicated across thousands of nodes. That combination вАФ costly to forge, owned by no one, checkable by everyone вАФ is what earns Bitcoin the description of an &lt;em&gt;honest clock&lt;/em&gt;. For forecasting, it means the proof of "when" survives even if the forecaster disappears.&lt;/p&gt;

&lt;h2&gt;
  
  
  How anyone can verify a &lt;code&gt;.ots&lt;/code&gt; proof
&lt;/h2&gt;

&lt;p&gt;The point of all this is independence: you should not have to trust the person showing you a proof. Given the original document and its &lt;code&gt;.ots&lt;/code&gt; file, anyone can verify it вАФ for example with the open-source client:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ots verify forecast.txt.ots
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The verifier recomputes your document's hash, walks the Merkle path in the &lt;code&gt;.ots&lt;/code&gt; file to reconstruct the anchored Bitcoin transaction, looks that transaction up in the blockchain, and reads the block's timestamp. If the document was altered by even one byte, the hash won't match and verification fails outright. If everything lines up, you get a concrete statement like "existed as of block N, mined on this date." No account, no API key, no faith in the publisher вАФ just math and a copy of the blockchain (or a public block explorer).&lt;/p&gt;

&lt;h2&gt;
  
  
  Applying it to accountability forecasting
&lt;/h2&gt;

&lt;p&gt;This is the backbone of how NeuPortal (&lt;a href="https://neuportal.ai" rel="noopener noreferrer"&gt;neuportal.ai&lt;/a&gt;) runs its accountability experiment. Every forecast is &lt;strong&gt;locked&lt;/strong&gt; вАФ written, hashed, and timestamped through OpenTimestamps вАФ &lt;em&gt;before&lt;/em&gt; the event it describes. Once reality delivers the outcome, the prediction is scored with a Brier score and compared against prediction-market baselines. Because the lock happened first and is anchored to Bitcoin, there is no room to quietly delete a bad call or sharpen a good one after the fact.&lt;/p&gt;

&lt;p&gt;The proofs are public. Our timestamped forecast records live in an open repository (&lt;a href="https://github.com/neuportalai-ui/experiment-proofs" rel="noopener noreferrer"&gt;github.com/neuportalai-ui/experiment-proofs&lt;/a&gt;), and the underlying dataset is archived with a citable DOI on Zenodo (&lt;a href="https://doi.org/10.5281/zenodo.21294229" rel="noopener noreferrer"&gt;10.5281/zenodo.21294229&lt;/a&gt;). Anyone can pull a forecast, run &lt;code&gt;ots verify&lt;/code&gt;, and confirm for themselves that it predates the event. That is the entire difference between a highlight reel and a track record: one asks for your trust, the other hands you the tools to withhold it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The disclaimer that matters
&lt;/h2&gt;

&lt;p&gt;Timestamping proves &lt;em&gt;when&lt;/em&gt; a forecast was made and that it hasn't changed. It says nothing about whether the forecast was any good вАФ a confidently wrong prediction timestamps just as cleanly as a brilliant one. Proof of timing is a floor, not a ceiling: it makes honest scoring &lt;em&gt;possible&lt;/em&gt;, but the scoring still has to happen in public, across many predictions, wins and losses alike. Read any timestamped record with that in mind. Educational content вАФ not financial advice, and not a betting tip.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Want to check the receipts?&lt;/strong&gt; Browse our public, Bitcoin-timestamped forecast proofs at &lt;a href="https://github.com/neuportalai-ui/experiment-proofs" rel="noopener noreferrer"&gt;github.com/neuportalai-ui/experiment-proofs&lt;/a&gt;, cite the archived dataset via &lt;a href="https://doi.org/10.5281/zenodo.21294229" rel="noopener noreferrer"&gt;Zenodo DOI 10.5281/zenodo.21294229&lt;/a&gt;, and follow the live scoring at &lt;a href="https://neuportal.ai" rel="noopener noreferrer"&gt;neuportal.ai&lt;/a&gt;. Don't trust the claim вАФ verify the timestamp.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;NeuPortal Research&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>bitcoin</category>
      <category>cryptography</category>
      <category>opentimestamps</category>
    </item>
    <item>
      <title>How AI Forecasting Works: A Plain-English Guide to Machines That Predict the Future</title>
      <dc:creator>Neu Portal</dc:creator>
      <pubDate>Fri, 10 Jul 2026 10:57:56 +0000</pubDate>
      <link>https://dev.to/neu_portal_999f2396dbff8d/how-ai-forecasting-works-a-plain-english-guide-to-machines-that-predict-the-future-gb5</link>
      <guid>https://dev.to/neu_portal_999f2396dbff8d/how-ai-forecasting-works-a-plain-english-guide-to-machines-that-predict-the-future-gb5</guid>
      <description>&lt;p&gt;AI forecasting explained in plain English: how machines predict the future with probabilities, the main methods, and how to judge if a forecast is trustworthy.&lt;/p&gt;

&lt;p&gt;Ask most people whether a computer can predict the future and you’ll get one of two answers: a confident “yes, algorithms know everything now” or a dismissive “no, it’s all guesswork.” The truth sits in a more interesting middle. AI forecasting doesn’t tell you what will happen. It estimates how likely different outcomes are, based on patterns in data. Understanding that distinction is the key to reading any AI prediction without being fooled by it.&lt;/p&gt;

&lt;p&gt;This guide explains, in plain English, how AI forecasting actually works — the main methods, how forecasts are scored, where they’re used, and how to tell a trustworthy forecast from one that merely sounds confident.&lt;/p&gt;

&lt;p&gt;What “Forecasting” Really Means&lt;/p&gt;

&lt;p&gt;A forecast is not a promise. When a weather model says there’s a 70% chance of rain tomorrow, it isn’t wrong if the day stays dry. It’s making a probabilistic statement: out of many similar days, roughly seven in ten would see rain.&lt;/p&gt;

&lt;p&gt;This is the single most important idea in AI forecasting. Good forecasts deal in probabilities, not certainties. “The team will win” is a claim that’s either right or wrong. “The team has a 62% chance of winning” is a forecast — and you can only judge it fairly across many predictions, not from a single result.&lt;/p&gt;

&lt;p&gt;So the honest answer to “can AI predict the future?” is this: it can estimate probabilities for future events, sometimes very well and sometimes poorly, but it cannot see the future. Anyone who tells you otherwise is selling something.&lt;/p&gt;

&lt;p&gt;The Main Families of AI Forecasting Methods&lt;/p&gt;

&lt;p&gt;“AI forecasting” is an umbrella term covering several very different techniques. Here are the big families, explained simply.&lt;/p&gt;

&lt;p&gt;Statistical time-series models. These are the classic workhorses of predictive analytics. Methods like ARIMA and exponential smoothing look at a sequence of past values — daily sales, hourly temperatures, monthly traffic — and project the trend and seasonal patterns forward. Time series forecasting is what powers a lot of the “expected demand next week” numbers you never see.&lt;/p&gt;

&lt;p&gt;Probabilistic and Bayesian models. Instead of a single answer, these produce a full range of possible outcomes with probabilities attached. Bayesian methods are especially good at updating beliefs as new evidence arrives: start with a prior estimate, see fresh data, revise. They naturally express uncertainty, which is exactly what a forecast should do.&lt;/p&gt;

&lt;p&gt;Regression and Poisson models. Regression links an outcome to explanatory factors — how price, weather, and day of the week combine to shape sales. Poisson models specialize in counting events that happen at some average rate, like the number of goals in a match or support tickets in an hour. Simple, transparent, and often surprisingly hard to beat.&lt;/p&gt;

&lt;p&gt;Machine learning forecasting. Here algorithms like gradient-boosted trees and neural networks learn patterns from large, messy datasets without being told the exact rules. Machine learning forecasting shines when relationships are complex and nonlinear, and when there’s plenty of data. The trade-off: models can become black boxes, and they can “learn” noise that doesn’t repeat.&lt;/p&gt;

&lt;p&gt;LLM-based forecasting. The newest entrant. Large language models can read news, reports, and context, then reason in words toward a probability estimate. This is promising for messy, real-world questions that pure number-crunching can’t capture. But language models can also sound authoritative while being wrong, so their forecasts need the same scoring discipline as any other method.&lt;/p&gt;

&lt;p&gt;No single family is “best.” The right tool depends on the question, the data available, and how much uncertainty you’re willing to live with.&lt;/p&gt;

&lt;p&gt;How AI Forecasts Are Evaluated&lt;/p&gt;

&lt;p&gt;Here’s where most forecasting hype falls apart. A prediction being right once tells you almost nothing. Flip a coin, call heads, get heads — you didn’t predict anything. Real evaluation looks at many forecasts over time.&lt;/p&gt;

&lt;p&gt;Calibration. A well-calibrated forecaster is right about as often as they claim. When they say “70% chance,” the event should happen roughly 70% of the time across all their 70% predictions. Probability calibration is the gold standard, because it measures honesty rather than luck.&lt;/p&gt;

&lt;p&gt;Brier score and log loss. These are numerical scores that reward forecasts for being both confident and correct, while punishing confident wrong calls harder than hesitant ones. A lower Brier score means better forecasts. Scores like these let you compare two forecasters fairly instead of trading anecdotes.&lt;/p&gt;

&lt;p&gt;The lesson: judge a forecasting system by its track record across many predictions, ideally scored with calibration and a metric like the Brier score — never by a single lucky hit.&lt;/p&gt;

&lt;p&gt;Where AI Forecasting Is Used&lt;/p&gt;

&lt;p&gt;Predictive analytics quietly runs a large part of the modern world:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Weather. The original probabilistic forecasting domain, and still one of the most rigorous.&lt;/li&gt;
&lt;li&gt;Demand and supply chain. Retailers and manufacturers forecast demand to decide what to stock and where.&lt;/li&gt;
&lt;li&gt;Sports. Models estimate win probabilities and expected scores from team and player data.&lt;/li&gt;
&lt;li&gt;Finance and economics. Institutions forecast risk, volatility, and macro indicators — though markets are famously hard to beat.&lt;/li&gt;
&lt;li&gt;Elections. Poll-based models express results as probabilities, which is why a “likely” winner can still lose.&lt;/li&gt;
&lt;li&gt;Health and medicine. Models forecast disease spread, patient risk, and resource needs.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In every one of these, the output is a probability or a range — not a guarantee.&lt;/p&gt;

&lt;p&gt;The Limits and Failure Modes&lt;/p&gt;

&lt;p&gt;Being a smart reader of AI predictions means knowing how they go wrong.&lt;/p&gt;

&lt;p&gt;Overconfidence. Many systems (and people) state probabilities that are too extreme. A model that says “95% certain” far more often than it turns out to be right is poorly calibrated, even if it sounds impressive.&lt;/p&gt;

&lt;p&gt;Unfalsifiable claims. “Something big will happen soon” can never be scored, so it isn’t a real forecast. Trustworthy forecasts are specific, time-bound, and checkable.&lt;/p&gt;

&lt;p&gt;Cherry-picked track records. Anyone can highlight their best calls and bury the misses. A track record only means something if it includes every forecast, scored consistently.&lt;/p&gt;

&lt;p&gt;Garbage in, garbage out. Models trained on biased, stale, or thin data will project those flaws forward. And the future can simply break from the past — a model cannot foresee a genuinely new kind of event it has never seen before.&lt;/p&gt;

&lt;p&gt;None of this makes forecasting useless. It makes unscored, cherry-picked forecasting useless.&lt;/p&gt;

&lt;p&gt;How to Judge Whether an AI Forecast Is Trustworthy&lt;/p&gt;

&lt;p&gt;You don’t need to be a data scientist to be a critical reader. Ask:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Is it a probability, or a promise? Real forecasts give odds and admit uncertainty. Stated certainty is a red flag.&lt;/li&gt;
&lt;li&gt;Is there a scored track record? Look for calibration and Brier scores across many public predictions, not testimonials.&lt;/li&gt;
&lt;li&gt;Was the forecast locked in before the event? A prediction recorded after the fact, or quietly edited, proves nothing.&lt;/li&gt;
&lt;li&gt;Are the misses shown too? Honest forecasters publish their whole record, wins and losses alike.&lt;/li&gt;
&lt;li&gt;Does it explain its reasoning and data? Transparency beats a confident tone every time.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If a forecast fails these tests, treat it as entertainment, not evidence.&lt;/p&gt;

&lt;p&gt;One example of the “lock it in and score it” approach is NeuPortal (neuportal.ai), an experiment that records AI forecasts before events happen and then scores them in public — the kind of transparency that separates a real track record from a highlight reel.&lt;/p&gt;

&lt;p&gt;The Bottom Line&lt;/p&gt;

&lt;p&gt;AI forecasting is genuinely useful and increasingly common, but it is a tool for estimating probabilities, not a crystal ball. The methods range from century-old statistics to brand-new language models, yet they are all judged by the same honest standard: calibration and track record over many predictions. Learn to ask for probabilities, scored history, and pre-committed forecasts, and you’ll be a far sharper reader of any machine that claims to predict the future.&lt;/p&gt;

&lt;p&gt;This is educational content, not betting or financial advice.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
