<?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: Jeroen Bouma</title>
    <description>The latest articles on DEV Community by Jeroen Bouma (@jerbouma).</description>
    <link>https://dev.to/jerbouma</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%2F3984416%2Fa6ce2342-e0c6-4953-a572-426967835ac3.jpeg</url>
      <title>DEV Community: Jeroen Bouma</title>
      <link>https://dev.to/jerbouma</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jerbouma"/>
    <language>en</language>
    <item>
      <title>Technical Indicators Demystified: Using the Finance Toolkit to Read Market Signals</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 11 Aug 2026 13:20:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/technical-indicators-demystified-using-the-finance-toolkit-to-read-market-signals-4b6l</link>
      <guid>https://dev.to/jerbouma/technical-indicators-demystified-using-the-finance-toolkit-to-read-market-signals-4b6l</guid>
      <description>&lt;p&gt;On April 20, 2026, NVIDIA's 14-day Relative Strength Index reached 98.63. By June 10, the stock had lost roughly 20% from that peak and the RSI had collapsed to 32.97. Anyone watching the indicator had at least one clear signal that the move was exhausted long before the correction fully played out.&lt;/p&gt;

&lt;p&gt;This article works through four of the most widely used technical indicators - RSI, MACD, the 50-day exponential moving average, and Bollinger Bands - using NVIDIA as a case study across two years of price history. The Finance Toolkit computes all of them natively. Each section includes Python code and an MCP prompt so you can run the same analysis whether you want to write code or just ask a question in Claude. &lt;strong&gt;For more information on the Finance Toolkit, have a look &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;here&lt;/a&gt;. To explore the Finance Toolkit MCP, see &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Technical indicators do not predict the future. What they do is measure the current state of price momentum, trend direction, and volatility in a standardized, repeatable way. The signals they produce are probabilistic, not deterministic - a reading of 98 on the RSI does not guarantee a reversal, but it does tell you that buying pressure has reached an extreme that has historically been unsustainable.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and create a Toolkit instance for NVIDIA, using daily price data from the start of 2024:&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. The free plan covers five years of history; a paid plan unlocks longer datasets and non-US tickers.&lt;/p&gt;

&lt;h2&gt;
  
  
  RSI: When Buying Pressure Reaches an Extreme
&lt;/h2&gt;

&lt;p&gt;The Relative Strength Index measures the speed and magnitude of recent price changes to assess whether an asset is overbought or oversold. It runs on a scale from 0 to 100. Readings above 70 are conventionally flagged as overbought; readings below 30 suggest the opposite. The default window is 14 trading days.&lt;/p&gt;

&lt;p&gt;For NVIDIA, the RSI tells a story of repeated extremes. The stock spent much of early 2024 in overbought territory as AI infrastructure spending drove the price higher, then corrected sharply in April and again in July before recovering. The same pattern repeated in 2025 during the DeepSeek selloff, the April tariff shock, and the May trade-truce rally. The April 2026 peak pushed the RSI to levels that are statistically rare for any large-cap stock.&lt;/p&gt;

&lt;p&gt;To compute the RSI, access the technicals module on the Toolkit instance:&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;rsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_relative_strength_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;NVDA RSI&lt;/th&gt;
&lt;th&gt;Reading&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-24&lt;/td&gt;
&lt;td&gt;97.00&lt;/td&gt;
&lt;td&gt;Extreme overbought&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-04-19&lt;/td&gt;
&lt;td&gt;28.55&lt;/td&gt;
&lt;td&gt;Oversold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-07-30&lt;/td&gt;
&lt;td&gt;21.04&lt;/td&gt;
&lt;td&gt;Deep oversold&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-01-27&lt;/td&gt;
&lt;td&gt;31.97&lt;/td&gt;
&lt;td&gt;Oversold (DeepSeek gap-down)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-08&lt;/td&gt;
&lt;td&gt;24.37&lt;/td&gt;
&lt;td&gt;Oversold (tariff selloff)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-05-16&lt;/td&gt;
&lt;td&gt;92.67&lt;/td&gt;
&lt;td&gt;Extreme overbought (trade truce)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-20&lt;/td&gt;
&lt;td&gt;98.63&lt;/td&gt;
&lt;td&gt;Historic extreme&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-04&lt;/td&gt;
&lt;td&gt;35.85&lt;/td&gt;
&lt;td&gt;Cooling off&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-16&lt;/td&gt;
&lt;td&gt;46.49&lt;/td&gt;
&lt;td&gt;Neutral&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Several things stand out. The April 2025 reading of 24.37 coincided with the peak of the US-China tariff shock - a sentiment-driven event that pushed NVIDIA well below any fundamental valuation anchor. The stock recovered sharply when the tariff pause was announced on April 9 (RSI bouncing to 46.41 in a single session). The April 2026 extreme at 98.63 marked the tail end of a run driven by AI infrastructure announcements; the RSI had already been above 80 for six consecutive sessions before hitting that level.&lt;/p&gt;

&lt;p&gt;One thing the RSI does not tell you is the cause of the signal. For that, you need context - which is where combining indicators and understanding the underlying news becomes important.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show me NVIDIA's 14-day RSI from January 2024 to June 2026, and identify the key overbought and oversold turning points."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  MACD: Catching Trend Shifts Early
&lt;/h2&gt;

&lt;p&gt;The Moving Average Convergence Divergence indicator measures the difference between a short-term and a long-term exponential moving average, typically 12-day and 26-day. The result is the MACD line. A signal line - usually a 9-day EMA of the MACD line - is plotted alongside it. When the MACD line crosses above the signal line, it signals bullish momentum building; when it crosses below, momentum is turning negative.&lt;/p&gt;

&lt;p&gt;The MACD is a lagging indicator by design - it confirms a trend shift after it has started rather than predicting one. But that lag is also its strength: it filters out short-term noise and only triggers when momentum has been building for several sessions.&lt;/p&gt;

&lt;p&gt;To compute the MACD for NVIDIA:&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;macd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_moving_average_convergence_divergence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;short_window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;long_window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;signal_window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;MACD Line&lt;/th&gt;
&lt;th&gt;Signal Line&lt;/th&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2024-04-19&lt;/td&gt;
&lt;td&gt;-1.99&lt;/td&gt;
&lt;td&gt;0.63&lt;/td&gt;
&lt;td&gt;Bearish: MACD below signal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-07-30&lt;/td&gt;
&lt;td&gt;-6.28&lt;/td&gt;
&lt;td&gt;-2.01&lt;/td&gt;
&lt;td&gt;Deep bearish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-01-27&lt;/td&gt;
&lt;td&gt;-1.75&lt;/td&gt;
&lt;td&gt;0.35&lt;/td&gt;
&lt;td&gt;Bearish crossover (DeepSeek)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-08&lt;/td&gt;
&lt;td&gt;-10.71&lt;/td&gt;
&lt;td&gt;-7.70&lt;/td&gt;
&lt;td&gt;Deep bearish (tariff panic)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-05-09&lt;/td&gt;
&lt;td&gt;3.44&lt;/td&gt;
&lt;td&gt;1.11&lt;/td&gt;
&lt;td&gt;Bullish crossover&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-05-16&lt;/td&gt;
&lt;td&gt;11.28&lt;/td&gt;
&lt;td&gt;6.52&lt;/td&gt;
&lt;td&gt;Strong bullish&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-17&lt;/td&gt;
&lt;td&gt;9.42&lt;/td&gt;
&lt;td&gt;4.31&lt;/td&gt;
&lt;td&gt;Bullish peak&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-16&lt;/td&gt;
&lt;td&gt;-2.22&lt;/td&gt;
&lt;td&gt;-0.59&lt;/td&gt;
&lt;td&gt;Bearish crossover&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The April 2025 tariff selloff pushed the MACD to -10.71, its lowest reading in the dataset. Importantly, the May 9 bullish crossover came just before the strongest leg of the recovery: by May 16, the MACD had expanded to 11.28 as momentum built. The June 16, 2026 bearish crossover (-2.22 vs -0.59) confirms what the RSI had already signaled - that the late-April surge has fully unwound.&lt;/p&gt;

&lt;p&gt;What the MACD added over the RSI alone: the RSI flagged the April 2026 peak in real time (98.63 on April 20), but the MACD bullish crossover in early April gave an earlier entry signal for the rally. Neither indicator is superior - they answer different questions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Compute NVIDIA's MACD with a 12-26-9 setup from January 2024 to today and show me where the bullish and bearish crossovers occurred."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The 50-Day EMA: Separating Trend from Noise
&lt;/h2&gt;

&lt;p&gt;A single price reading tells you where a stock is. The 50-day exponential moving average tells you where it has been trending. More precisely, the EMA weights recent prices more heavily than older ones, making it more responsive to new information than a simple moving average. When the price is trading above the 50-day EMA, the medium-term trend is up; when it falls below, the trend has turned.&lt;/p&gt;

&lt;p&gt;For NVIDIA, the relationship between price and the 50-day EMA has flipped multiple times since 2024, each flip corresponding to a meaningful change in regime.&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;ema_50&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_exponential_moving_average&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Close Price&lt;/th&gt;
&lt;th&gt;50-Day EMA&lt;/th&gt;
&lt;th&gt;Price vs EMA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2024-01-02&lt;/td&gt;
&lt;td&gt;48.17&lt;/td&gt;
&lt;td&gt;47.30&lt;/td&gt;
&lt;td&gt;+1.8% above - early uptrend&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-06-18&lt;/td&gt;
&lt;td&gt;135.58&lt;/td&gt;
&lt;td&gt;104.46&lt;/td&gt;
&lt;td&gt;+29.7% above - extended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-08-05&lt;/td&gt;
&lt;td&gt;100.45&lt;/td&gt;
&lt;td&gt;114.70&lt;/td&gt;
&lt;td&gt;-12.4% below - trend broken&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-01-27&lt;/td&gt;
&lt;td&gt;118.42&lt;/td&gt;
&lt;td&gt;137.30&lt;/td&gt;
&lt;td&gt;-13.8% below - DeepSeek selloff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-08&lt;/td&gt;
&lt;td&gt;96.30&lt;/td&gt;
&lt;td&gt;118.11&lt;/td&gt;
&lt;td&gt;-18.4% below - tariff panic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-05-16&lt;/td&gt;
&lt;td&gt;135.40&lt;/td&gt;
&lt;td&gt;116.86&lt;/td&gt;
&lt;td&gt;+15.9% above - trend restored&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-20&lt;/td&gt;
&lt;td&gt;202.06&lt;/td&gt;
&lt;td&gt;184.57&lt;/td&gt;
&lt;td&gt;+9.5% above - extended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-16&lt;/td&gt;
&lt;td&gt;207.41&lt;/td&gt;
&lt;td&gt;206.85&lt;/td&gt;
&lt;td&gt;flat - price testing EMA support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The June 2024 divergence of 29.7% above the EMA was unsustainable. The August 2024 correction brought the price back below the EMA within six weeks. The DeepSeek gap-down in January 2025 pushed the stock 13.8% below the EMA overnight - which helps explain why the RSI hit 31.97 immediately, since the move was violent enough to register on both indicators simultaneously. The recovery in May 2025 restored the uptrend, and by April 2026 NVIDIA had been comfortably above its 50-day EMA for nearly a year.&lt;/p&gt;

&lt;p&gt;The June 16, 2026 flat reading (close at 207.41, EMA at 206.85) is worth watching. When price converges with the EMA after an extended period above it, the next directional move often signals whether the underlying trend is continuing or breaking.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show me NVIDIA's 50-day EMA and closing price from 2024 to today, and highlight where the price crossed below and back above the EMA."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Bollinger Bands: Reading Volatility in Real Time
&lt;/h2&gt;

&lt;p&gt;Bollinger Bands place a 20-day simple moving average at the center of a price channel, with upper and lower bands set at two standard deviations above and below. When prices reach the upper band, they have moved two standard deviations from the recent mean - statistically unusual in a stable environment. When prices touch the lower band, the opposite is true. The width of the channel itself is a volatility indicator: narrow bands suggest a calm market, wide bands reflect elevated uncertainty.&lt;/p&gt;

&lt;p&gt;For NVIDIA, the bands have caught every significant turning point since 2024, including the one playing out right now.&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;bollinger&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_bollinger_bands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;num_std_dev&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Close&lt;/th&gt;
&lt;th&gt;Lower Band&lt;/th&gt;
&lt;th&gt;Middle Band&lt;/th&gt;
&lt;th&gt;Upper Band&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2024-06-18&lt;/td&gt;
&lt;td&gt;135.58&lt;/td&gt;
&lt;td&gt;94.39&lt;/td&gt;
&lt;td&gt;117.06&lt;/td&gt;
&lt;td&gt;139.73&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-07-24&lt;/td&gt;
&lt;td&gt;114.25&lt;/td&gt;
&lt;td&gt;115.22&lt;/td&gt;
&lt;td&gt;124.92&lt;/td&gt;
&lt;td&gt;134.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024-08-05&lt;/td&gt;
&lt;td&gt;100.45&lt;/td&gt;
&lt;td&gt;99.39&lt;/td&gt;
&lt;td&gt;118.49&lt;/td&gt;
&lt;td&gt;137.58&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-01-27&lt;/td&gt;
&lt;td&gt;118.42&lt;/td&gt;
&lt;td&gt;124.77&lt;/td&gt;
&lt;td&gt;138.29&lt;/td&gt;
&lt;td&gt;151.80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025-04-08&lt;/td&gt;
&lt;td&gt;96.30&lt;/td&gt;
&lt;td&gt;94.99&lt;/td&gt;
&lt;td&gt;111.88&lt;/td&gt;
&lt;td&gt;128.78&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-17&lt;/td&gt;
&lt;td&gt;201.68&lt;/td&gt;
&lt;td&gt;159.97&lt;/td&gt;
&lt;td&gt;181.44&lt;/td&gt;
&lt;td&gt;202.91&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-04-20&lt;/td&gt;
&lt;td&gt;202.06&lt;/td&gt;
&lt;td&gt;159.99&lt;/td&gt;
&lt;td&gt;182.91&lt;/td&gt;
&lt;td&gt;205.83&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-10&lt;/td&gt;
&lt;td&gt;200.42&lt;/td&gt;
&lt;td&gt;200.55&lt;/td&gt;
&lt;td&gt;217.20&lt;/td&gt;
&lt;td&gt;233.84&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2026-06-16&lt;/td&gt;
&lt;td&gt;207.41&lt;/td&gt;
&lt;td&gt;199.43&lt;/td&gt;
&lt;td&gt;213.23&lt;/td&gt;
&lt;td&gt;227.03&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Three moments jump out. On July 24, 2024, the close of 114.25 fell below the lower band at 115.22 - a squeeze that resolved to the upside once the rotation out of AI stocks stabilized. The January 27, 2025 close of 118.42 was significantly below the lower band at 124.77, which happened overnight on the DeepSeek news: the gap opened below the band and confirmed that the move was a sentiment break, not a gradual fade.&lt;/p&gt;

&lt;p&gt;The April 17-20, 2026 entries show the price pressing against the upper band at precisely the moment the RSI hit its peak. Close at 201.68 against an upper band of 202.91, then 202.06 against 205.83 - price was sitting on the ceiling. By June 10, the setup had completely inverted: close at 200.42 touching the lower band at 200.55. The stock bounced, closing June 16 at 207.41 with the lower band now at 199.43, acting as support.&lt;/p&gt;

&lt;p&gt;The band width also carries information. The 43-point gap between bands on April 17 (159.97 to 202.91) reflected heightened volatility from the AI infrastructure cycle. The narrower 28-point gap on June 16 (199.43 to 227.03) suggests volatility is compressing - which typically precedes the next directional move, though not the direction itself.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show me NVIDIA's Bollinger Bands with a 20-day window and 2 standard deviations from January 2024 to June 2026. Where did the price touch the upper and lower bands?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Current Picture
&lt;/h2&gt;

&lt;p&gt;Since June 2026, NVIDIA's technical setup is mixed but stabilizing. The RSI has recovered from its June low of 32.97 to 46.49 - neutral territory. The MACD is in a fresh bearish crossover (-2.22 vs -0.59), but the spread is narrow, which means the negative momentum is not accelerating. The 50-day EMA is at 206.85, essentially matching the current price of 207.41: the stock is at a decision point where trend support and current price are the same number.&lt;/p&gt;

&lt;p&gt;The Bollinger lower band just acted as support on June 10, which historically has resolved to the upside more often than not for a stock with NVIDIA's earnings trajectory. What the indicators do not tell you is how long the consolidation lasts before the next leg.&lt;/p&gt;

&lt;p&gt;To get the full current reading in a single block:&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;rsi_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_relative_strength_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;iloc&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="n"&gt;macd_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_moving_average_convergence_divergence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;iloc&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="n"&gt;ema_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_exponential_moving_average&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;iloc&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="n"&gt;bb_current&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_bollinger_bands&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;daily&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;window&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;iloc&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Technical indicators are most useful when they agree. Right now, the RSI, MACD, and Bollinger Bands are all pointing to the same conclusion: the April-May 2026 surge has been fully corrected, the stock has found support at the lower band, and the price is back at its medium-term trend line. Whether the next move continues the longer uptrend or breaks deeper into the EMA will become visible in the RSI and MACD readings over the next few weeks.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Explaining Stock Returns with the Fama-French 5 Factor Model</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 04 Aug 2026 13:50:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/explaining-stock-returns-with-the-fama-french-5-factor-model-2ode</link>
      <guid>https://dev.to/jerbouma/explaining-stock-returns-with-the-fama-french-5-factor-model-2ode</guid>
      <description>&lt;p&gt;In 2023, the Fama-French 5-factor model could explain only 35% of NVIDIA's weekly return variation. In 2024, it explained 82%. That gap tells you something important: NVIDIA's 2023 surge was driven primarily by a narrative that no systematic factor had yet priced in - the sudden recognition that GPU scarcity would define AI infrastructure for years. By 2024, that insight had diffused into the market factor itself, and the stock began behaving like a large-cap bellwether rather than a thematic trade.&lt;/p&gt;

&lt;p&gt;The Fama-French 5-factor model is the most widely used framework for decomposing stock returns into systematic components. Instead of asking "did this stock go up?", it asks "how much of that return is explained by exposure to known risk premia, and how much is specific to the company?" The answer has implications for both portfolio construction and for understanding whether outperformance is repeatable.&lt;/p&gt;

&lt;p&gt;This article runs the model on NVIDIA, Apple, and Microsoft using the Finance Toolkit, interprets what each factor says about each company, and draws out the most useful comparisons across the three. &lt;strong&gt;For more information on the Finance Toolkit, have a look &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;here&lt;/a&gt;. To explore the Finance Toolkit MCP, see &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Factors
&lt;/h2&gt;

