Network fetches are blocked in this session, so I verified nothing live and am citing only URLs I know with high confidence. Here is the article.

Paste this into any cell, change the ticker, and you get a true Wilder-smoothed 14-day RSI from Google Finance data:

=ARRAYFORMULA(LET(   raw, GOOGLEFINANCE("AAPL","close",TODAY()-250,TODAY()),   c, FILTER(INDEX(raw,0,2), ISNUMBER(INDEX(raw,0,2))),   n, ROWS(c),   d, CHOOSEROWS(c,SEQUENCE(n-1,1,2)) - CHOOSEROWS(c,SEQUENCE(n-1,1,1)),   g, IF(d>0,d,0),   l, IF(d<0,-d,0),   ag, REDUCE(AVERAGE(CHOOSEROWS(g,SEQUENCE(14))), CHOOSEROWS(g,SEQUENCE(n-15,1,15)), LAMBDA(a,x,(a*13+x)/14)),   al, REDUCE(AVERAGE(CHOOSEROWS(l,SEQUENCE(14))), CHOOSEROWS(l,SEQUENCE(n-15,1,15)), LAMBDA(a,x,(a*13+x)/14)),   IF(al=0, 100, 100-100/(1+ag/al)) ))

No helper columns, no script. The result matches the 14-period RSI on most charting platforms to within rounding.

What is the formula actually doing?

RSI, introduced by J. Welles Wilder in 1978, compares average gains to average losses over 14 periods and maps the ratio onto a 0 to 100 scale. The StockCharts RSI reference gives the standard two-stage calculation: a simple 14-day average seeds the first value, then every later value is smoothed as (previous average × 13 + current change) ÷ 14.

Each line of the formula maps to one step:

  • raw pulls roughly 250 calendar days of daily closes. The GOOGLEFINANCE documentation returns a two-column array with a header row, so the next line strips the header and keeps only the numeric Close column.
  • d is the day-over-day change, built by subtracting the array shifted by one row.
  • g and l split changes into gains and losses, with losses stored as positive numbers.
  • ag and al seed with the simple average of the first 14 values and then REDUCE walks the remaining rows, applying Wilder’s smoothing one bar at a time.
  • The final line is 100 − 100 ÷ (1 + RS), with a guard that returns 100 when there are no losses and division would fail.

LET, LAMBDA, REDUCE and CHOOSEROWS are all native Sheets functions. The LET function reference explains the name-then-value structure if you want to add intermediate steps.

Why pull 250 days for a 14-day indicator?

Wilder’s smoothing is recursive. Each value carries 13/14 of the previous one, so the starting seed never fully disappears. It fades geometrically, and after about 150 trading days its influence is under 0.001 percent. Platforms like TradingView and StockCharts run the recursion across their full price history, so a short lookback in Sheets will disagree with them by several RSI points. Around 250 calendar days gives roughly 170 trading days, which is enough to match. Going longer costs nothing except a slightly slower recalculation.

Is there a shorter version?

If you only need a quick signal and can accept Cutler’s RSI, which uses plain 14-day simple averages instead of Wilder’s smoothing, this fits in fewer lines:

=ARRAYFORMULA(LET(   raw, GOOGLEFINANCE("AAPL","close",TODAY()-45,TODAY()),   c, FILTER(INDEX(raw,0,2), ISNUMBER(INDEX(raw,0,2))),   p, CHOOSEROWS(c,SEQUENCE(15,1,-15)),   d, CHOOSEROWS(p,SEQUENCE(14,1,2)) - CHOOSEROWS(p,SEQUENCE(14)),   ag, SUMPRODUCT((d>0)*d)/14,   al, SUMPRODUCT((d<0)*-d)/14,   IF(al=0, 100, 100-100/(1+ag/al)) ))

Cutler’s version only needs the last 15 closes, so a 45-day window is plenty. Expect it to differ from charting platforms by 2 to 6 points during trending markets. Use it for screening, not for matching a broker’s chart.

Why does my value differ from TradingView or my broker?

Three causes account for nearly every mismatch:

  • Data timing. GOOGLEFINANCE historical closes are end-of-day. The live quote shown on charts is intraday and, per the Google Finance data disclaimer, can be delayed by up to 20 minutes depending on the exchange. Compare against the prior session’s close, not a live chart.
  • Lookback length. A short window produces a different seed, as covered above.
  • Smoothing method. Cutler’s and Wilder’s RSI diverge in strong trends. Confirm which one your platform uses.

How do I run this for a whole watchlist?

Replace the hard-coded ticker with a cell reference, for example A2, and fill down. Each cell makes its own GOOGLEFINANCE call. Google throttles heavy use, so a list of 50 or more tickers may show #N/A on some rows during recalculation. Two fixes: add a one-second cache by keeping the price pulls on a separate sheet, or reduce the window to 150 calendar days for the Wilder version, which still converges to within 0.1 of the full-history value.

What about intraday RSI?

GOOGLEFINANCE does not return intraday bars, so a true hourly RSI is not possible from this source. You can append today’s live price to the close series by concatenating GOOGLEFINANCE("AAPL","price") to the array before the diff step. That gives a running daily RSI that updates during the session, with the delay noted above.

Can I change the period?

Yes. Replace every 14 with your period and every 13 with period minus one, and change the 15 in the Cutler version to period plus one. A 9-day RSI reacts faster and whipsaws more. A 21-day RSI is smoother and lags. Fourteen remains the default because it is what Wilder published and what most traders compare against.

Finance