&lt;p&gt;Before running any code, it helps to have the five factors clearly defined. Each represents a systematic source of return that the model holds responsible for a portion of a stock's performance.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;Full Name&lt;/th&gt;
&lt;th&gt;What it measures&lt;/th&gt;
&lt;th&gt;Negative slope means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mkt-RF&lt;/td&gt;
&lt;td&gt;Market Risk Premium&lt;/td&gt;
&lt;td&gt;Excess return of the broad market over the risk-free rate. Slope ~= market beta.&lt;/td&gt;
&lt;td&gt;Less market-sensitive than average&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMB&lt;/td&gt;
&lt;td&gt;Small Minus Big&lt;/td&gt;
&lt;td&gt;Historical premium of small-cap stocks over large-cap stocks.&lt;/td&gt;
&lt;td&gt;Large-cap orientation - underperforms when small-caps lead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HML&lt;/td&gt;
&lt;td&gt;High Minus Low&lt;/td&gt;
&lt;td&gt;Historical premium of value stocks (high book-to-market) over growth stocks.&lt;/td&gt;
&lt;td&gt;Growth stock - underperforms when value leads&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMW&lt;/td&gt;
&lt;td&gt;Robust Minus Weak&lt;/td&gt;
&lt;td&gt;Historical premium of high operating profitability over weak profitability.&lt;/td&gt;
&lt;td&gt;Returns not well explained by current realized earnings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMA&lt;/td&gt;
&lt;td&gt;Conservative Minus Aggressive&lt;/td&gt;
&lt;td&gt;Historical premium of low-investment firms over high-investment firms.&lt;/td&gt;
&lt;td&gt;Aggressive reinvestor - heavy capex or R&amp;amp;D spend&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and create a Toolkit instance for all three stocks:&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2019-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. The free plan covers five years of history; the full 2019-2026 dataset used here requires a paid plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running the Fama-French Model
&lt;/h2&gt;

&lt;p&gt;The Finance Toolkit exposes the Fama-French model through the performance module. Setting &lt;code&gt;period="yearly"&lt;/code&gt; runs a separate regression for each calendar year, which reveals how factor exposures shift over time.&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;ff5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_fama_and_french_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;multi&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;2019&lt;/th&gt;
&lt;th&gt;2020&lt;/th&gt;
&lt;th&gt;2021&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2023&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;th&gt;2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mkt-RF&lt;/td&gt;
&lt;td&gt;0.0173&lt;/td&gt;
&lt;td&gt;0.0263&lt;/td&gt;
&lt;td&gt;0.0102&lt;/td&gt;
&lt;td&gt;0.0131&lt;/td&gt;
&lt;td&gt;0.0087&lt;/td&gt;
&lt;td&gt;0.0120&lt;/td&gt;
&lt;td&gt;0.0110&lt;/td&gt;
&lt;td&gt;0.0109&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HML&lt;/td&gt;
&lt;td&gt;-0.0077&lt;/td&gt;
&lt;td&gt;-0.0113&lt;/td&gt;
&lt;td&gt;-0.0030&lt;/td&gt;
&lt;td&gt;-0.0098&lt;/td&gt;
&lt;td&gt;-0.0058&lt;/td&gt;
&lt;td&gt;-0.0045&lt;/td&gt;
&lt;td&gt;-0.0061&lt;/td&gt;
&lt;td&gt;-0.0027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMW&lt;/td&gt;
&lt;td&gt;-0.0032&lt;/td&gt;
&lt;td&gt;0.0051&lt;/td&gt;
&lt;td&gt;0.0015&lt;/td&gt;
&lt;td&gt;0.0031&lt;/td&gt;
&lt;td&gt;0.0073&lt;/td&gt;
&lt;td&gt;-0.0018&lt;/td&gt;
&lt;td&gt;0.0041&lt;/td&gt;
&lt;td&gt;0.0015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R²&lt;/td&gt;
&lt;td&gt;0.5252&lt;/td&gt;
&lt;td&gt;0.5657&lt;/td&gt;
&lt;td&gt;0.6199&lt;/td&gt;
&lt;td&gt;0.7596&lt;/td&gt;
&lt;td&gt;0.3489&lt;/td&gt;
&lt;td&gt;0.8245&lt;/td&gt;
&lt;td&gt;0.7248&lt;/td&gt;
&lt;td&gt;0.6659&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;NVDA only, selected factors shown. Full output includes SMB, CMA, Intercept, and MSE for all three tickers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Several patterns are immediately visible. The Mkt-RF slope peaked in 2020 at 0.0263 - NVIDIA was at its most market-sensitive during the COVID volatility year, when everything moved together. It compressed from 2021 onward as the stock developed more of its own narrative. The HML slope is negative in every year without exception: NVIDIA has never traded like a value stock.&lt;/p&gt;

&lt;p&gt;The R-squared column tells the most important story, and the 2023 reading of 0.3489 is the centrepiece. Just 35% of NVIDIA's weekly return variation that year was explained by the five systematic factors. The rest came from idiosyncratic exposure to the AI infrastructure thesis. The Fama-French model had no variable for "Jensen Huang said demand is insane on the earnings call." By 2024, enough of that thesis had diffused into the market factor that the model's explanatory power nearly doubled to 82%.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Run the Fama-French 5-factor model on NVIDIA annually from 2019 to 2026 and explain what each factor slope tells me about the stock."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Comparing NVIDIA, Apple, and Microsoft
&lt;/h2&gt;

&lt;p&gt;Running the model across all three tickers in a single call makes the structural differences visible at once. The 2024 annual regression offers a clean snapshot:&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;comparison_2024&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ff5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;factor&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;ticker&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&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;factor&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Mkt-RF Slope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SMB Slope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;HML Slope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;RMW Slope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CMA Slope&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;R Squared&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Factor&lt;/th&gt;
&lt;th&gt;NVDA&lt;/th&gt;
&lt;th&gt;AAPL&lt;/th&gt;
&lt;th&gt;MSFT&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Mkt-RF&lt;/td&gt;
&lt;td&gt;0.0120&lt;/td&gt;
&lt;td&gt;0.0113&lt;/td&gt;
&lt;td&gt;0.0124&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SMB&lt;/td&gt;
&lt;td&gt;-0.0051&lt;/td&gt;
&lt;td&gt;-0.0048&lt;/td&gt;
&lt;td&gt;-0.0027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;HML&lt;/td&gt;
&lt;td&gt;-0.0045&lt;/td&gt;
&lt;td&gt;-0.0027&lt;/td&gt;
&lt;td&gt;-0.0043&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RMW&lt;/td&gt;
&lt;td&gt;-0.0018&lt;/td&gt;
&lt;td&gt;0.0044&lt;/td&gt;
&lt;td&gt;0.0027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CMA&lt;/td&gt;
&lt;td&gt;-0.0067&lt;/td&gt;
&lt;td&gt;-0.0100&lt;/td&gt;
&lt;td&gt;-0.0036&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;R²&lt;/td&gt;
&lt;td&gt;0.8245&lt;/td&gt;
&lt;td&gt;0.7804&lt;/td&gt;
&lt;td&gt;0.8783&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Mkt-RF slopes are nearly identical across all three: 0.0120, 0.0113, and 0.0124. In 2024, all three mega-cap technology stocks had converged to approximately the same market sensitivity. Their size and index weight had made them proxies for the market itself.&lt;/p&gt;

&lt;p&gt;The RMW divergence is the most informative. Apple (0.0044) and Microsoft (0.0027) both show positive profitability exposure. NVIDIA's RMW is slightly negative (-0.0018) - not because NVIDIA is unprofitable (its margins are exceptional), but because the market was pricing NVIDIA more on anticipated future earnings than demonstrated current earnings. The profitability factor rewards realized profitability; forward-looking pricing disconnects from that factor.&lt;/p&gt;

&lt;p&gt;Microsoft's R-squared of 0.8783 is the highest: 88% of its weekly return variation in 2024 is explained by the five systematic factors. Microsoft had matured into a highly factor-driven stock.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Compare the Fama-French 5-factor loadings for NVIDIA, Apple, and Microsoft in 2024 and explain which stock is most driven by systematic factors."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The R-Squared Signal Over Time
&lt;/h2&gt;

&lt;p&gt;Isolating the R-squared across years for all three stocks reveals how the market's understanding of each company evolved:&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;r_squared&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ff5&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[(&lt;/span&gt;&lt;span class="n"&gt;ticker&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;R Squared&lt;/span&gt;&lt;span class="sh"&gt;"&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;ticker&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;2019&lt;/th&gt;
&lt;th&gt;2020&lt;/th&gt;
&lt;th&gt;2021&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2023&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;th&gt;2026&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVDA&lt;/td&gt;
&lt;td&gt;0.5252&lt;/td&gt;
&lt;td&gt;0.5657&lt;/td&gt;
&lt;td&gt;0.6199&lt;/td&gt;
&lt;td&gt;0.7596&lt;/td&gt;
&lt;td&gt;0.3489&lt;/td&gt;
&lt;td&gt;0.8245&lt;/td&gt;
&lt;td&gt;0.7248&lt;/td&gt;
&lt;td&gt;0.6659&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AAPL&lt;/td&gt;
&lt;td&gt;0.7576&lt;/td&gt;
&lt;td&gt;0.7242&lt;/td&gt;
&lt;td&gt;0.5847&lt;/td&gt;
&lt;td&gt;0.7331&lt;/td&gt;
&lt;td&gt;0.6022&lt;/td&gt;
&lt;td&gt;0.7804&lt;/td&gt;
&lt;td&gt;0.7595&lt;/td&gt;
&lt;td&gt;0.5754&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSFT&lt;/td&gt;
&lt;td&gt;0.5061&lt;/td&gt;
&lt;td&gt;0.5604&lt;/td&gt;
&lt;td&gt;0.8047&lt;/td&gt;
&lt;td&gt;0.5903&lt;/td&gt;
&lt;td&gt;0.3418&lt;/td&gt;
&lt;td&gt;0.8783&lt;/td&gt;
&lt;td&gt;0.6154&lt;/td&gt;
&lt;td&gt;0.3783&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Apple's R-squared has been the most stable - consistently in the 0.58-0.78 range. As the largest company in the world for most of this period, Apple effectively became the market; its returns have always tracked the broad factors reasonably well.&lt;/p&gt;

&lt;p&gt;Microsoft's 2023 R-squared of 0.3418 is as low as NVIDIA's. This is surprising until you recall that 2023 was also the year Microsoft announced its OpenAI integration and Copilot roadmap, triggering a re-rating that was as idiosyncratic as NVIDIA's GPU demand story. Both stocks were responding to the same underlying AI narrative in different ways; neither had that narrative captured in a systematic factor.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Model Cannot Tell You
&lt;/h2&gt;

&lt;p&gt;The Fama-French 5-factor model does not explain why a stock outperformed. It explains what factors were present and how sensitive the stock was to each one. An R-squared of 0.82 means the model fits well for that year; it does not mean you could have predicted NVIDIA's return by looking at the factor returns in advance.&lt;/p&gt;

&lt;p&gt;What the model is genuinely useful for is portfolio construction. If you are building a portfolio with specific factor tilts - overweight value, underweight growth - running FF5 on your holdings tells you whether your intended exposures actually exist in the portfolio, or whether stock-specific dynamics are swamping the factor positioning. For a stock like NVIDIA in 2023, the answer was clearly the latter.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>What the Cash Flow Statement Reveals That Earnings Don't Using the Finance Toolkit</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:10:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/what-the-cash-flow-statement-reveals-that-earnings-dont-using-the-finance-toolkit-181f</link>
      <guid>https://dev.to/jerbouma/what-the-cash-flow-statement-reveals-that-earnings-dont-using-the-finance-toolkit-181f</guid>
      <description>&lt;p&gt;From 2014 through 2019, Netflix reported a profit every single year. It also burned cash every single year, and the burn got worse each time: free cash flow went from -$128 million in 2014 to -$3.14 billion in 2019. Over the same six years, Snowflake's story runs the other way: its net losses have widened every year since its 2020 IPO, reaching -$1.29 billion in 2025, while its free cash flow flipped positive in 2022 and reached $913 million by 2025.&lt;/p&gt;

&lt;p&gt;Same direction of travel for the headline number, opposite direction for the cash. Both companies are real, and both are explained entirely by what the cash flow statement adds back or strips out that the income statement does not. This article uses the Finance Toolkit to walk through both cases. &lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and create a Toolkit instance for both companies:&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NFLX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SNOW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2014-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. Netflix needs the full 10+ year history this article uses, which requires a paid plan; Snowflake only IPO'd in 2020, so its history fits within the free plan's five-year window.&lt;/p&gt;

&lt;h2&gt;
  
  
  Netflix: Profitable on Paper, Burning Cash for Six Years
&lt;/h2&gt;

&lt;p&gt;Pull the income statement and cash flow statement for both companies, then line up Netflix's net income against its operating and free cash flow:&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;income&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_income_statement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;cash_flow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;companies&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_cash_flow_statement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;netflix&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net Income&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;income&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NFLX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net Income&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Operating Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NFLX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Operating Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Free Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NFLX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Free Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Net Income ($B)&lt;/th&gt;
&lt;th&gt;Operating Cash Flow ($B)&lt;/th&gt;
&lt;th&gt;Free Cash Flow ($B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;0.27&lt;/td&gt;
&lt;td&gt;0.02&lt;/td&gt;
&lt;td&gt;-0.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;0.12&lt;/td&gt;
&lt;td&gt;-0.75&lt;/td&gt;
&lt;td&gt;-0.92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2016&lt;/td&gt;
&lt;td&gt;0.19&lt;/td&gt;
&lt;td&gt;-1.47&lt;/td&gt;
&lt;td&gt;-1.66&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2017&lt;/td&gt;
&lt;td&gt;0.56&lt;/td&gt;
&lt;td&gt;-1.79&lt;/td&gt;
&lt;td&gt;-2.01&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;1.21&lt;/td&gt;
&lt;td&gt;-2.68&lt;/td&gt;
&lt;td&gt;-2.89&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;1.87&lt;/td&gt;
&lt;td&gt;-2.89&lt;/td&gt;
&lt;td&gt;-3.14&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;2.76&lt;/td&gt;
&lt;td&gt;2.43&lt;/td&gt;
&lt;td&gt;1.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;5.12&lt;/td&gt;
&lt;td&gt;0.39&lt;/td&gt;
&lt;td&gt;-0.13&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;4.49&lt;/td&gt;
&lt;td&gt;2.03&lt;/td&gt;
&lt;td&gt;1.62&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;5.41&lt;/td&gt;
&lt;td&gt;7.27&lt;/td&gt;
&lt;td&gt;6.93&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;8.71&lt;/td&gt;
&lt;td&gt;7.36&lt;/td&gt;
&lt;td&gt;6.92&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;10.98&lt;/td&gt;
&lt;td&gt;10.15&lt;/td&gt;
&lt;td&gt;9.46&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The gap in 2019 is the most extreme: $1.87 billion in reported profit against -$3.14 billion in free cash flow, a $5 billion difference in the same year. The cause sits in one line of the cash flow statement most people skip past: Netflix capitalizes the cost of producing content and amortizes it on the income statement over the years that content is expected to draw viewers, the same way a factory depreciates a machine. But the cash for that content goes out the door upfront, all at once, when it is produced or licensed. In 2019, Netflix's non-cash content amortization add-back was nowhere near large enough to offset the actual cash spent acquiring new content, so operating cash flow came in nearly $4.8 billion below net income.&lt;/p&gt;

&lt;p&gt;The flip starting in 2020 is just as informative. COVID production shutdowns slowed new content spending right as the prior years' library kept generating amortization add-backs, and operating cash flow turned positive for the first time in the dataset. By 2023, free cash flow ($6.93 billion) had not just caught up to net income ($5.41 billion), it exceeded it, since by then the content library built over the previous decade was throwing off amortization faster than new cash spend was replacing it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Compare Netflix's net income, operating cash flow, and free cash flow from 2014 to 2025. In which years was free cash flow most negative relative to net income, and when did that reverse?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Snowflake: Losing Money on Paper, Generating Cash in Practice
&lt;/h2&gt;

&lt;p&gt;Slice out Snowflake's rows from the same two statements, and add stock-based compensation alongside net income to see what is doing the reconciling:&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;snowflake_income&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SNOW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;snowflake_cash_flow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SNOW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;snowflake&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net Income&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;snowflake_income&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net Income&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stock Based Compensation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;snowflake_cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Stock Based Compensation&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Operating Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;snowflake_cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Operating Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Free Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;snowflake_cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Free Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e6&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Net Income ($M)&lt;/th&gt;
&lt;th&gt;Stock Based Compensation ($M)&lt;/th&gt;
&lt;th&gt;Operating Cash Flow ($M)&lt;/th&gt;
&lt;th&gt;Free Cash Flow ($M)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;-348.5&lt;/td&gt;
&lt;td&gt;78.4&lt;/td&gt;
&lt;td&gt;-176.6&lt;/td&gt;
&lt;td&gt;-199.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;-539.1&lt;/td&gt;
&lt;td&gt;301.4&lt;/td&gt;
&lt;td&gt;-45.4&lt;/td&gt;
&lt;td&gt;-85.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;-680.0&lt;/td&gt;
&lt;td&gt;605.1&lt;/td&gt;
&lt;td&gt;110.2&lt;/td&gt;
&lt;td&gt;81.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;-797.5&lt;/td&gt;
&lt;td&gt;861.5&lt;/td&gt;
&lt;td&gt;545.6&lt;/td&gt;
&lt;td&gt;496.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;-838.0&lt;/td&gt;
&lt;td&gt;1,168.0&lt;/td&gt;
&lt;td&gt;848.1&lt;/td&gt;
&lt;td&gt;778.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;-1,289.2&lt;/td&gt;
&lt;td&gt;1,479.3&lt;/td&gt;
&lt;td&gt;959.8&lt;/td&gt;
&lt;td&gt;913.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Snowflake's net loss has widened every single year, more than tripling from -$348.5 million in 2020 to -$1.29 billion in 2025. Read in isolation, that looks like a company getting less profitable over time. Its free cash flow tells the opposite story, turning positive in 2022 and reaching $913.5 million by 2025. The reconciling line is stock-based compensation, which grew from $78.4 million in 2020 to $1.48 billion in 2025, larger than the entire net loss for that year. SBC is a real cost to shareholders (it dilutes ownership), but it is not a cash cost to the company, so it gets added back when calculating operating cash flow. By 2025, Snowflake's SBC add-back alone was large enough to flip a -$1.29 billion accounting loss into nearly $1 billion of cash generated.&lt;/p&gt;

&lt;p&gt;Neither number is "wrong." The net loss correctly captures the dilution cost to existing shareholders. The cash flow statement correctly captures that the business is not actually consuming cash to operate, it is consuming equity. Reading only one of the two gives an incomplete, and in this case contradictory, picture of the same company.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show Snowflake's net income, stock-based compensation, and operating cash flow from 2020 to 2025. How much of the gap between net income and operating cash flow is explained by stock-based compensation alone?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Reading the Cash Flow Statement First
&lt;/h2&gt;

&lt;p&gt;Netflix and Snowflake diverge from earnings in opposite directions, but the mechanism is the same in both cases: a non-cash item on the income statement (content amortization, stock-based compensation) moves in a different rhythm than the actual cash leaving or entering the business. The other common sources of this gap that did not show up here but are worth checking on any company: changes in working capital (growing receivables eat cash even as revenue and earnings grow), deferred revenue (cash collected before it is recognized as earnings, the opposite mismatch from Netflix's content spend), and one-time gains or impairments that hit net income without any cash changing hands at all.&lt;/p&gt;

&lt;p&gt;None of this means net income is useless or that free cash flow is the only number that matters. It means neither one is sufficient on its own. A company that looks profitable but is burning cash for years, like Netflix before 2020, needs to be asked how it intends to fund that gap. A company that looks unprofitable but is generating real cash, like Snowflake since 2022, needs to be asked how much of its reported loss is real economic cost versus an accounting treatment of compensation. The cash flow statement does not replace the income statement. It is the cross-check that tells you whether to trust what the income statement is implying.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Understanding Risk Exposure Across Major Indices using the Finance Toolkit</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 21 Jul 2026 14:22:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/understanding-risk-exposure-across-major-indices-using-the-finance-toolkit-73l</link>
      <guid>https://dev.to/jerbouma/understanding-risk-exposure-across-major-indices-using-the-finance-toolkit-73l</guid>
      <description>&lt;p&gt;In the week of March 31 to April 6, 2025, the S&amp;amp;P 500 ETF fell 5.85%. That alone is not unusual; weekly moves like that happen most years. What is unusual is what the rest of 2025 looked like around it: a year that otherwise behaved close to normal, with one week that did not. That single week is enough to push the S&amp;amp;P 500's kurtosis for the year to 26, roughly six times its typical reading in a calmer year like 2023. Volatility alone would not tell you that. Kurtosis does.&lt;/p&gt;

&lt;p&gt;That is the case for looking past plain volatility when measuring risk. The Finance Toolkit's risk module covers Value at Risk, Conditional Value at Risk, maximum drawdown, the Ulcer Index, GARCH volatility, skewness, and kurtosis, each describing a different shape of risk that a single standard deviation number flattens into one figure. This article runs all five across six major indices: the S&amp;amp;P 500 (SPY), Nasdaq 100 (QQQ), Dow Jones (DIA), Russell 2000 (IWM), MSCI EAFE developed markets (EFA), and MSCI Emerging Markets (EEM). &lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and define a universe of tickers. The example below uses six major indices.&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;indices&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SPY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QQQ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;DIA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IWM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EFA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EEM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2019-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. The free plan covers five years of history, enough to span the period used here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Value at Risk and Conditional VaR: How Bad Could a Bad Week Get?
&lt;/h2&gt;

&lt;p&gt;Value at Risk (VaR) at the 95% confidence level answers one specific question: in the worst 5% of weeks, how much do you lose? Conditional Value at Risk (CVaR) answers the harder follow-up: once you are already in that worst 5%, how much do you actually lose on average? CVaR is always worse than VaR, the question is by how much.&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;var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_value_at_risk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cvar&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_conditional_value_at_risk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&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;Which returns (Value at Risk):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;SPY&lt;/th&gt;
&lt;th&gt;QQQ&lt;/th&gt;
&lt;th&gt;DIA&lt;/th&gt;
&lt;th&gt;IWM&lt;/th&gt;
&lt;th&gt;EFA&lt;/th&gt;
&lt;th&gt;EEM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;-1.2%&lt;/td&gt;
&lt;td&gt;-1.6%&lt;/td&gt;
&lt;td&gt;-1.2%&lt;/td&gt;
&lt;td&gt;-1.5%&lt;/td&gt;
&lt;td&gt;-1.1%&lt;/td&gt;
&lt;td&gt;-1.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;-3.2%&lt;/td&gt;
&lt;td&gt;-3.5%&lt;/td&gt;
&lt;td&gt;-3.2%&lt;/td&gt;
&lt;td&gt;-3.5%&lt;/td&gt;
&lt;td&gt;-2.6%&lt;/td&gt;
&lt;td&gt;-2.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;-1.3%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-1.4%&lt;/td&gt;
&lt;td&gt;-2.3%&lt;/td&gt;
&lt;td&gt;-1.4%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;-2.6%&lt;/td&gt;
&lt;td&gt;-3.5%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-2.8%&lt;/td&gt;
&lt;td&gt;-2.3%&lt;/td&gt;
&lt;td&gt;-2.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;-1.4%&lt;/td&gt;
&lt;td&gt;-1.7%&lt;/td&gt;
&lt;td&gt;-1.1%&lt;/td&gt;
&lt;td&gt;-1.7%&lt;/td&gt;
&lt;td&gt;-1.4%&lt;/td&gt;
&lt;td&gt;-1.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;-1.3%&lt;/td&gt;
&lt;td&gt;-1.9%&lt;/td&gt;
&lt;td&gt;-1.1%&lt;/td&gt;
&lt;td&gt;-1.9%&lt;/td&gt;
&lt;td&gt;-1.5%&lt;/td&gt;
&lt;td&gt;-1.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;-1.7%&lt;/td&gt;
&lt;td&gt;-2.1%&lt;/td&gt;
&lt;td&gt;-1.6%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-1.3%&lt;/td&gt;
&lt;td&gt;-1.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;And Conditional Value at Risk:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;SPY&lt;/th&gt;
&lt;th&gt;QQQ&lt;/th&gt;
&lt;th&gt;DIA&lt;/th&gt;
&lt;th&gt;IWM&lt;/th&gt;
&lt;th&gt;EFA&lt;/th&gt;
&lt;th&gt;EEM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-2.4%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-2.4%&lt;/td&gt;
&lt;td&gt;-1.8%&lt;/td&gt;
&lt;td&gt;-2.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;-5.5%&lt;/td&gt;
&lt;td&gt;-5.5%&lt;/td&gt;
&lt;td&gt;-6.0%&lt;/td&gt;
&lt;td&gt;-6.6%&lt;/td&gt;
&lt;td&gt;-5.3%&lt;/td&gt;
&lt;td&gt;-5.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;-1.9%&lt;/td&gt;
&lt;td&gt;-2.7%&lt;/td&gt;
&lt;td&gt;-1.8%&lt;/td&gt;
&lt;td&gt;-2.9%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-2.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;-3.4%&lt;/td&gt;
&lt;td&gt;-4.3%&lt;/td&gt;
&lt;td&gt;-2.8%&lt;/td&gt;
&lt;td&gt;-3.6%&lt;/td&gt;
&lt;td&gt;-3.0%&lt;/td&gt;
&lt;td&gt;-3.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;-1.6%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-1.4%&lt;/td&gt;
&lt;td&gt;-2.4%&lt;/td&gt;
&lt;td&gt;-1.9%&lt;/td&gt;
&lt;td&gt;-2.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;-1.9%&lt;/td&gt;
&lt;td&gt;-2.7%&lt;/td&gt;
&lt;td&gt;-1.5%&lt;/td&gt;
&lt;td&gt;-2.9%&lt;/td&gt;
&lt;td&gt;-1.9%&lt;/td&gt;
&lt;td&gt;-2.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;-2.8%&lt;/td&gt;
&lt;td&gt;-3.4%&lt;/td&gt;
&lt;td&gt;-2.4%&lt;/td&gt;
&lt;td&gt;-3.1%&lt;/td&gt;
&lt;td&gt;-2.0%&lt;/td&gt;
&lt;td&gt;-2.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;IWM carries the worst or second-worst CVaR almost every year, including 2024 at -2.9% when most other indices were calm, a reminder that small-cap stress can build even when large-cap headlines stay quiet. The gap between VaR and CVaR is the more interesting read: for SPY in 2020, VaR was -3.2% but CVaR was -5.5%, meaning the average outcome inside that worst-5%-of-weeks bucket was nearly twice as bad as the threshold itself. That gap widens in every index during 2020 and 2022, the two broadest drawdown years in this dataset, and narrows again in calmer years like 2023.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Calculate the yearly Value at Risk and Conditional Value at Risk for SPY, QQQ, DIA, IWM, EFA, and EEM from 2019 to 2025. Which index has the worst tail risk, and in which years does the gap between VaR and CVaR widen the most?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Maximum Drawdown: The Worst Case Each Index Actually Lived Through
&lt;/h2&gt;

&lt;p&gt;VaR and CVaR are statistical estimates. Maximum drawdown is not an estimate, it is the actual peak-to-trough loss an investor in each index lived through.&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;max_drawdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_maximum_drawdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;SPY&lt;/th&gt;
&lt;th&gt;QQQ&lt;/th&gt;
&lt;th&gt;DIA&lt;/th&gt;
&lt;th&gt;IWM&lt;/th&gt;
&lt;th&gt;EFA&lt;/th&gt;
&lt;th&gt;EEM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;-6.6%&lt;/td&gt;
&lt;td&gt;-11.0%&lt;/td&gt;
&lt;td&gt;-6.9%&lt;/td&gt;
&lt;td&gt;-9.9%&lt;/td&gt;
&lt;td&gt;-8.5%&lt;/td&gt;
&lt;td&gt;-13.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;-34.1%&lt;/td&gt;
&lt;td&gt;-28.6%&lt;/td&gt;
&lt;td&gt;-37.1%&lt;/td&gt;
&lt;td&gt;-41.1%&lt;/td&gt;
&lt;td&gt;-34.0%&lt;/td&gt;
&lt;td&gt;-33.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;-5.4%&lt;/td&gt;
&lt;td&gt;-10.9%&lt;/td&gt;
&lt;td&gt;-6.6%&lt;/td&gt;
&lt;td&gt;-12.5%&lt;/td&gt;
&lt;td&gt;-7.0%&lt;/td&gt;
&lt;td&gt;-18.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;-25.4%&lt;/td&gt;
&lt;td&gt;-35.2%&lt;/td&gt;
&lt;td&gt;-22.0%&lt;/td&gt;
&lt;td&gt;-27.3%&lt;/td&gt;
&lt;td&gt;-30.3%&lt;/td&gt;
&lt;td&gt;-33.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;-10.3%&lt;/td&gt;
&lt;td&gt;-10.9%&lt;/td&gt;
&lt;td&gt;-9.0%&lt;/td&gt;
&lt;td&gt;-18.3%&lt;/td&gt;
&lt;td&gt;-11.6%&lt;/td&gt;
&lt;td&gt;-14.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;-8.4%&lt;/td&gt;
&lt;td&gt;-13.5%&lt;/td&gt;
&lt;td&gt;-6.1%&lt;/td&gt;
&lt;td&gt;-10.1%&lt;/td&gt;
&lt;td&gt;-11.1%&lt;/td&gt;
&lt;td&gt;-11.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;-19.0%&lt;/td&gt;
&lt;td&gt;-22.9%&lt;/td&gt;
&lt;td&gt;-16.1%&lt;/td&gt;
&lt;td&gt;-23.9%&lt;/td&gt;
&lt;td&gt;-14.1%&lt;/td&gt;
&lt;td&gt;-15.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;2020's COVID crash hit IWM hardest at -41.1%, deeper than any other index in any year of this dataset, consistent with small-caps having less balance sheet cushion and less liquid trading during a panic. DIA, by contrast, never has the worst drawdown of any year, its blue-chip composition acting as the most resilient of the six across both 2020 and 2022. The 2022 bear market flips the script on tech: QQQ's -35.2% drawdown was the worst of that year, driven by the same rate-hike sensitivity that made growth stocks the epicenter of the selloff. EEM had the worst showing in 2019 and 2021, both years with no broad global crisis, a reminder that emerging markets can drawdown on their own schedule independent of US conditions.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show the yearly maximum drawdown for SPY, QQQ, DIA, IWM, EFA, and EEM from 2019 to 2025. Which index had the single worst drawdown, and which index was most resilient across all years?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Skewness: Which Years Had Fatter Downside Than Upside
&lt;/h2&gt;

&lt;p&gt;Skewness measures asymmetry. A return distribution with negative skew has a longer, fatter left tail, infrequent but severe losses outweighing the frequency of gains. Positive skew is the opposite: frequent small losses, occasional large gains.&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;skewness&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_skewness&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;SPY&lt;/th&gt;
&lt;th&gt;QQQ&lt;/th&gt;
&lt;th&gt;DIA&lt;/th&gt;
&lt;th&gt;IWM&lt;/th&gt;
&lt;th&gt;EFA&lt;/th&gt;
&lt;th&gt;EEM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;-0.59&lt;/td&gt;
&lt;td&gt;-0.43&lt;/td&gt;
&lt;td&gt;-0.65&lt;/td&gt;
&lt;td&gt;-0.36&lt;/td&gt;
&lt;td&gt;-0.56&lt;/td&gt;
&lt;td&gt;-0.53&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;-0.61&lt;/td&gt;
&lt;td&gt;-0.61&lt;/td&gt;
&lt;td&gt;-0.52&lt;/td&gt;
&lt;td&gt;-0.98&lt;/td&gt;
&lt;td&gt;-1.19&lt;/td&gt;
&lt;td&gt;-1.23&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;-0.34&lt;/td&gt;
&lt;td&gt;-0.27&lt;/td&gt;
&lt;td&gt;-0.37&lt;/td&gt;
&lt;td&gt;-0.03&lt;/td&gt;
&lt;td&gt;-0.56&lt;/td&gt;
&lt;td&gt;-0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;td&gt;0.10&lt;/td&gt;
&lt;td&gt;-0.04&lt;/td&gt;
&lt;td&gt;0.09&lt;/td&gt;
&lt;td&gt;0.37&lt;/td&gt;
&lt;td&gt;0.72&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;-0.04&lt;/td&gt;
&lt;td&gt;0.10&lt;/td&gt;
&lt;td&gt;-0.03&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;td&gt;-0.21&lt;/td&gt;
&lt;td&gt;-0.03&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;-0.52&lt;/td&gt;
&lt;td&gt;-0.41&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;td&gt;0.05&lt;/td&gt;
&lt;td&gt;-0.43&lt;/td&gt;
&lt;td&gt;0.06&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;1.52&lt;/td&gt;
&lt;td&gt;1.31&lt;/td&gt;
&lt;td&gt;0.79&lt;/td&gt;
&lt;td&gt;0.33&lt;/td&gt;
&lt;td&gt;0.39&lt;/td&gt;
&lt;td&gt;0.20&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Every index ran negative in 2019 and 2020, the two years dominated by sharp, sudden selloffs (the late-2018 spillover and the COVID crash) rather than steady grinding declines. EFA and EEM show the most extreme negative skew of the whole table in 2020, at -1.19 and -1.23, consistent with international markets taking a sharper, more concentrated hit than US large caps that year. 2022 flips to mildly positive skew almost everywhere, since that bear market ground lower week after week rather than crashing in a handful of sessions, the opposite shape of risk from 2020 despite a similarly large drawdown. 2025's positive skew across the board, led by SPY at 1.52, reflects a year of mostly steady gains punctuated by the occasional sharp upside snap-back rather than a string of small losses.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Calculate yearly skewness for these six indices from 2019 to 2025. Which years show the most negative skew, and what does that imply about how those losses happened?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Kurtosis: Why 2025 Doesn't Look Like a Normal Year
&lt;/h2&gt;

&lt;p&gt;Kurtosis measures how fat the tails are relative to a normal distribution, regardless of which direction. High kurtosis means more extreme weeks than a bell curve would predict, in either direction.&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;kurtosis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;risk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_kurtosis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;SPY&lt;/th&gt;
&lt;th&gt;QQQ&lt;/th&gt;
&lt;th&gt;DIA&lt;/th&gt;
&lt;th&gt;IWM&lt;/th&gt;
&lt;th&gt;EFA&lt;/th&gt;
&lt;th&gt;EEM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;6.05&lt;/td&gt;
&lt;td&gt;5.35&lt;/td&gt;
&lt;td&gt;6.26&lt;/td&gt;
&lt;td&gt;4.49&lt;/td&gt;
&lt;td&gt;5.59&lt;/td&gt;
&lt;td&gt;4.48&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;10.06&lt;/td&gt;
&lt;td&gt;8.68&lt;/td&gt;
&lt;td&gt;11.29&lt;/td&gt;
&lt;td&gt;8.53&lt;/td&gt;
&lt;td&gt;11.60&lt;/td&gt;
&lt;td&gt;11.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;3.59&lt;/td&gt;
&lt;td&gt;3.86&lt;/td&gt;
&lt;td&gt;3.69&lt;/td&gt;
&lt;td&gt;2.99&lt;/td&gt;
&lt;td&gt;3.58&lt;/td&gt;
&lt;td&gt;3.43&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;3.32&lt;/td&gt;
&lt;td&gt;3.14&lt;/td&gt;
&lt;td&gt;3.38&lt;/td&gt;
&lt;td&gt;2.96&lt;/td&gt;
&lt;td&gt;4.09&lt;/td&gt;
&lt;td&gt;6.00&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;2.81&lt;/td&gt;
&lt;td&gt;2.86&lt;/td&gt;
&lt;td&gt;3.19&lt;/td&gt;
&lt;td&gt;3.80&lt;/td&gt;
&lt;td&gt;3.55&lt;/td&gt;
&lt;td&gt;3.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;4.70&lt;/td&gt;
&lt;td&gt;3.90&lt;/td&gt;
&lt;td&gt;5.71&lt;/td&gt;
&lt;td&gt;4.77&lt;/td&gt;
&lt;td&gt;3.61&lt;/td&gt;
&lt;td&gt;4.20&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;26.14&lt;/td&gt;
&lt;td&gt;20.50&lt;/td&gt;
&lt;td&gt;17.56&lt;/td&gt;
&lt;td&gt;8.73&lt;/td&gt;
&lt;td&gt;19.13&lt;/td&gt;
&lt;td&gt;11.16&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This is where the April 2025 tariff-shock week shows up most clearly. SPY's kurtosis of 26.1 in 2025 is more than double the next-highest reading anywhere else in the table, and roughly nine times its calmest year (2023, at 2.81). QQQ and EFA show the same pattern, both above 19, while IWM's 2025 kurtosis of 8.73 is the lowest of the six, since small-caps had already been grinding through elevated volatility most of the year and one more sharp week barely moved the distribution's shape. 2020 is the only other year that comes close, when every index posted double-digit kurtosis during the COVID crash. The lesson sits side by side with the skewness table above: 2025 had positive skew (more upside than downside on average) and extreme kurtosis (one week dominating the whole year's tail risk) at the same time, two measurements that look contradictory until you remember they describe different things.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Calculate yearly kurtosis for SPY, QQQ, DIA, IWM, EFA, and EEM from 2019 to 2025. Which year and which index show the most extreme tail risk, and what does the skewness for that same year and index suggest about the direction of that risk?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What This Means for Portfolio Construction
&lt;/h2&gt;

&lt;p&gt;No single number in this article tells the full story on its own. Volatility alone would have missed the April 2025 shock entirely, since the rest of the year was unusually calm. Maximum drawdown alone would have missed that 2020 and 2022 were the same depth of loss but completely different in shape, one a crash, one a grind. CVaR alone would have missed that IWM's tail risk shows up in quiet years like 2024 as much as in crisis years.&lt;/p&gt;

&lt;p&gt;Putting them side by side gives a more honest picture: Dow Jones (DIA) has been the most consistently resilient by drawdown across this entire period, Russell 2000 (IWM) carries the worst tail risk almost regardless of which metric you use, and emerging markets (EEM) move on their own schedule independent of what the US indices are doing. None of that changes the diversification argument, it just specifies what each piece of a portfolio is actually buying protection against.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Tracking Macroeconomic Indicators with the Finance Toolkit</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 14 Jul 2026 14:03:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/tracking-macroeconomic-indicators-with-the-finance-toolkit-21l8</link>
      <guid>https://dev.to/jerbouma/tracking-macroeconomic-indicators-with-the-finance-toolkit-21l8</guid>
      <description>&lt;p&gt;In 2022, Brazil's central bank had its policy rate at 13.75%. The Bank of Japan's was at -0.1%. Both countries were responding to the same global shock, a wave of post-pandemic inflation that touched nearly every economy on earth, and they responded in almost opposite ways. One was years into an aggressive tightening cycle. The other had not raised rates above zero in over a decade.&lt;/p&gt;

&lt;p&gt;That divergence is the most interesting thing macro data shows you: not that economies move together, but how differently they move through the same event. The Finance Toolkit's Economics module pulls unemployment, GDP growth, inflation, government debt, central bank rates, and bond yields for 60+ countries going back, in some series, over a century, sourced from the OECD and the Global Macro Database. Unlike the rest of the Toolkit, none of this requires an FMP API key. It is public macro data, free to query, which also makes it one of the easiest modules to point an MCP-connected assistant at without anyone needing to set anything up first.&lt;/p&gt;

&lt;p&gt;This article tracks five economies, the United States, United Kingdom, Germany, Japan, and Brazil, through the 2021-2023 inflation shock and the years since. &lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Economics module works standalone, no ticker, no API key:&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Economics&lt;/span&gt;

&lt;span class="n"&gt;economics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Economics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2019-01-01&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;Every method below takes a &lt;code&gt;countries&lt;/code&gt; argument. The full list of supported countries and indicators is in the &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/docs" rel="noopener noreferrer"&gt;documentation&lt;/a&gt;; this article sticks to five economies chosen for contrast rather than completeness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Inflation: One Shock, Different Timing
&lt;/h2&gt;

&lt;p&gt;The global inflation spike gets talked about as a single event, but the data shows it arrived in waves, not all at once.&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;inflation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;economics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_inflation_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United States&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United Kingdom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Germany&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Japan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Brazil&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;United Kingdom&lt;/th&gt;
&lt;th&gt;Japan&lt;/th&gt;
&lt;th&gt;Brazil&lt;/th&gt;
&lt;th&gt;United States&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;1.3%&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;3.7%&lt;/td&gt;
&lt;td&gt;1.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;0.5%&lt;/td&gt;
&lt;td&gt;1.0%&lt;/td&gt;
&lt;td&gt;0.0%&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;td&gt;1.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;2.5%&lt;/td&gt;
&lt;td&gt;-0.2%&lt;/td&gt;
&lt;td&gt;8.3%&lt;/td&gt;
&lt;td&gt;4.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;6.9%&lt;/td&gt;
&lt;td&gt;7.9%&lt;/td&gt;
&lt;td&gt;2.5%&lt;/td&gt;
&lt;td&gt;9.3%&lt;/td&gt;
&lt;td&gt;8.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;5.9%&lt;/td&gt;
&lt;td&gt;6.8%&lt;/td&gt;
&lt;td&gt;3.3%&lt;/td&gt;
&lt;td&gt;4.6%&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;td&gt;2.6%&lt;/td&gt;
&lt;td&gt;2.2%&lt;/td&gt;
&lt;td&gt;4.3%&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;td&gt;2.1%&lt;/td&gt;
&lt;td&gt;2.0%&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;1.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Brazil's inflation took off a full year before the others, hitting 8.3% in 2021 while the US was still at 4.7% and Japan was in mild deflation at -0.2%. By 2022 the developed economies caught up, Germany at 6.9%, the UK at 7.9%, the US at 8.0%, but Brazil had already peaked and was on its way back down to 4.6% by 2023. Japan never had a real inflation problem by international standards; its highest reading in this entire window is 3.3%, a number that would have counted as a good year almost anywhere else.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Compare the inflation rate for the United States, United Kingdom, Germany, Japan, and Brazil from 2019 to 2025. Which country's inflation peaked first?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Central Banks Respond, But Not on the Same Clock
&lt;/h2&gt;

&lt;p&gt;Inflation timing explains a lot of what comes next, because central banks move in response to their own country's data, not anyone else's.&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;policy_rate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;economics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_central_bank_policy_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United States&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United Kingdom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Germany&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Japan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Brazil&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;United Kingdom&lt;/th&gt;
&lt;th&gt;Japan&lt;/th&gt;
&lt;th&gt;Brazil&lt;/th&gt;
&lt;th&gt;United States&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;-0.45%&lt;/td&gt;
&lt;td&gt;0.75%&lt;/td&gt;
&lt;td&gt;-0.10%&lt;/td&gt;
&lt;td&gt;4.50%&lt;/td&gt;
&lt;td&gt;1.625%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;-0.50%&lt;/td&gt;
&lt;td&gt;0.10%&lt;/td&gt;
&lt;td&gt;-0.10%&lt;/td&gt;
&lt;td&gt;2.00%&lt;/td&gt;
&lt;td&gt;0.125%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;-0.50%&lt;/td&gt;
&lt;td&gt;0.25%&lt;/td&gt;
&lt;td&gt;-0.10%&lt;/td&gt;
&lt;td&gt;9.25%&lt;/td&gt;
&lt;td&gt;0.125%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;0.44%&lt;/td&gt;
&lt;td&gt;3.50%&lt;/td&gt;
&lt;td&gt;-0.10%&lt;/td&gt;
&lt;td&gt;13.75%&lt;/td&gt;
&lt;td&gt;4.375%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;3.63%&lt;/td&gt;
&lt;td&gt;5.25%&lt;/td&gt;
&lt;td&gt;-0.10%&lt;/td&gt;
&lt;td&gt;11.75%&lt;/td&gt;
&lt;td&gt;5.375%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;3.81%&lt;/td&gt;
&lt;td&gt;4.75%&lt;/td&gt;
&lt;td&gt;0.25%&lt;/td&gt;
&lt;td&gt;12.25%&lt;/td&gt;
&lt;td&gt;4.375%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;2.88%&lt;/td&gt;
&lt;td&gt;4.13%&lt;/td&gt;
&lt;td&gt;0.50%&lt;/td&gt;
&lt;td&gt;8.31%&lt;/td&gt;
&lt;td&gt;4.255%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Brazil started hiking in 2021, a full year ahead of the Federal Reserve and the Bank of England, and took its policy rate from 2.0% to 13.75% in eighteen months, the steepest tightening cycle of the five. By the time the Fed and the Bank of England started moving in 2022, Brazil was already near its peak. The European Central Bank (the rate driving Germany's number here) lagged furthest behind, staying negative until mid-2022 and not clearing 3% until 2023.&lt;/p&gt;

&lt;p&gt;Japan is the outlier that matters most. The Bank of Japan held its policy rate at -0.10% through the entire inflation shock, only inching to 0.25% in 2024 and 0.50% in 2025, a complete reversal of how every other central bank in this table behaved after more than a decade of fighting deflation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show the central bank policy rate for the same five countries from 2019 to 2025. Which country hiked first, which hiked the most, and which barely moved at all?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Labor Market Question: Did Higher Rates Cost Jobs?
&lt;/h2&gt;

&lt;p&gt;The textbook expectation is that aggressive rate hikes cool the labor market. The data only partly agrees.&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;unemployment&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;economics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_unemployment_rate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United States&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United Kingdom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Germany&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Japan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Brazil&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;United Kingdom&lt;/th&gt;
&lt;th&gt;Japan&lt;/th&gt;
&lt;th&gt;Brazil&lt;/th&gt;
&lt;th&gt;United States&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;td&gt;3.9%&lt;/td&gt;
&lt;td&gt;2.4%&lt;/td&gt;
&lt;td&gt;12.0%&lt;/td&gt;
&lt;td&gt;3.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;4.7%&lt;/td&gt;
&lt;td&gt;2.8%&lt;/td&gt;
&lt;td&gt;13.8%&lt;/td&gt;
&lt;td&gt;8.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;td&gt;4.6%&lt;/td&gt;
&lt;td&gt;2.8%&lt;/td&gt;
&lt;td&gt;13.2%&lt;/td&gt;
&lt;td&gt;5.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;3.1%&lt;/td&gt;
&lt;td&gt;3.9%&lt;/td&gt;
&lt;td&gt;2.6%&lt;/td&gt;
&lt;td&gt;9.3%&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;3.0%&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;td&gt;2.6%&lt;/td&gt;
&lt;td&gt;8.0%&lt;/td&gt;
&lt;td&gt;3.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;3.4%&lt;/td&gt;
&lt;td&gt;4.3%&lt;/td&gt;
&lt;td&gt;2.5%&lt;/td&gt;
&lt;td&gt;7.2%&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;3.2%&lt;/td&gt;
&lt;td&gt;4.1%&lt;/td&gt;
&lt;td&gt;2.5%&lt;/td&gt;
&lt;td&gt;7.2%&lt;/td&gt;
&lt;td&gt;4.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The US is the clearest case of a pandemic-driven spike rather than a rate-driven one: unemployment jumped to 8.1% in 2020 from lockdowns, then fell back to 3.6% by 2022, the same year the Fed started its steepest hikes since the 1980s. Unemployment barely moved after that. That is the soft landing debate in one row of a table: rates rose nearly five points and the labor market shrugged.&lt;/p&gt;

&lt;p&gt;Brazil tells the opposite story in the most striking way. Despite running the highest policy rate of any country here for three straight years, Brazilian unemployment fell every single year from 2020 onward, from 13.8% to 7.2% by 2025. High rates did not stop the labor market from healing; whatever was driving Brazilian employment had little to do with the cost of borrowing at the margin. Germany and Japan, the two economies with the smallest rate moves, also show the smallest unemployment swings, which is closer to what theory predicts.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Pull the unemployment rate for these five countries from 2019 to 2025. Did unemployment rise when central banks raised rates, and which country shows the clearest soft landing?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Government Debt: Who Paid Down the COVID Bill?
&lt;/h2&gt;

&lt;p&gt;Inflation and rate hikes affect more than households and businesses, they change the math on government debt, both the cost of servicing it and the rate at which it gets inflated away.&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;debt_to_gdp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;economics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_government_debt_to_gdp_ratio&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United States&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;United Kingdom&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Germany&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Japan&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Brazil&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Germany&lt;/th&gt;
&lt;th&gt;United Kingdom&lt;/th&gt;
&lt;th&gt;Japan&lt;/th&gt;
&lt;th&gt;Brazil&lt;/th&gt;
&lt;th&gt;United States&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019&lt;/td&gt;
&lt;td&gt;58.6%&lt;/td&gt;
&lt;td&gt;85.7%&lt;/td&gt;
&lt;td&gt;236.4%&lt;/td&gt;
&lt;td&gt;87.1%&lt;/td&gt;
&lt;td&gt;108.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;67.9%&lt;/td&gt;
&lt;td&gt;105.8%&lt;/td&gt;
&lt;td&gt;258.4%&lt;/td&gt;
&lt;td&gt;96.0%&lt;/td&gt;
&lt;td&gt;131.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021&lt;/td&gt;
&lt;td&gt;67.9%&lt;/td&gt;
&lt;td&gt;105.1%&lt;/td&gt;
&lt;td&gt;253.7%&lt;/td&gt;
&lt;td&gt;88.9%&lt;/td&gt;
&lt;td&gt;124.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;64.8%&lt;/td&gt;
&lt;td&gt;99.6%&lt;/td&gt;
&lt;td&gt;256.3%&lt;/td&gt;
&lt;td&gt;83.9%&lt;/td&gt;
&lt;td&gt;118.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2023&lt;/td&gt;
&lt;td&gt;62.7%&lt;/td&gt;
&lt;td&gt;100.0%&lt;/td&gt;
&lt;td&gt;249.7%&lt;/td&gt;
&lt;td&gt;84.7%&lt;/td&gt;
&lt;td&gt;118.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;62.7%&lt;/td&gt;
&lt;td&gt;101.8%&lt;/td&gt;
&lt;td&gt;251.2%&lt;/td&gt;
&lt;td&gt;87.6%&lt;/td&gt;
&lt;td&gt;121.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;62.1%&lt;/td&gt;
&lt;td&gt;103.8%&lt;/td&gt;
&lt;td&gt;248.7%&lt;/td&gt;
&lt;td&gt;92.0%&lt;/td&gt;
&lt;td&gt;124.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Japan's debt-to-GDP ratio of roughly 249% dwarfs every other country here, more than double the United States and nearly two and a half times the United Kingdom. It has stayed in a tight band for years, which is itself notable: a decade of near-zero rates means rolling over that debt costs almost nothing, a luxury the BOJ's reluctance to hike helps preserve.&lt;/p&gt;

&lt;p&gt;The US and UK both jumped sharply in 2020 from COVID stimulus, 108% to 132% for the US and 86% to 106% for the UK, and neither has come close to working that back down; both sit higher in 2025 than they did in 2022. Germany and Brazil show the opposite pattern: both peaked in 2020-2021 and have since declined, Germany from 67.9% to 62.1%, Brazil from 96.0% to a low of 83.9% in 2022 before drifting back up to 92.0%. Brazil's case is partly mechanical. The same high inflation that pushed its central bank to 13.75% also inflated away a chunk of the real value of its debt, the kind of side effect that does not show up if you only look at the policy rate in isolation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Compare government debt-to-GDP for these five countries from 2019 to 2025. Which countries reduced their debt burden after the COVID spike, and which kept climbing?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What This Means for the Next Cycle
&lt;/h2&gt;

&lt;p&gt;Pulling these four indicators side by side for the same five countries makes a point that looking at any one of them alone would miss: there is no single global business cycle, only a global shock that each economy absorbed and is unwinding on its own schedule, shaped by its starting debt level, its central bank's tolerance for inflation, and the structure of its labor market.&lt;/p&gt;

&lt;p&gt;Brazil moved first and is furthest along in normalizing, having hiked early, peaked early, and started easing while the US and UK were still raising. Japan is the mirror image, having barely participated in the global tightening cycle and only now taking its first tentative steps away from negative rates after more than a decade. The US delivered the cleanest soft landing in the group: a sharp hiking cycle with almost no labor market damage, though its debt-to-GDP ratio shows the COVID stimulus bill has not gone away. Germany is the closest thing to textbook here, moderate inflation, moderate hikes, and the only economy in the group steadily reducing its debt burden.&lt;/p&gt;

&lt;p&gt;What to watch next: whether Japan's exit from negative rates accelerates as inflation proves more persistent than the BOJ expects, whether US and UK debt-to-GDP keeps climbing without consequence, and whether Brazil's early-mover advantage on rate cuts gives it room to support growth while the others are still catching up.&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Competitor and Sector Analysis with the Finance Toolkit</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 07 Jul 2026 13:33:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/competitor-and-sector-analysis-with-the-finance-toolkit-2e9f</link>
      <guid>https://dev.to/jerbouma/competitor-and-sector-analysis-with-the-finance-toolkit-2e9f</guid>
      <description>&lt;p&gt;In 2010, Intel generated $43.6 billion in revenue and its nearest competitor in logic chips, AMD, generated $6.5 billion. NVIDIA was a $3.3 billion company still best known for gaming graphics cards. Qualcomm was growing rapidly on the smartphone wave. Broadcom and Texas Instruments were mid-sized analog and connectivity specialists.&lt;/p&gt;

&lt;p&gt;By 2025, the same six companies tell a radically different story. NVIDIA has grown to $130.5 billion in revenue driven almost entirely by AI infrastructure demand. Intel sits at $52.9 billion, barely changed from its 2020 peak, now reporting losses. AMD has reached $34.6 billion and crossed Intel's gross margin for the first time in the company's history.&lt;/p&gt;

&lt;p&gt;The Finance Toolkit makes it straightforward to track this transformation through financial data, both via Python code and the MCP server for those who prefer conversational analysis. &lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Let's do a deep dive in the Semiconductor industry. What trends do you see in the last 10 years? And what about the fundamentals?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and define a universe of tickers. The example below uses six semiconductor companies: Intel, AMD, NVIDIA, Qualcomm, Broadcom, and Texas Instruments.&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;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;sector&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INTC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QCOM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AVGO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TXN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. A paid plan is required to access the full 15-year history used here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revenue: How the Landscape Shifted
&lt;/h2&gt;

&lt;p&gt;The most immediate observation from pulling 15 years of income statements is the NVIDIA revenue trajectory. Everything else looks like normal cyclical variation by comparison.&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;income&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_income_statement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2014&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2018&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;2010&lt;/th&gt;
&lt;th&gt;2014&lt;/th&gt;
&lt;th&gt;2018&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INTC&lt;/td&gt;
&lt;td&gt;43.6&lt;/td&gt;
&lt;td&gt;55.9&lt;/td&gt;
&lt;td&gt;70.8&lt;/td&gt;
&lt;td&gt;63.1&lt;/td&gt;
&lt;td&gt;52.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;23.6&lt;/td&gt;
&lt;td&gt;34.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVDA&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;9.7&lt;/td&gt;
&lt;td&gt;26.9&lt;/td&gt;
&lt;td&gt;130.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QCOM&lt;/td&gt;
&lt;td&gt;11.0&lt;/td&gt;
&lt;td&gt;26.5&lt;/td&gt;
&lt;td&gt;22.7&lt;/td&gt;
&lt;td&gt;44.2&lt;/td&gt;
&lt;td&gt;44.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVGO&lt;/td&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;4.3&lt;/td&gt;
&lt;td&gt;20.8&lt;/td&gt;
&lt;td&gt;33.2&lt;/td&gt;
&lt;td&gt;63.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TXN&lt;/td&gt;
&lt;td&gt;14.0&lt;/td&gt;
&lt;td&gt;13.0&lt;/td&gt;
&lt;td&gt;15.8&lt;/td&gt;
&lt;td&gt;20.0&lt;/td&gt;
&lt;td&gt;17.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Several things stand out. Intel peaked somewhere between 2020 and 2022, then contracted, a pattern without precedent in the company's history. NVIDIA's inflection is visible between 2022 and 2025: revenue grew from $26.9 billion to $130.5 billion in three years. Broadcom's growth looks smooth in this table but masks something important: the jump from $4.3 billion in 2014 to $20.8 billion in 2018 was almost entirely acquisition-driven, as the company absorbed Avago Technologies, Brocade, and CA Technologies in rapid succession. TXN and QCOM, the two companies least exposed to the AI compute buildout, show the flattest trajectories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gross Margins: The Fabless Advantage
&lt;/h2&gt;

&lt;p&gt;Revenue tells you who is growing. Gross margins tell you who controls their cost structure. In semiconductors, the key structural divide is between integrated device manufacturers (companies that design and fabricate their own chips) and fabless companies that outsource manufacturing to foundries like TSMC.&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;gross_margin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_gross_margin&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;margins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gross_margin&lt;/span&gt;&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2014&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2018&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;2010&lt;/th&gt;
&lt;th&gt;2014&lt;/th&gt;
&lt;th&gt;2018&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INTC&lt;/td&gt;
&lt;td&gt;66.1%&lt;/td&gt;
&lt;td&gt;63.7%&lt;/td&gt;
&lt;td&gt;61.7%&lt;/td&gt;
&lt;td&gt;42.6%&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD&lt;/td&gt;
&lt;td&gt;45.6%&lt;/td&gt;
&lt;td&gt;33.4%&lt;/td&gt;
&lt;td&gt;37.8%&lt;/td&gt;
&lt;td&gt;44.9%&lt;/td&gt;
&lt;td&gt;49.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVDA&lt;/td&gt;
&lt;td&gt;35.4%&lt;/td&gt;
&lt;td&gt;54.9%&lt;/td&gt;
&lt;td&gt;59.9%&lt;/td&gt;
&lt;td&gt;64.9%&lt;/td&gt;
&lt;td&gt;75.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QCOM&lt;/td&gt;
&lt;td&gt;68.0%&lt;/td&gt;
&lt;td&gt;59.7%&lt;/td&gt;
&lt;td&gt;54.9%&lt;/td&gt;
&lt;td&gt;57.8%&lt;/td&gt;
&lt;td&gt;55.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVGO&lt;/td&gt;
&lt;td&gt;46.2%&lt;/td&gt;
&lt;td&gt;43.9%&lt;/td&gt;
&lt;td&gt;51.5%&lt;/td&gt;
&lt;td&gt;66.6%&lt;/td&gt;
&lt;td&gt;67.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TXN&lt;/td&gt;
&lt;td&gt;53.6%&lt;/td&gt;
&lt;td&gt;56.9%&lt;/td&gt;
&lt;td&gt;65.1%&lt;/td&gt;
&lt;td&gt;68.8%&lt;/td&gt;
&lt;td&gt;57.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Intel margin collapse is the defining story of the table. A company that earned 66% gross margins in 2010 earns 34.8% in 2025. The proximate cause is that Intel's manufacturing processes fell behind TSMC's, first by one node generation, then two, meaning Intel's chips cost more to produce while competitors using TSMC got access to better processes at lower cost. The structural consequence is that Intel's cost-per-chip disadvantage compounds every product cycle.&lt;/p&gt;

&lt;p&gt;NVIDIA went in the opposite direction: from 35.4% in 2010 to 75.0% in 2025. A fabless company with a near-monopoly on AI training hardware can charge what the market bears, and the market has been willing to pay very high prices for H100 and Blackwell GPUs. NVIDIA's gross margin today is higher than Intel's ever was.&lt;/p&gt;

&lt;p&gt;AMD transitioned from a company with 33% gross margins in 2014 (a period when it was fighting for survival) to 49.5% in 2025. In 2022, AMD's gross margin crossed above Intel's for the first time. That crossover is not primarily a product story, it is a manufacturing story. AMD, as a fabless company using TSMC, gained access to better nodes while Intel's own fabs struggled.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intel vs AMD: The x86 CPU Battle
&lt;/h2&gt;

&lt;p&gt;Not every company in this sector competes with every other. Texas Instruments makes analog chips for industrial and automotive customers; it does not compete with NVIDIA for AI data center revenue. Qualcomm sells ARM-based mobile processors and has never produced an x86 chip. Broadcom targets networking and storage controllers.&lt;/p&gt;

&lt;p&gt;The genuine competitive battle in x86 CPUs is between exactly two companies: Intel and AMD. Every server, desktop, and laptop CPU socket holds a chip made by one of them. Market share gained by one is market share lost by the other.&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;cpu_rivals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INTC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;years&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2014&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2018&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;cpu_revenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cpu_rivals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;
&lt;span class="n"&gt;cpu_margins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_gross_margin&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cpu_rivals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;cpu_roic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_return_on_invested_capital&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cpu_rivals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;INTC Rev ($B)&lt;/th&gt;
&lt;th&gt;AMD Rev ($B)&lt;/th&gt;
&lt;th&gt;INTC GM&lt;/th&gt;
&lt;th&gt;AMD GM&lt;/th&gt;
&lt;th&gt;INTC ROIC&lt;/th&gt;
&lt;th&gt;AMD ROIC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;43.6&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;66.1%&lt;/td&gt;
&lt;td&gt;45.6%&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;55.9&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;63.7%&lt;/td&gt;
&lt;td&gt;33.4%&lt;/td&gt;
&lt;td&gt;22.8%&lt;/td&gt;
&lt;td&gt;-16.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;70.8&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;61.7%&lt;/td&gt;
&lt;td&gt;37.8%&lt;/td&gt;
&lt;td&gt;27.0%&lt;/td&gt;
&lt;td&gt;14.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;77.9&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;td&gt;56.0%&lt;/td&gt;
&lt;td&gt;44.5%&lt;/td&gt;
&lt;td&gt;23.6%&lt;/td&gt;
&lt;td&gt;50.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;63.1&lt;/td&gt;
&lt;td&gt;23.6&lt;/td&gt;
&lt;td&gt;42.6%&lt;/td&gt;
&lt;td&gt;44.9%&lt;/td&gt;
&lt;td&gt;10.1%&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;53.1&lt;/td&gt;
&lt;td&gt;25.8&lt;/td&gt;
&lt;td&gt;32.7%&lt;/td&gt;
&lt;td&gt;49.4%&lt;/td&gt;
&lt;td&gt;-10.9%&lt;/td&gt;
&lt;td&gt;2.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;52.9&lt;/td&gt;
&lt;td&gt;34.6&lt;/td&gt;
&lt;td&gt;34.8%&lt;/td&gt;
&lt;td&gt;49.5%&lt;/td&gt;
&lt;td&gt;-0.2%&lt;/td&gt;
&lt;td&gt;6.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;From 2010 to 2017, Intel was dominant by every metric. AMD spent this period losing money, cutting headcount, and struggling to produce a competitive architecture. Its gross margins compressed from 45.6% to below 30% in 2015 and 2016 as it competed on price with inferior products.&lt;/p&gt;

&lt;p&gt;The inflection came in 2017 when AMD launched the Zen architecture under Lisa Su. The first Ryzen CPUs and EPYC server chips were genuinely competitive with Intel's best products. The financial data lags the product cycle: revenue did not break meaningfully higher until 2021-2022, and gross margin recovery tracked along with product mix shifting toward EPYC.&lt;/p&gt;

&lt;p&gt;By 2022, AMD's gross margin had exceeded Intel's, a reversal that would have seemed implausible in 2015. By 2024 and 2025, Intel's ROIC had turned negative, meaning the company was destroying capital. Intel's $5 billion investment in foundry capacity between 2020 and 2024 has not yet returned the expected margins, and the company returned a net loss in 2025.&lt;/p&gt;

&lt;p&gt;AMD's ROIC of 6.8% in 2025 is modest, reflecting the Xilinx acquisition ($35 billion, 2022) which dramatically expanded the invested capital base. The business is generating reasonable returns on operating assets; the acquisition debt is working against the ratio.&lt;/p&gt;

&lt;h2&gt;
  
  
  NVIDIA vs AMD: The GPU and AI Accelerator Race
&lt;/h2&gt;

&lt;p&gt;AMD and NVIDIA have been GPU competitors since AMD's 2006 acquisition of ATI Technologies. Both companies design discrete graphics chips for gaming, professional workstations, and data center compute. In 2010, the two companies were comparable in size. By 2025, the gap was $130.5 billion versus $34.6 billion.&lt;/p&gt;

&lt;p&gt;The divergence is almost entirely explained by AI infrastructure.&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;gpu_rivals&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;gpu_revenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;gpu_rivals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mf"&gt;1e9&lt;/span&gt;
&lt;span class="n"&gt;gpu_margins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_gross_margin&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;gpu_rivals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="n"&gt;gpu_roic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_return_on_invested_capital&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;gpu_rivals&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;years&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;NVDA Rev ($B)&lt;/th&gt;
&lt;th&gt;AMD Rev ($B)&lt;/th&gt;
&lt;th&gt;NVDA GM&lt;/th&gt;
&lt;th&gt;AMD GM&lt;/th&gt;
&lt;th&gt;NVDA ROIC&lt;/th&gt;
&lt;th&gt;AMD ROIC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;35.4%&lt;/td&gt;
&lt;td&gt;45.6%&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;td&gt;n/a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2014&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;5.5&lt;/td&gt;
&lt;td&gt;54.9%&lt;/td&gt;
&lt;td&gt;33.4%&lt;/td&gt;
&lt;td&gt;11.6%&lt;/td&gt;
&lt;td&gt;-16.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2018&lt;/td&gt;
&lt;td&gt;9.7&lt;/td&gt;
&lt;td&gt;6.5&lt;/td&gt;
&lt;td&gt;59.9%&lt;/td&gt;
&lt;td&gt;37.8%&lt;/td&gt;
&lt;td&gt;37.5%&lt;/td&gt;
&lt;td&gt;14.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;10.9&lt;/td&gt;
&lt;td&gt;9.8&lt;/td&gt;
&lt;td&gt;62.0%&lt;/td&gt;
&lt;td&gt;44.5%&lt;/td&gt;
&lt;td&gt;24.3%&lt;/td&gt;
&lt;td&gt;50.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2022&lt;/td&gt;
&lt;td&gt;26.9&lt;/td&gt;
&lt;td&gt;23.6&lt;/td&gt;
&lt;td&gt;64.9%&lt;/td&gt;
&lt;td&gt;44.9%&lt;/td&gt;
&lt;td&gt;32.2%&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2024&lt;/td&gt;
&lt;td&gt;60.9&lt;/td&gt;
&lt;td&gt;25.8&lt;/td&gt;
&lt;td&gt;72.7%&lt;/td&gt;
&lt;td&gt;49.4%&lt;/td&gt;
&lt;td&gt;68.4%&lt;/td&gt;
&lt;td&gt;2.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;130.5&lt;/td&gt;
&lt;td&gt;34.6&lt;/td&gt;
&lt;td&gt;75.0%&lt;/td&gt;
&lt;td&gt;49.5%&lt;/td&gt;
&lt;td&gt;102.6%&lt;/td&gt;
&lt;td&gt;6.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Through 2020, the two companies moved roughly in parallel. AMD and NVIDIA were neck-and-neck on revenue. The ROIC numbers for 2020, AMD at 50.2% and NVIDIA at 24.3%, actually show AMD leading, a reflection of AMD's lean capital base at that moment before the Xilinx acquisition.&lt;/p&gt;

&lt;p&gt;The separation happened in 2021 and accelerated through 2022 to 2025. The driver is not gaming GPUs, where AMD's Radeon line remains a genuine competitor for NVIDIA's GeForce range. The driver is AI training infrastructure. NVIDIA's H100 and Blackwell GPUs, running on CUDA, became the default compute substrate for training large language models. The software ecosystem, built over 15 years around CUDA, proved nearly impossible for AMD to replicate quickly with its ROCm platform.&lt;/p&gt;

&lt;p&gt;The financial consequence shows in ROIC. NVIDIA earned 102.6% return on invested capital in 2025. AMD earned 6.8%. Both companies make GPUs. One of them has a software moat that the other does not.&lt;/p&gt;

&lt;p&gt;AMD's position in this race is structurally harder than its Intel rivalry. Against Intel, AMD competes on x86 CPU performance, a problem of engineering execution. Against NVIDIA, AMD competes on AI software ecosystem depth, a problem of developer adoption and network effects that is slower and more expensive to overcome.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Market Is Pricing In
&lt;/h2&gt;

&lt;p&gt;The financial history explains the divergence. Current valuations reflect where the market expects each company to go.&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;pe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_price_to_earnings_ratio&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;ev_ebitda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sector&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_ev_to_ebitda_ratio&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;current_valuation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/E&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pe&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EV/EBITDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ev_ebitda&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EV/EBITDA&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;P/E&lt;/th&gt;
&lt;th&gt;EV/EBITDA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;QCOM&lt;/td&gt;
&lt;td&gt;34.1&lt;/td&gt;
&lt;td&gt;14.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INTC&lt;/td&gt;
&lt;td&gt;neg&lt;/td&gt;
&lt;td&gt;19.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TXN&lt;/td&gt;
&lt;td&gt;31.9&lt;/td&gt;
&lt;td&gt;21.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NVDA&lt;/td&gt;
&lt;td&gt;63.5&lt;/td&gt;
&lt;td&gt;55.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVGO&lt;/td&gt;
&lt;td&gt;72.6&lt;/td&gt;
&lt;td&gt;50.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD&lt;/td&gt;
&lt;td&gt;80.8&lt;/td&gt;
&lt;td&gt;52.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Qualcomm is the cheapest name on EV/EBITDA at 14.2x, pricing in limited AI exposure and the ARM licensing exposure risk. Texas Instruments at 21.3x is being valued as a stable analog business with cyclical revenue sensitivity.&lt;/p&gt;

&lt;p&gt;Intel is uninvestable on P/E (the company is reporting losses) and its EV/EBITDA of 19.1x is elevated relative to the earnings power the business is currently generating. The market is either pricing in a recovery or pricing in acquisition optionality. The gross margin and ROIC data suggest recovery will take years.&lt;/p&gt;

&lt;p&gt;NVIDIA at 63.5x P/E and 55.5x EV/EBITDA is expensive in absolute terms. Whether those multiples are justified depends on whether AI infrastructure CapEx remains elevated and whether NVIDIA maintains its software ecosystem lead. At 102.6% ROIC in 2025, the business is extraordinary; the question is the duration of that advantage.&lt;/p&gt;

&lt;p&gt;AMD at 80.8x P/E trades at a premium to NVIDIA despite lower ROIC and a two-front competitive battle. The premium reflects expectations for ROIC recovery as the Xilinx acquisition amortizes and as AI GPU shipments scale. The execution risk is real.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Screening for Undervalued Stocks with the Finance Toolkit</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:43:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/screening-for-undervalued-stocks-with-the-finance-toolkit-1jnd</link>
      <guid>https://dev.to/jerbouma/screening-for-undervalued-stocks-with-the-finance-toolkit-1jnd</guid>
      <description>&lt;p&gt;With thousands of publicly listed companies, finding undervalued stocks by hand is impractical. A systematic screen changes that: pull valuation multiples across an entire universe, filter by multiple criteria simultaneously, and overlay profitability metrics to separate genuine value from value traps. The Finance Toolkit makes each of those steps a few lines of Python.&lt;/p&gt;

&lt;p&gt;This article walks through a complete screening process from universe definition to a final shortlist. It uses 15 stocks across five sectors to illustrate the logic. A real screen would cast a wider net, and the Discovery module supports that too.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and define a universe of tickers. The example below uses 15 stocks across technology, healthcare, consumer staples, financials, and energy.&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;pandas&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;screener&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INTC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;IBM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JNJ&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PFE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MRK&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;KO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WMT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;JPM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;BAC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;XOM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CVX&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;META&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GOOGL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. The free plan covers five years of history; a paid plan unlocks deeper history and a larger universe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Pulling Valuation Multiples
&lt;/h2&gt;

&lt;p&gt;The first pass uses four ratios to get a broad picture of relative cheapness. P/E and EV/EBITDA are the most common entry points; P/FCF and P/B provide cross-checks that are harder to manipulate.&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;pe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_price_to_earnings_ratio&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;pfcf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_price_to_free_cash_flow_ratio&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;pb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_price_to_book_ratio&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ev_ebitda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_ev_to_ebitda_ratio&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;valuation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/E&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/FCF&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pfcf&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/B&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;pb&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EV/EBITDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;ev_ebitda&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/E&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;P/E&lt;/th&gt;
&lt;th&gt;P/FCF&lt;/th&gt;
&lt;th&gt;P/B&lt;/th&gt;
&lt;th&gt;EV/EBITDA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;INTC&lt;/td&gt;
&lt;td&gt;neg&lt;/td&gt;
&lt;td&gt;neg&lt;/td&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;19.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BAC&lt;/td&gt;
&lt;td&gt;14.3&lt;/td&gt;
&lt;td&gt;32.9&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;14.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRK&lt;/td&gt;
&lt;td&gt;14.5&lt;/td&gt;
&lt;td&gt;21.4&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;10.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JPM&lt;/td&gt;
&lt;td&gt;16.2&lt;/td&gt;
&lt;td&gt;8.9&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;td&gt;18.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XOM&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;td&gt;21.9&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;9.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PFE&lt;/td&gt;
&lt;td&gt;18.3&lt;/td&gt;
&lt;td&gt;15.6&lt;/td&gt;
&lt;td&gt;1.6&lt;/td&gt;
&lt;td&gt;9.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JNJ&lt;/td&gt;
&lt;td&gt;18.8&lt;/td&gt;
&lt;td&gt;25.5&lt;/td&gt;
&lt;td&gt;6.2&lt;/td&gt;
&lt;td&gt;16.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVX&lt;/td&gt;
&lt;td&gt;23.0&lt;/td&gt;
&lt;td&gt;17.0&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;td&gt;8.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KO&lt;/td&gt;
&lt;td&gt;23.0&lt;/td&gt;
&lt;td&gt;56.9&lt;/td&gt;
&lt;td&gt;9.4&lt;/td&gt;
&lt;td&gt;22.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IBM&lt;/td&gt;
&lt;td&gt;26.5&lt;/td&gt;
&lt;td&gt;24.3&lt;/td&gt;
&lt;td&gt;8.6&lt;/td&gt;
&lt;td&gt;21.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;META&lt;/td&gt;
&lt;td&gt;28.1&lt;/td&gt;
&lt;td&gt;36.8&lt;/td&gt;
&lt;td&gt;7.8&lt;/td&gt;
&lt;td&gt;17.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GOOGL&lt;/td&gt;
&lt;td&gt;29.0&lt;/td&gt;
&lt;td&gt;52.2&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;td&gt;25.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MSFT&lt;/td&gt;
&lt;td&gt;35.5&lt;/td&gt;
&lt;td&gt;50.4&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;td&gt;22.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AAPL&lt;/td&gt;
&lt;td&gt;36.4&lt;/td&gt;
&lt;td&gt;41.3&lt;/td&gt;
&lt;td&gt;55.3&lt;/td&gt;
&lt;td&gt;28.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;WMT&lt;/td&gt;
&lt;td&gt;46.3&lt;/td&gt;
&lt;td&gt;71.1&lt;/td&gt;
&lt;td&gt;9.9&lt;/td&gt;
&lt;td&gt;22.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The spread is immediately visible. BAC and MRK trade below 15x earnings. WMT trades at 46x. INTC appears at the top of the sort only because its P/E is negative, since the company reported a net loss, which is why sorting by a single metric is dangerous without additional filters.&lt;/p&gt;

&lt;p&gt;A few other readings worth noting. KO trades at 57x free cash flow despite a relatively modest P/E of 23x, suggesting either elevated CapEx or capital structure effects. P/B of 55.3x for AAPL reflects the reality that Apple has bought back so much equity it has almost none left, a reminder that P/B is most useful for asset-heavy sectors like financials and energy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Applying the Filter
&lt;/h2&gt;

&lt;p&gt;A single-metric screen is easy to game by accounting choices, one-time charges, or unusual capital structures. The approach here requires two metrics to pass simultaneously: a P/E below 20x and an EV/EBITDA below 18x, with negative earners excluded.&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;value_candidates&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;valuation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valuation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/E&lt;/span&gt;&lt;span class="sh"&gt;"&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;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valuation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;P/E&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;valuation&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EV/EBITDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;list&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value_candidates&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;['BAC', 'JNJ', 'MRK', 'PFE', 'XOM']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;JPM passes the P/E filter but misses on EV/EBITDA at 18.7x, marginally above the threshold. CVX passes on EV/EBITDA (8.9x) but its P/E of 23x falls just outside the cut. Five stocks pass both filters: BAC, JNJ, MRK, PFE, and XOM.&lt;/p&gt;

&lt;p&gt;Note that EV/EBITDA is less meaningful for banks, where the concept of enterprise value and operating earnings work differently from industrial companies. JPM at 16x P/E with a P/FCF of 8.9x deserves separate consideration using bank-specific metrics like price-to-tangible-book and return on equity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: The Quality Overlay
&lt;/h2&gt;

&lt;p&gt;Cheap on valuation is not the same as undervalued. The value trap problem is real: stocks trade at low multiples because investors expect deteriorating earnings, balance sheet stress, or structural decline. Before acting on any of the five candidates, the profitability picture needs to hold up.&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;roe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_return_on_equity&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;roic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_return_on_invested_capital&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;gross_margin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;screener&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_gross_margin&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;quality&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pd&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DataFrame&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ROE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;roe&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ROIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;roic&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gross Margin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;gross_margin&lt;/span&gt;
&lt;span class="p"&gt;}).&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;value_candidates&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;ROE&lt;/th&gt;
&lt;th&gt;ROIC&lt;/th&gt;
&lt;th&gt;Gross Margin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;BAC&lt;/td&gt;
&lt;td&gt;9.7%&lt;/td&gt;
&lt;td&gt;4.8%&lt;/td&gt;
&lt;td&gt;56.1%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JNJ&lt;/td&gt;
&lt;td&gt;35.0%&lt;/td&gt;
&lt;td&gt;33.0%&lt;/td&gt;
&lt;td&gt;72.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRK&lt;/td&gt;
&lt;td&gt;36.9%&lt;/td&gt;
&lt;td&gt;28.1%&lt;/td&gt;
&lt;td&gt;71.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PFE&lt;/td&gt;
&lt;td&gt;8.8%&lt;/td&gt;
&lt;td&gt;11.3%&lt;/td&gt;
&lt;td&gt;70.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XOM&lt;/td&gt;
&lt;td&gt;10.7%&lt;/td&gt;
&lt;td&gt;14.8%&lt;/td&gt;
&lt;td&gt;21.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table separates the field. JNJ and MRK both earn above 28% on invested capital with gross margins above 71%. These are not cheap because the business is deteriorating. They are cheap because pharmaceutical stocks have faced broader sector pressure, patent cliff concerns (MRK), and litigation overhangs (JNJ). The underlying profitability is intact.&lt;/p&gt;

&lt;p&gt;XOM earns 14.8% ROIC, which is solid for an energy company operating with significant fixed asset bases. The thin gross margin of 21.7% reflects the commodity economics of oil refining and distribution rather than a structural weakness. The risk here is cyclical: energy earnings compress when oil prices fall.&lt;/p&gt;

&lt;p&gt;PFE at 11.3% ROIC is borderline. Its gross margin of 70.3% confirms the underlying pharmaceutical business generates strong economics, but the headline return metrics are depressed by the revenue reset after COVID vaccine revenues ran off. Whether this is a genuine recovery opportunity or a prolonged restructuring depends on the pipeline.&lt;/p&gt;

&lt;p&gt;BAC at 4.8% ROIC would look like a disqualifier in an industrial context. For a bank, where assets are funded by deposits rather than equity, ROE of 9.7% is the more relevant metric. That said, it suggests the market's discount is modest rather than an obvious bargain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: The Final Screen
&lt;/h2&gt;

&lt;p&gt;Five stocks passed the dual valuation filter. The last step applies a ROIC threshold to separate the genuine opportunities from those where cheap pricing reflects structurally weak returns on capital.&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;final_screen&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;quality&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ROIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mf"&gt;0.10&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;sort_values&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ROIC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ascending&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;ROE&lt;/th&gt;
&lt;th&gt;ROIC&lt;/th&gt;
&lt;th&gt;Gross Margin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;JNJ&lt;/td&gt;
&lt;td&gt;35.0%&lt;/td&gt;
&lt;td&gt;33.0%&lt;/td&gt;
&lt;td&gt;72.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MRK&lt;/td&gt;
&lt;td&gt;36.9%&lt;/td&gt;
&lt;td&gt;28.1%&lt;/td&gt;
&lt;td&gt;71.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XOM&lt;/td&gt;
&lt;td&gt;10.7%&lt;/td&gt;
&lt;td&gt;14.8%&lt;/td&gt;
&lt;td&gt;21.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PFE&lt;/td&gt;
&lt;td&gt;8.8%&lt;/td&gt;
&lt;td&gt;11.3%&lt;/td&gt;
&lt;td&gt;70.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;BAC falls out at 4.8% ROIC under the industrial threshold, though the banking context warrants separate analysis. The remaining four represent meaningfully different risk profiles.&lt;/p&gt;

&lt;p&gt;JNJ and MRK are the strongest combination of value and quality in this screen. Both earn well above their cost of capital, carry strong franchise positions, and trade at multiples that imply no earnings growth, which is conservative given both have significant product pipelines. XOM offers commodity exposure with decent capital efficiency and a low EV/EBITDA of 9.3x, appropriate for investors comfortable with oil cycle risk. PFE is the speculative recovery candidate: the business model is intact, the discount is real, but the recovery timeline is uncertain.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Screen Does Not Tell You
&lt;/h2&gt;

&lt;p&gt;A quantitative screen narrows the field. It does not do the work.&lt;/p&gt;

&lt;p&gt;Each of these names requires analysis the Toolkit can support but cannot automate: debt maturity profiles, near-term earnings catalysts, management capital allocation track records, and sector-specific risk factors. MRK's patent cliff on Keytruda is a known risk not captured in trailing ROIC. XOM's capital expenditure plans depend heavily on a commodity price path no screen can forecast.&lt;/p&gt;

&lt;p&gt;The output of this screen is a watchlist, not a buy list. What it does efficiently is eliminate the 11 stocks where the combination of price and quality does not justify closer attention.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this with the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Screen 15 stocks across technology, healthcare, consumer staples, financials, and energy for P/E below 20, EV/EBITDA below 18, and ROIC above 10%. Show the valuation and quality metrics side by side."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;The Finance Toolkit is open-source and available on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The Finance Toolkit MCP server is accessible directly from Claude, Copilot, Cursor, Windsurf, and Gemini for analysis without writing any code.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>opensource</category>
      <category>ai</category>
      <category>mcp</category>
    </item>
    <item>
      <title>How Microsoft Has Changed Since Its IPO: 40 Years of Financial Data with the Finance Toolkit</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 23 Jun 2026 13:53:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/how-microsoft-has-changed-since-its-ipo-40-years-of-financial-data-with-the-finance-toolkit-21pd</link>
      <guid>https://dev.to/jerbouma/how-microsoft-has-changed-since-its-ipo-40-years-of-financial-data-with-the-finance-toolkit-21pd</guid>
      <description>&lt;p&gt;March 13, 1986. Microsoft went public at $21 per share. Split-adjusted, that works out to roughly $0.08. The stock closed 2025 at $484, making it one of the most remarkable compounding records in market history: a return of more than 5,000x over four decades.&lt;/p&gt;

&lt;p&gt;But the stock price alone obscures something more interesting. The Microsoft that went public in 1986 and the Microsoft that generates $282 billion in annual revenue today are not the same company. The financials show three distinct businesses operating under the same name, each shaped by a different CEO, a different product strategy, and a different relationship with capital. Pulling 40 years of data through the Finance Toolkit makes that transformation visible in a way that no headline number can.&lt;/p&gt;

&lt;p&gt;This article demonstrates using the Finance Toolkit to analyze Microsoft's financial history. It also includes MCP prompts at the end of each section so you can run the same analysis yourself with an AI assistant instead of Python, if you'd rather skip straight to the conversation. &lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and create a Toolkit instance for Microsoft, specifying the ticker, your FMP API key, and the start date for historical data:&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;company&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1986-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. The free plan covers five years of history; a paid plan unlocks the full 40-year dataset used here.&lt;/p&gt;

&lt;h2&gt;
  
  
  Revenue: Three Very Different Eras
&lt;/h2&gt;

&lt;p&gt;Microsoft's revenue history divides cleanly into three phases, each corresponding to a CEO tenure: Bill Gates (1986-2000), Steve Ballmer (2000-2014), and Satya Nadella (2014-present).&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;income_statement&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_income_statement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;revenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;income_statement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Revenue&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net Income&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1986&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1990&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1995&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2005&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Revenue ($B)&lt;/th&gt;
&lt;th&gt;Net Income ($B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1986&lt;/td&gt;
&lt;td&gt;0.2&lt;/td&gt;
&lt;td&gt;0.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1990&lt;/td&gt;
&lt;td&gt;1.2&lt;/td&gt;
&lt;td&gt;0.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;5.9&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;23.0&lt;/td&gt;
&lt;td&gt;9.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;39.8&lt;/td&gt;
&lt;td&gt;12.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;62.5&lt;/td&gt;
&lt;td&gt;18.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;93.6&lt;/td&gt;
&lt;td&gt;12.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;143.0&lt;/td&gt;
&lt;td&gt;44.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;281.7&lt;/td&gt;
&lt;td&gt;101.8&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The Gates era was extraordinary by any standard. Revenue grew from $197 million in 1986 to $23 billion in 2000, a 115-fold increase in 14 years driven almost entirely by Windows and Office on the back of the PC revolution. Microsoft was not really a technology company in the modern sense; it was a licensing machine with near-zero cost of reproduction and near-monopoly pricing power.&lt;/p&gt;

&lt;p&gt;The Ballmer era is often described as a lost decade, but that framing is partly unfair. Revenue grew from $23 billion to $87 billion between 2000 and 2014. That is real growth by any measure. What failed was not the business but the valuation. Ballmer inherited Microsoft at the height of the dot-com bubble, when the market was pricing in decades of compounding at rates no company could sustain. The stock went roughly nowhere for 14 years not because the business stagnated, but because the starting price was simply too high.&lt;/p&gt;

&lt;p&gt;The 2015 net income of $12.2 billion against $93.6 billion in revenue reflects Nadella's first full year, when Microsoft took a $7.5 billion write-down on the Nokia acquisition (&lt;a href="https://en.wikipedia.org/wiki/List_of_mergers_and_acquisitions_by_Microsoft" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;). Strip that out and the underlying business was already accelerating. By 2020, net income had grown to $44 billion. By 2025 it reached $102 billion, a number that would have seemed absurd when Nadella took over.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Show me Microsoft's annual revenue from 1986 to 2025, and identify the three distinct growth phases under Gates, Ballmer, and Nadella."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Profitability: Margins That Compress, Then Recover
&lt;/h2&gt;

&lt;p&gt;The revenue story is straightforward. The margin story is more nuanced.&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;ratios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect_profitability_ratios&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;margins&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Gross Margin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Net Profit Margin&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1990&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1995&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2005&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Gross Margin&lt;/th&gt;
&lt;th&gt;Net Margin&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1990&lt;/td&gt;
&lt;td&gt;82.6%&lt;/td&gt;
&lt;td&gt;23.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;89.8%&lt;/td&gt;
&lt;td&gt;24.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;86.9%&lt;/td&gt;
&lt;td&gt;41.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;84.8%&lt;/td&gt;
&lt;td&gt;30.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;80.2%&lt;/td&gt;
&lt;td&gt;30.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;64.7%&lt;/td&gt;
&lt;td&gt;13.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;67.8%&lt;/td&gt;
&lt;td&gt;31.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;68.8%&lt;/td&gt;
&lt;td&gt;36.2%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Gross margins peaked near 90% in the mid-1990s, reflecting what pure software economics look like. Distributing a copy of Windows cost almost nothing once the disc was pressed. As Microsoft expanded into hardware (Xbox, Surface), services, and cloud infrastructure, the cost structure changed. Azure compute costs real money to run. So does gaming content, data center operations, and technical support at enterprise scale. By 2015, gross margins had compressed to 64.7%.&lt;/p&gt;

&lt;p&gt;That compression has largely stabilized. Azure's gross margin has improved as the infrastructure matures and higher-margin software services (Azure AI, Microsoft 365, Copilot) grow as a share of the mix. The more important metric is net margin, which tells a different story: it has recovered to 36.2% in 2025, approaching the levels Microsoft achieved at the peak of its software monopoly in 2000. The 2015 net margin of 13% is an outlier caused by the Nokia write-down, not a structural deterioration.&lt;/p&gt;

&lt;p&gt;The reason for the recovery is operating leverage. Revenue nearly tripled from 2015 to 2025, but operating expenses did not. Each additional dollar of cloud or subscription revenue drops to the bottom line at an increasingly favorable rate.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"What were Microsoft's gross margin and net profit margin at five-year intervals from 1990 to 2025? Highlight where margins compressed and where they recovered."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Balance Sheet Tells a Story by Decade
&lt;/h2&gt;

&lt;p&gt;Early Microsoft had no debt. None. The business generated more cash than it could spend, and management had no desire to lever up. For most of the Gates era and the first half of the Ballmer era, the balance sheet was a cash accumulation machine.&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;balance_sheet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_balance_sheet_statement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;snapshot&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;balance_sheet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Cash and Short Term Investments&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Long Term Debt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Goodwill&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1995&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2005&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Cash + Investments ($B)&lt;/th&gt;
&lt;th&gt;Long-Term Debt ($B)&lt;/th&gt;
&lt;th&gt;Goodwill ($B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;23.8&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;37.8&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;td&gt;0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;36.8&lt;/td&gt;
&lt;td&gt;4.9&lt;/td&gt;
&lt;td&gt;12.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;96.5&lt;/td&gt;
&lt;td&gt;27.8&lt;/td&gt;
&lt;td&gt;16.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;136.5&lt;/td&gt;
&lt;td&gt;59.6&lt;/td&gt;
&lt;td&gt;43.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;94.6&lt;/td&gt;
&lt;td&gt;40.2&lt;/td&gt;
&lt;td&gt;119.5&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The first debt appeared in 2009, not because Microsoft needed the money, but because borrowing at low rates to fund buybacks was more tax-efficient than repatriating overseas cash. By 2020, cash and investments had reached $136 billion while long-term debt stood at $60 billion. The net position was still comfortably positive, but the capital structure had become more aggressive.&lt;/p&gt;

&lt;p&gt;The most striking shift is goodwill. It was zero for most of Microsoft's history because the company built rather than bought. That changed under Ballmer with acquisitions like aQuantive and Skype, and accelerated dramatically under Nadella. LinkedIn ($26 billion, 2016), GitHub ($7.5 billion, 2018), Nuance ($19 billion, 2022), and Activision Blizzard ($69 billion, 2023) turned Microsoft into one of the most acquisitive companies in tech (&lt;a href="https://en.wikipedia.org/wiki/List_of_mergers_and_acquisitions_by_Microsoft" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;). Goodwill reached $119.5 billion in 2025.&lt;/p&gt;

&lt;p&gt;The cash balance fell from $136 billion in 2020 to $94.6 billion in 2025, largely because of Activision. Long-term debt has declined from its peak of $66.7 billion in 2019 to $40.2 billion in 2025 as Microsoft pays down the acquisition-related borrowing, a sign that the balance sheet is normalising after the deal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Free Cash Flow: The Number That Matters Most
&lt;/h2&gt;

&lt;p&gt;Revenue and earnings can be managed. Free cash flow is harder to fake. It is also the number that ultimately determines what a company is worth. Not the earnings per share, not the operating income, but the actual cash that flows out of the business after maintaining and expanding the asset base.&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;cash_flow&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_cash_flow_statement&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;fcf_table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cash_flow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Operating Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Capital Expenditure&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Free Cash Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1995&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2005&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;Operating Cash Flow ($B)&lt;/th&gt;
&lt;th&gt;CapEx ($B)&lt;/th&gt;
&lt;th&gt;Free Cash Flow ($B)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;-0.5&lt;/td&gt;
&lt;td&gt;1.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;11.4&lt;/td&gt;
&lt;td&gt;-0.9&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2005&lt;/td&gt;
&lt;td&gt;16.6&lt;/td&gt;
&lt;td&gt;-0.8&lt;/td&gt;
&lt;td&gt;15.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;24.1&lt;/td&gt;
&lt;td&gt;-2.0&lt;/td&gt;
&lt;td&gt;22.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;29.7&lt;/td&gt;
&lt;td&gt;-5.9&lt;/td&gt;
&lt;td&gt;23.7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;60.7&lt;/td&gt;
&lt;td&gt;-15.4&lt;/td&gt;
&lt;td&gt;45.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;136.2&lt;/td&gt;
&lt;td&gt;-64.6&lt;/td&gt;
&lt;td&gt;71.6&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Microsoft generated $71.6 billion in free cash flow in fiscal 2025, more than the entire annual revenue of companies like Netflix or Airbnb. It is the product of two converging forces: subscription and consumption revenue that scales without proportional cost increases, and a customer base that has locked itself into the Microsoft ecosystem so deeply that churn is structurally low.&lt;/p&gt;

&lt;p&gt;There is a caveat embedded in those numbers. Capital expenditure has increased from $5.9 billion in 2015 to $64.6 billion in 2025, the vast majority of it AI infrastructure. Microsoft is making an enormous bet on data center capacity to support Azure AI and Copilot services. Whether that $65 billion in annual CapEx generates returns commensurate with its cost will be the defining capital allocation question of the next five years. For now, operating cash flow has grown fast enough to absorb it, but the ratio of FCF to operating cash flow has compressed.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"What was Microsoft's free cash flow in 2015 and 2025? Show the operating cash flow and capital expenditure over time."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Return on Equity: What Buybacks and Leverage Changed
&lt;/h2&gt;

&lt;p&gt;Return on equity sounds like a clean measure of profitability, but it is not always clean. ROE depends on the size of the equity base, which Microsoft has spent the last 15 years shrinking through aggressive buybacks and debt-funded capital return. A company can raise its ROE by buying back enough shares to reduce equity even if underlying profitability does not improve.&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;profitability_ratios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect_profitability_ratios&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;profitability_ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Return on Equity&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Return on Assets&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Return on Invested Capital&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1990&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;1995&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2000&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2010&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Year&lt;/th&gt;
&lt;th&gt;ROE&lt;/th&gt;
&lt;th&gt;ROA&lt;/th&gt;
&lt;th&gt;ROIC&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1990&lt;/td&gt;
&lt;td&gt;37.7%&lt;/td&gt;
&lt;td&gt;30.6%&lt;/td&gt;
&lt;td&gt;36.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1995&lt;/td&gt;
&lt;td&gt;29.3%&lt;/td&gt;
&lt;td&gt;23.1%&lt;/td&gt;
&lt;td&gt;29.3%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2000&lt;/td&gt;
&lt;td&gt;27.0%&lt;/td&gt;
&lt;td&gt;20.7%&lt;/td&gt;
&lt;td&gt;27.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2010&lt;/td&gt;
&lt;td&gt;43.8%&lt;/td&gt;
&lt;td&gt;22.9%&lt;/td&gt;
&lt;td&gt;47.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2015&lt;/td&gt;
&lt;td&gt;14.4%&lt;/td&gt;
&lt;td&gt;7.0%&lt;/td&gt;
&lt;td&gt;19.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020&lt;/td&gt;
&lt;td&gt;40.1%&lt;/td&gt;
&lt;td&gt;15.1%&lt;/td&gt;
&lt;td&gt;30.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2025&lt;/td&gt;
&lt;td&gt;33.3%&lt;/td&gt;
&lt;td&gt;18.0%&lt;/td&gt;
&lt;td&gt;30.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The early Microsoft numbers are a reminder of what a capital-light monopoly looks like. ROE of 38% in 1990 with zero debt and no buybacks means the underlying business was genuinely that profitable. Those returns compressed through the 2000s as the business mix changed and the equity base remained large.&lt;/p&gt;

&lt;p&gt;The 2015 figures are distorted by the Nokia write-down, which depressed net income and inflated the apparent collapse in ROA and ROE. By 2020 ROE had rebounded to 40%, though this partly reflects the equity base shrinking from buybacks rather than purely improved profitability. ROIC strips out the effects of capital structure and tells a cleaner story: Microsoft earns roughly 30-31% on invested capital today, which is very good but not dramatically different from what it earned in the 1990s. The business quality has been maintained; what changed is how the returns are distributed to shareholders.&lt;/p&gt;

&lt;p&gt;Return on assets paints a similar picture. ROA of 18% in 2025 reflects that Microsoft now carries a much heavier asset base of cloud infrastructure, acquisitions, and data centers than the software company of the 1990s. The high-30s ROA of the Gates era is gone, but 18% is a strong number for a company of this size and scope.&lt;/p&gt;

&lt;h2&gt;
  
  
  Looking Ahead
&lt;/h2&gt;

&lt;p&gt;Forty years of operating history tell you what Microsoft has been. Valuation multiples tell you what the market thinks it will be. The tables below show where Microsoft's key ratios and risk-adjusted performance metrics have stood over the past six years, alongside the Alpha and Beta figures that put the stock's behaviour in market context.&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;valuation_ratios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect_valuation_ratios&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;current_valuation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;valuation_ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Price-to-Earnings&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Price-to-Book&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Price-to-Free-Cash-Flow&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EV-to-EBITDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2021&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2023&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="n"&gt;performance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;company&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect_all_metrics&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="n"&gt;alpha_beta_performance&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;loc&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2021&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2022&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2023&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2024&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Beta&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Alpha&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;2020&lt;/th&gt;
&lt;th&gt;2021&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2023&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;P/E&lt;/td&gt;
&lt;td&gt;38.6&lt;/td&gt;
&lt;td&gt;41.8&lt;/td&gt;
&lt;td&gt;24.9&lt;/td&gt;
&lt;td&gt;38.8&lt;/td&gt;
&lt;td&gt;35.7&lt;/td&gt;
&lt;td&gt;35.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P/B&lt;/td&gt;
&lt;td&gt;14.4&lt;/td&gt;
&lt;td&gt;18.0&lt;/td&gt;
&lt;td&gt;10.9&lt;/td&gt;
&lt;td&gt;13.6&lt;/td&gt;
&lt;td&gt;11.7&lt;/td&gt;
&lt;td&gt;10.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;P/FCF&lt;/td&gt;
&lt;td&gt;37.8&lt;/td&gt;
&lt;td&gt;45.6&lt;/td&gt;
&lt;td&gt;27.8&lt;/td&gt;
&lt;td&gt;47.2&lt;/td&gt;
&lt;td&gt;42.5&lt;/td&gt;
&lt;td&gt;50.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;EV/EBITDA&lt;/td&gt;
&lt;td&gt;27.0&lt;/td&gt;
&lt;td&gt;32.2&lt;/td&gt;
&lt;td&gt;19.1&lt;/td&gt;
&lt;td&gt;27.9&lt;/td&gt;
&lt;td&gt;24.5&lt;/td&gt;
&lt;td&gt;22.7&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;2020&lt;/th&gt;
&lt;th&gt;2021&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2023&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Beta&lt;/td&gt;
&lt;td&gt;1.14&lt;/td&gt;
&lt;td&gt;1.15&lt;/td&gt;
&lt;td&gt;1.28&lt;/td&gt;
&lt;td&gt;1.16&lt;/td&gt;
&lt;td&gt;1.19&lt;/td&gt;
&lt;td&gt;0.88&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Alpha&lt;/td&gt;
&lt;td&gt;+0.25&lt;/td&gt;
&lt;td&gt;+0.24&lt;/td&gt;
&lt;td&gt;-0.09&lt;/td&gt;
&lt;td&gt;+0.33&lt;/td&gt;
&lt;td&gt;-0.11&lt;/td&gt;
&lt;td&gt;-0.02&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At 35x earnings and 50x free cash flow, Microsoft is priced for sustained growth. The P/FCF ratio in particular looks stretched on the surface, but it needs to be read alongside the elevated CapEx. Microsoft spent $64.6 billion on capital expenditure in fiscal 2025, the vast majority of it on AI infrastructure. If that investment generates meaningful Azure revenue growth over the next three to five years, the normalized FCF picture is more attractive than the headline ratio suggests. If it does not, the multiple will prove optimistic.&lt;/p&gt;

&lt;p&gt;Beta declining to 0.88 in 2025 is notable. For most of the Nadella era, Microsoft moved in line with or slightly above the broader market. A beta below 1 suggests the market increasingly treats it as a defensive-quality holding: a large, profitable, cash-generative business that belongs in portfolios regardless of the macro environment.&lt;/p&gt;

&lt;p&gt;Alpha has been positive in most years, notably +0.33 in 2023 when Microsoft's AI positioning drove a 57% stock return against the S&amp;amp;P 500's 26%. The negative alpha in 2022 and 2024 reflects years when the market rotated toward other sectors, not fundamental deterioration. The business compounded steadily throughout.&lt;/p&gt;

&lt;p&gt;What to watch over the next few years: the pace of Azure growth (which funds everything else), margin expansion as the AI CapEx cycle matures, and whether Activision contributes enough to earnings to justify the $69 billion price tag. The financial track record over 40 years gives Microsoft the benefit of the doubt. But at these valuations, the margin for error is narrower than it has been at any point in the company's history outside the dot-com peak.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Try this in the Finance Toolkit MCP:&lt;/strong&gt; &lt;em&gt;"Pull Microsoft's current valuation ratios and its yearly Beta and Alpha since 2020. Is the market pricing it as a growth stock or a defensive one right now?"&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;The Finance Toolkit is open-source and available on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The Finance Toolkit MCP server is accessible directly from Claude, Copilot, Cursor, Windsurf, and Gemini for analysis without writing any code.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
    <item>
      <title>Access 200+ Financial Metrics with the Finance Toolkit (Python Library + MCP Server)</title>
      <dc:creator>Jeroen Bouma</dc:creator>
      <pubDate>Tue, 16 Jun 2026 13:28:00 +0000</pubDate>
      <link>https://dev.to/jerbouma/access-200-financial-metrics-with-the-finance-toolkit-python-library-mcp-server-3m4c</link>
      <guid>https://dev.to/jerbouma/access-200-financial-metrics-with-the-finance-toolkit-python-library-mcp-server-3m4c</guid>
      <description>&lt;p&gt;On the 6th of May, 2023, Microsoft's Price-to-Earnings ratio was reported as 28.93 by Stockopedia, 32.05 by Morningstar, 32.66 by Macrotrends, 33.67 by the Wall Street Journal, and 34.4 by Companies Market Cap. Every one of those numbers is "correct." They just use different definitions of earnings, different share counts, and different rounding. None of the providers publish the formula, so there is no way to know which one matches the calculation you actually want.&lt;/p&gt;

&lt;p&gt;That inconsistency is why I built the Finance Toolkit: an open-source Python library where every ratio, indicator, and model is implemented in plain, readable code you can audit yourself. It covers 200+ metrics across equities, options, currencies, crypto, ETFs, indices, and macroeconomic data going back over a century, all sourced from 30+ years of financial statements. On top of the library sits an MCP server that exposes the same 200+ metrics to any AI assistant that supports the Model Context Protocol, so you (or your assistant) never have to choose between writing Python and asking a question in plain English.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The source code for every calculation is on &lt;a href="https://github.com/JerBouma/FinanceToolkit" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. The MCP server documentation lives &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Things Up
&lt;/h2&gt;

&lt;p&gt;The Python library and the MCP server are the same engine with two different front doors. Start with the Python side, since understanding it makes the MCP tool calls easier to reason about later.&lt;/p&gt;

&lt;p&gt;Start by installing the Finance Toolkit:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;financetoolkit &lt;span class="nt"&gt;-U&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then import the library and create a Toolkit instance. Each section below swaps in a different ticker universe, since the point is showing the breadth of what one consistent API can pull, but the syntax never changes.&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;companies&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MSFT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AAPL&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020-01-01&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;Get your FMP API key at &lt;a href="https://www.jeroenbouma.com/fmp" rel="noopener noreferrer"&gt;jeroenbouma.com/fmp&lt;/a&gt;. The free plan covers five years of history and 250 requests a day; a paid plan unlocks the full 30+ years and quarterly data, at a 15% discount through that (affiliate) link. I do provide means to provide your own data as well, see &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/external-datasets" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  From Code to Conversation: the MCP Server
&lt;/h2&gt;

&lt;p&gt;Writing Python is not always the fastest way to get an answer, and getting an AI assistant to reason accurately over financial data by itself usually falls short: web search is unreliable, scraped data is inconsistent across sources (see the PE example above), and models hallucinate numbers when they cannot find them. The Finance Toolkit MCP server fixes this by giving any MCP-compatible assistant direct, structured access to the same 200+ metrics, backed by the transparent calculation methods in the library.&lt;/p&gt;

&lt;p&gt;You do not need a local Python environment to use it. A single command configures your AI client automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;uvx &lt;span class="nt"&gt;--from&lt;/span&gt; &lt;span class="s2"&gt;"financetoolkit[mcp]"&lt;/span&gt; financetoolkit-mcp-setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This supports Claude Desktop, Claude Code, GitHub Copilot in VS Code, Cursor, Windsurf, and Gemini. If you use Claude Desktop specifically, there is also a one-click MCPB bundle on the &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/mcp#claude-desktop" rel="noopener noreferrer"&gt;latest GitHub release&lt;/a&gt; that skips the terminal entirely. Either way, you will be asked for the same FMP API key used above, and the free plan is enough to get started.&lt;/p&gt;

&lt;p&gt;Once it is running, the server groups the 200+ Finance Toolkit methods into about 21 categorical tools. You never name a function or set a parameter yourself; the assistant picks the right tool from your question and returns structured output. The depth of interpretation scales with the model: Claude Sonnet layers in qualitative reasoning on top of the numbers, while smaller models like GPT-5 mini return clean structured data without the narrative. Both work, since the server is built to support either.&lt;/p&gt;

&lt;p&gt;Within Claude Desktop, it will look like below once setup.&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.amazonaws.com%2Fuploads%2Farticles%2Fq0o5322rfem76oub01l5.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.amazonaws.com%2Fuploads%2Farticles%2Fq0o5322rfem76oub01l5.png" alt="Once everything is setup, you should see the Finance Toolkit as one of the available connectors." width="799" height="587"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Equity Analysis: Margins, Returns, and Multiples Side by Side
&lt;/h2&gt;

&lt;p&gt;The Finance Toolkit was built with equity research first, which is why this is the deepest category: profitability, valuation, efficiency, liquidity, and solvency ratios, plus models like WACC, DuPont decomposition, the Altman Z-Score, and the Piotroski F-Score. A good stress test for any of these is an industry where growth rates differ wildly between names that are nominally in the same business: semiconductors.&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;chips&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NVDA&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ASML&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TSM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AVGO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;INTC&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;QCOM&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;TXN&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;AMAT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2015-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;cumulative_return&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chips&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_historical_data&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;pe&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chips&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_price_to_earnings_ratio&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;ev_ebitda&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chips&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_ev_to_ebitda_ratio&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;eps_growth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chips&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_earnings_per_share&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;growth&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;revenue_per_share&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;chips&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ratios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_revenue_per_share&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2025&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;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;Cumulative Return (2015-2025)&lt;/th&gt;
&lt;th&gt;P/E (2025)&lt;/th&gt;
&lt;th&gt;EV/EBITDA (2025)&lt;/th&gt;
&lt;th&gt;EPS Growth (2025)&lt;/th&gt;
&lt;th&gt;Revenue/Share (2025)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;NVDA&lt;/td&gt;
&lt;td&gt;+42,215%&lt;/td&gt;
&lt;td&gt;63.5x&lt;/td&gt;
&lt;td&gt;55.5x&lt;/td&gt;
&lt;td&gt;+146.2%&lt;/td&gt;
&lt;td&gt;$5.26&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMD&lt;/td&gt;
&lt;td&gt;+20,344%&lt;/td&gt;
&lt;td&gt;80.8x&lt;/td&gt;
&lt;td&gt;52.2x&lt;/td&gt;
&lt;td&gt;+164.3%&lt;/td&gt;
&lt;td&gt;$21.17&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AVGO&lt;/td&gt;
&lt;td&gt;+3,935%&lt;/td&gt;
&lt;td&gt;72.6x&lt;/td&gt;
&lt;td&gt;50.5x&lt;/td&gt;
&lt;td&gt;+286.2%&lt;/td&gt;
&lt;td&gt;$13.16&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AMAT&lt;/td&gt;
&lt;td&gt;+2,347%&lt;/td&gt;
&lt;td&gt;29.7x&lt;/td&gt;
&lt;td&gt;23.8x&lt;/td&gt;
&lt;td&gt;+0.6%&lt;/td&gt;
&lt;td&gt;$35.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TSM&lt;/td&gt;
&lt;td&gt;+1,981%&lt;/td&gt;
&lt;td&gt;28.4x&lt;/td&gt;
&lt;td&gt;18.0x&lt;/td&gt;
&lt;td&gt;+57.2%&lt;/td&gt;
&lt;td&gt;$23.75&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ASML&lt;/td&gt;
&lt;td&gt;+1,762%&lt;/td&gt;
&lt;td&gt;36.9x&lt;/td&gt;
&lt;td&gt;28.0x&lt;/td&gt;
&lt;td&gt;+45.0%&lt;/td&gt;
&lt;td&gt;$98.67&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;QCOM&lt;/td&gt;
&lt;td&gt;+297%&lt;/td&gt;
&lt;td&gt;34.1x&lt;/td&gt;
&lt;td&gt;14.2x&lt;/td&gt;
&lt;td&gt;-44.1%&lt;/td&gt;
&lt;td&gt;$40.08&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;TXN&lt;/td&gt;
&lt;td&gt;+585%&lt;/td&gt;
&lt;td&gt;31.9x&lt;/td&gt;
&lt;td&gt;21.3x&lt;/td&gt;
&lt;td&gt;+4.8%&lt;/td&gt;
&lt;td&gt;$19.37&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INTC&lt;/td&gt;
&lt;td&gt;+352%&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;19.1x&lt;/td&gt;
&lt;td&gt;-98.75%&lt;/td&gt;
&lt;td&gt;$10.88&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The dispersion inside one industry is the whole story here: NVDA turned a 2015 position into roughly 421 times its starting value, while INTC is (compared to NVDA) essentially flat a decade later, its P/E reported as negative because it posted a net loss and its EPS collapsing 98.75% in 2025 alone. AVGO's EPS growth of 286.2% outpaces even NVDA, reflecting the VMware acquisition layered on top of its AI networking business rather than organic chip sales growth, worth separating out before reading too much into the headline number. ASML trades at the richest EV/EBITDA multiple in the group (28.0x) despite the slowest revenue-per-share base of the bunch in absolute growth terms, a premium the market assigns to its effective monopoly on the EUV lithography machines every leading-edge fab depends on.&lt;/p&gt;

&lt;p&gt;A call with the Finance Toolkit MCP would return an answer such as below.&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.amazonaws.com%2Fuploads%2Farticles%2Fhbwucatw62srxqu3qc3v.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.amazonaws.com%2Fuploads%2Farticles%2Fhbwucatw62srxqu3qc3v.png" alt="Semiconductors went from a cyclical industrial sector to the backbone of AI infrastructure over the last decade and the market priced that transition in full. NVDA and AMD returned over 150x since 2015 while the S&amp;amp;P 500 compounded quietly at the bottom of the same chart." width="800" height="998"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Technical Analysis: Is the Market Overbought?
&lt;/h2&gt;

&lt;p&gt;Technical indicators work off OHLC price data, so they apply to any asset class the Toolkit supports, not just equities. RSI, MACD, the Stochastic Oscillator, and Bollinger Bands are all available, grouped under categories like momentum, volatility, and overlap. The clearest stress test for a momentum indicator is a market shock, so this one looks at European sector ETFs through the 2020 Corona crash and the year that followed.&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;sectors&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXV9.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXV1.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXV4.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXI5.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXV3.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXH9.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXH1.DE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2019-11-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;rsi&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sectors&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;technicals&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_relative_strength_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;monthly&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;These are iShares STOXX Europe 600 sector UCITS ETFs: EXV9.DE (Travel &amp;amp; Leisure), EXV1.DE (Banks), EXV4.DE (Health Care), EXI5.DE (Real Estate), EXV3.DE (Technology), EXH9.DE (Utilities), and EXH1.DE (Oil &amp;amp; Gas).&lt;/p&gt;

&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;th&gt;Travel &amp;amp; Leisure&lt;/th&gt;
&lt;th&gt;Banks&lt;/th&gt;
&lt;th&gt;Health Care&lt;/th&gt;
&lt;th&gt;Real Estate&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;th&gt;Utilities&lt;/th&gt;
&lt;th&gt;Oil &amp;amp; Gas&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;2019-12&lt;/td&gt;
&lt;td&gt;63.3&lt;/td&gt;
&lt;td&gt;51.4&lt;/td&gt;
&lt;td&gt;77.0&lt;/td&gt;
&lt;td&gt;70.4&lt;/td&gt;
&lt;td&gt;72.7&lt;/td&gt;
&lt;td&gt;89.7&lt;/td&gt;
&lt;td&gt;51.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-03&lt;/td&gt;
&lt;td&gt;26.9&lt;/td&gt;
&lt;td&gt;31.9&lt;/td&gt;
&lt;td&gt;65.9&lt;/td&gt;
&lt;td&gt;36.2&lt;/td&gt;
&lt;td&gt;53.2&lt;/td&gt;
&lt;td&gt;51.9&lt;/td&gt;
&lt;td&gt;26.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-06&lt;/td&gt;
&lt;td&gt;30.2&lt;/td&gt;
&lt;td&gt;26.2&lt;/td&gt;
&lt;td&gt;70.2&lt;/td&gt;
&lt;td&gt;39.5&lt;/td&gt;
&lt;td&gt;59.1&lt;/td&gt;
&lt;td&gt;59.9&lt;/td&gt;
&lt;td&gt;21.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2020-09&lt;/td&gt;
&lt;td&gt;34.9&lt;/td&gt;
&lt;td&gt;28.9&lt;/td&gt;
&lt;td&gt;61.5&lt;/td&gt;
&lt;td&gt;44.0&lt;/td&gt;
&lt;td&gt;61.6&lt;/td&gt;
&lt;td&gt;57.6&lt;/td&gt;
&lt;td&gt;19.3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021-01&lt;/td&gt;
&lt;td&gt;40.7&lt;/td&gt;
&lt;td&gt;35.4&lt;/td&gt;
&lt;td&gt;48.4&lt;/td&gt;
&lt;td&gt;40.7&lt;/td&gt;
&lt;td&gt;61.0&lt;/td&gt;
&lt;td&gt;57.9&lt;/td&gt;
&lt;td&gt;34.5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021-05&lt;/td&gt;
&lt;td&gt;77.0&lt;/td&gt;
&lt;td&gt;79.0&lt;/td&gt;
&lt;td&gt;63.3&lt;/td&gt;
&lt;td&gt;75.3&lt;/td&gt;
&lt;td&gt;80.9&lt;/td&gt;
&lt;td&gt;71.2&lt;/td&gt;
&lt;td&gt;61.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2021-12&lt;/td&gt;
&lt;td&gt;61.7&lt;/td&gt;
&lt;td&gt;79.5&lt;/td&gt;
&lt;td&gt;79.1&lt;/td&gt;
&lt;td&gt;74.5&lt;/td&gt;
&lt;td&gt;83.3&lt;/td&gt;
&lt;td&gt;65.9&lt;/td&gt;
&lt;td&gt;76.3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Oil &amp;amp; Gas was the most oversold sector of the whole crisis, bottoming at an RSI of 19.3 in September 2020, well past the typical oversold line of 30, and it stayed depressed there for most of the year as travel demand collapse fed straight through to fuel demand. Banks were close behind, troughing at 26.2 in June 2020 and not climbing back above the 40 mark until November, longer than any other sector here took to recover. Health Care and Technology never came close to oversold even at the worst of the March 2020 crash, with RSI bottoming at 65.9 and 53.2 respectively, the closest thing to a flight-to-quality signal in this dataset.&lt;/p&gt;

&lt;p&gt;The more striking part is the reversal. The same two sectors that bottomed hardest, Oil &amp;amp; Gas and Banks, both closed 2021 deep in overbought territory at 76.3 and 79.5, a swing of roughly 50 to 60 RSI points in eighteen months. That is the kind of regime change a single point-in-time RSI reading would never catch; it only shows up when you pull the full series.&lt;/p&gt;

&lt;p&gt;A call with the Finance Toolkit MCP is showing what I mean:&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.amazonaws.com%2Fuploads%2Farticles%2Fef2dxd12heokum126nsl.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.amazonaws.com%2Fuploads%2Farticles%2Fef2dxd12heokum126nsl.png" alt="The COVID crash was swift but uneven. Airlines collapsed into extreme oversold territory with RSI hitting 22 in April 2020. Alevel that signals panic selling, not fundamental repricing. Technology barely dipped. Oil &amp;amp; Gas, untouched by the initial shock, swung to RSI 91 a year later as the energy cycle turned." width="800" height="1012"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Risk and Performance: What the Fama-French Factors Reveal About South American Stocks
&lt;/h2&gt;

&lt;p&gt;Beta and alpha alone treat "the market" as the only systematic risk that matters. The Fama-French five-factor model goes further, decomposing returns into exposure to the market (Mkt-RF), company size (SMB), value versus growth (HML), profitability (RMW), and investment intensity (CMA), plus an R-squared that tells you how much of the return that combination actually explains. South American equities are a good test case, since they mix commodity exporters, banks, and a tech name that behaves nothing like the rest of the region.&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Toolkit&lt;/span&gt;

&lt;span class="n"&gt;south_america&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Toolkit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;tickers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;PBR&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YPF&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;VALE&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SCCO&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ITUB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CIB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;MELI&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;GGB&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;api_key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;YOUR_FMP_API_KEY&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2021-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;fama_french&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;south_america&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;performance&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_fama_and_french_model&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;yearly&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;Which returns, for 2025:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;Mkt-RF&lt;/th&gt;
&lt;th&gt;SMB&lt;/th&gt;
&lt;th&gt;HML&lt;/th&gt;
&lt;th&gt;RMW&lt;/th&gt;
&lt;th&gt;CMA&lt;/th&gt;
&lt;th&gt;R²&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ITUB (Itau, bank)&lt;/td&gt;
&lt;td&gt;0.0167&lt;/td&gt;
&lt;td&gt;-0.0023&lt;/td&gt;
&lt;td&gt;-0.0071&lt;/td&gt;
&lt;td&gt;-0.0116&lt;/td&gt;
&lt;td&gt;-0.0051&lt;/td&gt;
&lt;td&gt;0.683&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCCO (Southern Copper, mining)&lt;/td&gt;
&lt;td&gt;0.0146&lt;/td&gt;
&lt;td&gt;0.0000&lt;/td&gt;
&lt;td&gt;-0.0047&lt;/td&gt;
&lt;td&gt;-0.0117&lt;/td&gt;
&lt;td&gt;-0.0033&lt;/td&gt;
&lt;td&gt;0.529&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VALE (Vale, mining)&lt;/td&gt;
&lt;td&gt;0.0118&lt;/td&gt;
&lt;td&gt;0.0042&lt;/td&gt;
&lt;td&gt;-0.0086&lt;/td&gt;
&lt;td&gt;0.0032&lt;/td&gt;
&lt;td&gt;-0.0103&lt;/td&gt;
&lt;td&gt;0.511&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CIB (Bancolombia, bank)&lt;/td&gt;
&lt;td&gt;0.0109&lt;/td&gt;
&lt;td&gt;-0.0029&lt;/td&gt;
&lt;td&gt;0.0024&lt;/td&gt;
&lt;td&gt;-0.0107&lt;/td&gt;
&lt;td&gt;-0.0101&lt;/td&gt;
&lt;td&gt;0.340&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MELI (MercadoLibre, e-commerce)&lt;/td&gt;
&lt;td&gt;0.0087&lt;/td&gt;
&lt;td&gt;-0.0001&lt;/td&gt;
&lt;td&gt;-0.0005&lt;/td&gt;
&lt;td&gt;-0.0023&lt;/td&gt;
&lt;td&gt;-0.0049&lt;/td&gt;
&lt;td&gt;0.122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;YPF (YPF, energy)&lt;/td&gt;
&lt;td&gt;0.0067&lt;/td&gt;
&lt;td&gt;0.0023&lt;/td&gt;
&lt;td&gt;-0.0027&lt;/td&gt;
&lt;td&gt;-0.0041&lt;/td&gt;
&lt;td&gt;-0.0008&lt;/td&gt;
&lt;td&gt;0.192&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GGB (Gerdau, steel)&lt;/td&gt;
&lt;td&gt;0.0063&lt;/td&gt;
&lt;td&gt;-0.0029&lt;/td&gt;
&lt;td&gt;-0.0014&lt;/td&gt;
&lt;td&gt;-0.0110&lt;/td&gt;
&lt;td&gt;-0.0009&lt;/td&gt;
&lt;td&gt;0.276&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PBR (Petrobras, energy)&lt;/td&gt;
&lt;td&gt;0.0057&lt;/td&gt;
&lt;td&gt;-0.0017&lt;/td&gt;
&lt;td&gt;0.0002&lt;/td&gt;
&lt;td&gt;-0.0037&lt;/td&gt;
&lt;td&gt;0.0009&lt;/td&gt;
&lt;td&gt;0.169&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The R-squared column is the most useful read here, since it tells you how reliable the rest of the row is. ITUB's 2025 regression explains 68.3% of its return variance through these five factors, the highest in the group and typical of a large, liquid bank whose returns track broad risk factors closely. MELI sits at the other extreme: only 12.2% of its return is explained by the model, which fits a company whose price action is driven far more by idiosyncratic growth narrative and earnings surprises than by size, value, or investment-style exposures.&lt;/p&gt;

&lt;p&gt;That gap widens when you look at the trend across years rather than a single snapshot:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;2021&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2023&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;MELI R²&lt;/td&gt;
&lt;td&gt;0.619&lt;/td&gt;
&lt;td&gt;0.347&lt;/td&gt;
&lt;td&gt;0.213&lt;/td&gt;
&lt;td&gt;0.334&lt;/td&gt;
&lt;td&gt;0.122&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VALE R²&lt;/td&gt;
&lt;td&gt;0.131&lt;/td&gt;
&lt;td&gt;0.196&lt;/td&gt;
&lt;td&gt;0.408&lt;/td&gt;
&lt;td&gt;0.489&lt;/td&gt;
&lt;td&gt;0.511&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCCO R²&lt;/td&gt;
&lt;td&gt;0.149&lt;/td&gt;
&lt;td&gt;0.288&lt;/td&gt;
&lt;td&gt;0.299&lt;/td&gt;
&lt;td&gt;0.471&lt;/td&gt;
&lt;td&gt;0.529&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;MELI's R-squared has fallen almost every year since 2021, from 0.619 to 0.122, meaning the five-factor model explains less and less of its return over time as the stock has decoupled further from traditional risk factors. VALE and SCCO show the opposite pattern, with explanatory power roughly tripling over the same five years as both mining names became more tightly linked to broad market and value-style risk during the commodity cycle. None of that shows up in a beta or alpha calculation alone, which is the case for running the full factor model instead of stopping at single-factor CAPM.&lt;/p&gt;

&lt;p&gt;A call with the Finance Toolkit MCP would return an answer such as below. Note that the LLM picked a different timeframe which is why there is a mismatch between these results and the table above.&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.amazonaws.com%2Fuploads%2Farticles%2Fmcpyhbr1gwkezepzvss0.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.amazonaws.com%2Fuploads%2Farticles%2Fmcpyhbr1gwkezepzvss0.png" alt="The Fama-French 5-factor model decomposes stock returns into market beta, size, value, profitability, and investment exposure. Applied to South American industries, it reveals that MercadoLibre behaves more like a US growth stock than a Latin American consumer play while energy names like Petrobras and YPF are primarily market-beta bets with a secondary value tilt." width="800" height="1024"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Macroeconomic Analysis: Tracking Asia's Growth Engines
&lt;/h2&gt;

&lt;p&gt;Macroeconomic data goes back over a century and covers 60+ countries: unemployment, GDP growth, inflation, trade balances, government debt, central bank rates, and government bond yields, sourced from the &lt;a href="https://www.oecd.org/en/data/indicators.html?orderBy=mostRelevant&amp;amp;page=0&amp;amp;facetTags=oecd-languages%3Aen" rel="noopener noreferrer"&gt;OECD&lt;/a&gt; and the &lt;a href="https://www.globalmacrodata.com/" rel="noopener noreferrer"&gt;Global Macro Database&lt;/a&gt;. It is available through the &lt;code&gt;economics&lt;/code&gt; module on a Toolkit instance, or as a fully standalone module if you only need macro data.&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;from&lt;/span&gt; &lt;span class="n"&gt;financetoolkit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Economics&lt;/span&gt;

&lt;span class="n"&gt;economics&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Economics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;start_date&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;2020-01-01&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;gdp_growth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;economics&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_gross_domestic_product&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;countries&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;India&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Vietnam&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Indonesia&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;China&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;South Korea&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
    &lt;span class="n"&gt;growth&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which returns:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Country&lt;/th&gt;
&lt;th&gt;2020&lt;/th&gt;
&lt;th&gt;2021&lt;/th&gt;
&lt;th&gt;2022&lt;/th&gt;
&lt;th&gt;2023&lt;/th&gt;
&lt;th&gt;2024&lt;/th&gt;
&lt;th&gt;2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;India&lt;/td&gt;
&lt;td&gt;-1.2%&lt;/td&gt;
&lt;td&gt;18.9%&lt;/td&gt;
&lt;td&gt;14.2%&lt;/td&gt;
&lt;td&gt;9.6%&lt;/td&gt;
&lt;td&gt;10.1%&lt;/td&gt;
&lt;td&gt;10.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vietnam&lt;/td&gt;
&lt;td&gt;4.4%&lt;/td&gt;
&lt;td&gt;5.5%&lt;/td&gt;
&lt;td&gt;12.5%&lt;/td&gt;
&lt;td&gt;7.1%&lt;/td&gt;
&lt;td&gt;10.4%&lt;/td&gt;
&lt;td&gt;9.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Indonesia&lt;/td&gt;
&lt;td&gt;-2.5%&lt;/td&gt;
&lt;td&gt;9.9%&lt;/td&gt;
&lt;td&gt;15.4%&lt;/td&gt;
&lt;td&gt;6.7%&lt;/td&gt;
&lt;td&gt;7.6%&lt;/td&gt;
&lt;td&gt;7.7%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;China&lt;/td&gt;
&lt;td&gt;3.5%&lt;/td&gt;
&lt;td&gt;11.7%&lt;/td&gt;
&lt;td&gt;5.0%&lt;/td&gt;
&lt;td&gt;4.6%&lt;/td&gt;
&lt;td&gt;4.5%&lt;/td&gt;
&lt;td&gt;6.4%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;South Korea&lt;/td&gt;
&lt;td&gt;0.9%&lt;/td&gt;
&lt;td&gt;7.9%&lt;/td&gt;
&lt;td&gt;4.6%&lt;/td&gt;
&lt;td&gt;3.3%&lt;/td&gt;
&lt;td&gt;5.5%&lt;/td&gt;
&lt;td&gt;4.0%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;India has held growth above 9.5% every year since the 2020 contraction, while China has settled into a slower mid-single-digit pace after its 2021 reopening spike. South Korea, the most mature economy in this group, tracks closest to developed-market growth rates throughout. None of this required scraping a single government website or reconciling conflicting definitions across sources, which is the same problem this whole project started from.&lt;/p&gt;

&lt;p&gt;A call with the Finance Toolkit MCP would return an answer such as below.&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.amazonaws.com%2Fuploads%2Farticles%2F6o1jp35n33itf807nhx5.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.amazonaws.com%2Fuploads%2Farticles%2F6o1jp35n33itf807nhx5.png" alt="Investment as a share of GDP is one of the cleanest leading indicators of structural economic development. Vietnam and India led the region in the 2000s, fuelling their infrastructure and manufacturing buildouts. Bangladesh has been rising steadily since 2010. The hallmark of an economy still in the upgrading phase, not yet plateauing like Malaysia or Thailand." width="800" height="1042"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;This only covers four of the roughly 21 categories the MCP server groups its tools into. The same approach extends to options Greeks, fixed income yield curves, ESG scores, revenue segmentation by product and geography and a Discovery module for screening across 80,000+ tickers. A Portfolio module that loads your own positions from a spreadsheet is also available albeit only through the Python library due to the added complexity. All of it is documented &lt;a href="https://www.jeroenbouma.com/projects/financetoolkit/docs" rel="noopener noreferrer"&gt;here&lt;/a&gt;, and all of it is queryable the moment the MCP server is connected.&lt;/p&gt;

</description>
      <category>python</category>
      <category>ai</category>
      <category>opensource</category>
      <category>mcp</category>
    </item>
  </channel>
</rss>
