<?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: Daniel Oliveira</title>
    <description>The latest articles on DEV Community by Daniel Oliveira (@daniel_oliveira_4bd55d35d).</description>
    <link>https://dev.to/daniel_oliveira_4bd55d35d</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%2F4071986%2Fe3ad517f-a098-4b70-bf03-148835a4f133.jpg</url>
      <title>DEV Community: Daniel Oliveira</title>
      <link>https://dev.to/daniel_oliveira_4bd55d35d</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/daniel_oliveira_4bd55d35d"/>
    <language>en</language>
    <item>
      <title>Broadcom and Ford dropped NetIncomeLoss from their 2025 XBRL: a quick check for SEC tag changes</title>
      <dc:creator>Daniel Oliveira</dc:creator>
      <pubDate>Thu, 08 Oct 2026 19:54:58 +0000</pubDate>
      <link>https://dev.to/daniel_oliveira_4bd55d35d/broadcom-and-ford-dropped-netincomeloss-from-their-2025-xbrl-a-quick-check-for-sec-tag-changes-4bef</link>
      <guid>https://dev.to/daniel_oliveira_4bd55d35d/broadcom-and-ford-dropped-netincomeloss-from-their-2025-xbrl-a-quick-check-for-sec-tag-changes-4bef</guid>
      <description>&lt;p&gt;This week a &lt;a href="https://dev.to/northpine-studio/is-cash-flow-keeping-up-with-net-income-a-five-ticker-check-from-sec-xbrl-data-136l"&gt;five-ticker cash-flow check&lt;/a&gt; here on DEV came back without Ford's 2025 row. The data was there; the tag wasn't. Ford's 2025 10-K reports the year's result as &lt;code&gt;ProfitLoss&lt;/code&gt; and never uses &lt;code&gt;us-gaap:NetIncomeLoss&lt;/code&gt;, so a pipeline that asks for &lt;code&gt;NetIncomeLoss&lt;/code&gt; sees Ford's annual figures stop at 2024.&lt;/p&gt;

&lt;p&gt;I wanted to know how common that is, so I checked every SEC filer. I build &lt;a href="https://equibles.com" rel="noopener noreferrer"&gt;Equibles&lt;/a&gt;, which serves these SEC facts to ChatGPT and Claude over MCP, but everything below uses only SEC's free public API, and the script at the end runs without any account.&lt;/p&gt;

&lt;h2&gt;
  
  
  The frames API does the heavy lifting
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;https://data.sec.gov/api/xbrl/frames/us-gaap/{concept}/USD/{period}.json&lt;/code&gt; returns one row per filer for a concept and calendar period, with the CIK, name, value, dates and the accession it came from. A whole-market comparison is a handful of requests instead of thousands of company downloads.&lt;/p&gt;

&lt;p&gt;The check:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Filers still reporting: &lt;code&gt;NetCashProvidedByUsedInOperatingActivities&lt;/code&gt; for &lt;code&gt;CY2025&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;NetIncomeLoss&lt;/code&gt; for &lt;code&gt;CY2024&lt;/code&gt; and for &lt;code&gt;CY2025&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;A filer with a 2024 value, no 2025 value and a 2025 cash flow statement changed tags, since a 10-K still has to show the year's result.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ProfitLoss&lt;/code&gt; for &lt;code&gt;CY2025&lt;/code&gt; shows where they went.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Results (data pulled October 8, 2026)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Filers with 2025 operating cash flow: 5,772
Tagged NetIncomeLoss for 2024, not for 2025: 21
...of which report ProfitLoss for 2025: 21
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All 21 moved to &lt;code&gt;ProfitLoss&lt;/code&gt;. The ten largest by operating cash flow:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Company&lt;/th&gt;
&lt;th&gt;NetIncomeLoss, 2024&lt;/th&gt;
&lt;th&gt;ProfitLoss, 2025&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Broadcom&lt;/td&gt;
&lt;td&gt;$5,895M&lt;/td&gt;
&lt;td&gt;$23,126M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ford Motor&lt;/td&gt;
&lt;td&gt;$5,879M&lt;/td&gt;
&lt;td&gt;-$8,162M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AvalonBay Communities&lt;/td&gt;
&lt;td&gt;$1,082M&lt;/td&gt;
&lt;td&gt;$1,057M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Invesco&lt;/td&gt;
&lt;td&gt;$538M&lt;/td&gt;
&lt;td&gt;-$175M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Primerica&lt;/td&gt;
&lt;td&gt;$471M&lt;/td&gt;
&lt;td&gt;$751M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Levi Strauss&lt;/td&gt;
&lt;td&gt;$211M&lt;/td&gt;
&lt;td&gt;$578M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fidelis Insurance&lt;/td&gt;
&lt;td&gt;$113M&lt;/td&gt;
&lt;td&gt;$226M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Driven Brands&lt;/td&gt;
&lt;td&gt;-$292M&lt;/td&gt;
&lt;td&gt;$132M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Paysafe&lt;/td&gt;
&lt;td&gt;$22M&lt;/td&gt;
&lt;td&gt;-$183M&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Advanced Energy Industries&lt;/td&gt;
&lt;td&gt;$54M&lt;/td&gt;
&lt;td&gt;$148M&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;21 out of 5,772 is small, but two of them are among the largest US issuers, and a screen keyed on &lt;code&gt;NetIncomeLoss&lt;/code&gt; shows Broadcom with no 2025 earnings at all.&lt;/p&gt;

&lt;p&gt;Two things to know before swapping in &lt;code&gt;ProfitLoss&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It includes noncontrolling interests.&lt;/strong&gt; Ford's -$8,162M becomes -$8,182M attributable to Ford once you remove the $20M of &lt;code&gt;NetIncomeLossAttributableToNoncontrollingInterest&lt;/code&gt;. For most filers the gap is zero or small, but it is not the same measure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not every case is a clean swap.&lt;/strong&gt; AvalonBay's 2025 10-K still tags &lt;code&gt;NetIncomeLoss&lt;/code&gt; for 2023 and 2024, the comparative columns, but not for 2025.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Revenue is messier
&lt;/h2&gt;

&lt;p&gt;The same diff on the two common revenue tags, &lt;code&gt;Revenues&lt;/code&gt; and &lt;code&gt;RevenueFromContractWithCustomerExcludingAssessedTax&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;84 still-filing companies had one of them for 2024 and neither for 2025.&lt;/li&gt;
&lt;li&gt;Only 6 of those simply switched from one to the other.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The rest moved to other tags, or have no non-dimensional revenue fact in the API. L3Harris is the largest: $21.3B of 2024 revenue under a standard tag, and for fiscal 2025 the company facts API has no standard revenue concept for the year at all. I didn't classify all 84; several are lenders and banks, such as Navient and FB Bancorp, so check industry-specific tags before calling a gap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three defenses
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Fallback chains per measure, with the definition attached.&lt;/strong&gt; For net income: &lt;code&gt;NetIncomeLoss&lt;/code&gt;, then &lt;code&gt;ProfitLoss&lt;/code&gt; minus &lt;code&gt;NetIncomeLossAttributableToNoncontrollingInterest&lt;/code&gt;. Record which tag produced each value.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A coverage check per company.&lt;/strong&gt; Compare the newest period of the concept you use with the newest period of anything the company reports. If the concept stops a year early while operating cash flow keeps going, flag it instead of treating the series as finished.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Rerun the diff every filing season.&lt;/strong&gt; The script below is eight requests.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The script
&lt;/h2&gt;

&lt;p&gt;Set &lt;code&gt;USER_AGENT&lt;/code&gt; to your name and email; SEC requires one.&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;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;

&lt;span class="n"&gt;USER_AGENT&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 Name your.email@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;span class="n"&gt;BASE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://data.sec.gov/api/xbrl/frames/us-gaap/{concept}/USD/{period}.json&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;request&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;BASE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;concept&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;concept&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="n"&gt;period&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="n"&gt;headers&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;User-Agent&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;USER_AGENT&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;load&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;data&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0.2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# stay well under SEC's 10 requests per second
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;cik&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="c1"&gt;# Still filing: reported operating cash flow for calendar 2025.
&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NetCashProvidedByUsedInOperatingActivities&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;CY2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;net_income_2024&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NetIncomeLoss&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;CY2024&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;net_income_2025&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NetIncomeLoss&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;CY2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;profit_loss_2025&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ProfitLoss&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;CY2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;dropped&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="n"&gt;cik&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;net_income_2024&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;net_income_2025&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;moved_to_profit_loss&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;dropped&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;profit_loss_2025&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Filers with 2025 operating cash flow: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tagged NetIncomeLoss for 2024, not for 2025: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropped&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;...of which report ProfitLoss for 2025: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;moved_to_profit_loss&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;print&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;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dropped&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nf"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;val&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;])):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;entityName&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;net_income_2024&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;val&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="n"&gt;after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;profit_loss_2025&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;val&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="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;profit_loss_2025&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;
    &lt;span class="n"&gt;after_text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt; &lt;span class="ow"&gt;is&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;n/a&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;  NetIncomeLoss 2024 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;M  ProfitLoss 2025 &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;after_text&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;M&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# Revenue: had either common tag for 2024, neither for 2025.
&lt;/span&gt;&lt;span class="n"&gt;revenue_tags&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;Revenues&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;RevenueFromContractWithCustomerExcludingAssessedTax&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;had_2024&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;has_2025&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="nf"&gt;set&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;tag&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;revenue_tags&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;had_2024&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CY2024&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;has_2025&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CY2025&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;lost_revenue&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;had_2024&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;has_2025&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;cik&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;active&lt;/span&gt;&lt;span class="p"&gt;]&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;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Tagged a common revenue concept for 2024, neither for 2025: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lost_revenue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Frames include only non-dimensional facts, take the latest filing for each period, and map 52/53-week years to the nearest calendar year (L3Harris's year ended January 2, 2026 lands in &lt;code&gt;CY2025&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;On the Equibles side, the net-income series falls back across these tags, so Ford and Broadcom both have 2025 rows. It takes &lt;code&gt;ProfitLoss&lt;/code&gt; as filed, so Ford's figure includes the $20M noncontrolling share. The MCP tool also adds a coverage warning when a concept's series ends well before the company's other facts; the details are in the &lt;a href="https://equibles.com/docs/mcp/tools/fundamentals" rel="noopener noreferrer"&gt;fundamentals tool docs&lt;/a&gt;, and Ford's statements are on its &lt;a href="https://equibles.com/stocks/f/financials" rel="noopener noreferrer"&gt;financials page&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I build Equibles. This post was written by an AI agent from SEC's public XBRL frames and company facts APIs; every figure comes from a run on October 8, 2026. Nothing here is investment advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>finance</category>
      <category>datascience</category>
      <category>api</category>
    </item>
    <item>
      <title>Diff two 13F filings by CUSIP (and check an AI's "what did Berkshire buy?" answer)</title>
      <dc:creator>Daniel Oliveira</dc:creator>
      <pubDate>Thu, 08 Oct 2026 02:25:32 +0000</pubDate>
      <link>https://dev.to/daniel_oliveira_4bd55d35d/diff-two-13f-filings-by-cusip-and-check-an-ais-what-did-berkshire-buy-answer-7ad</link>
      <guid>https://dev.to/daniel_oliveira_4bd55d35d/diff-two-13f-filings-by-cusip-and-check-an-ais-what-did-berkshire-buy-answer-7ad</guid>
      <description>&lt;p&gt;A common question to put to an AI assistant is "what did this fund buy last quarter?", and the answer comes from Form 13F-HR. I build &lt;a href="https://equibles.com" rel="noopener noreferrer"&gt;Equibles&lt;/a&gt;, which has an MCP server that answers it. In this post I check one of its answers, Berkshire Hathaway's changes for the quarter ended June 30, 2026, against the filings on SEC EDGAR with a short Python script, and list the traps that make a naive check (or a naive answer) wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Ask through MCP
&lt;/h2&gt;

&lt;p&gt;The server is at &lt;code&gt;https://mcp.equibles.com/mcp&lt;/code&gt;. In ChatGPT or Claude, add it as a connector; in Claude Code it is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude mcp add &lt;span class="nt"&gt;--transport&lt;/span&gt; http equibles https://mcp.equibles.com/mcp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sign-in is OAuth, and the free tier allows 100 requests a day. Setup for other clients is in the &lt;a href="https://equibles.com/docs/mcp" rel="noopener noreferrer"&gt;MCP docs&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The tool behind a question like "what did Berkshire Hathaway change in its latest 13F?" is &lt;code&gt;GetInstitutionQuarterlyActivity&lt;/code&gt;. For this post I called it directly with Berkshire's SEC CIK, &lt;code&gt;1067983&lt;/code&gt;. It compared the June 30, 2026 report with March 31, 2026 and returned these changes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bucket&lt;/th&gt;
&lt;th&gt;Ticker&lt;/th&gt;
&lt;th&gt;Prior shares&lt;/th&gt;
&lt;th&gt;New shares&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Initiated&lt;/td&gt;
&lt;td&gt;DHI&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;3,564&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;GOOGL&lt;/td&gt;
&lt;td&gt;54,249,798&lt;/td&gt;
&lt;td&gt;78,791,167&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;GOOG&lt;/td&gt;
&lt;td&gt;3,585,215&lt;/td&gt;
&lt;td&gt;27,188,433&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;DAL&lt;/td&gt;
&lt;td&gt;39,809,456&lt;/td&gt;
&lt;td&gt;57,320,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;LEN&lt;/td&gt;
&lt;td&gt;10,099,642&lt;/td&gt;
&lt;td&gt;13,111,741&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;NYT&lt;/td&gt;
&lt;td&gt;15,146,535&lt;/td&gt;
&lt;td&gt;15,700,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;M&lt;/td&gt;
&lt;td&gt;3,038,355&lt;/td&gt;
&lt;td&gt;7,347,426&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Increased&lt;/td&gt;
&lt;td&gt;LEN-B&lt;/td&gt;
&lt;td&gt;237,703&lt;/td&gt;
&lt;td&gt;298,117&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;td&gt;BAC&lt;/td&gt;
&lt;td&gt;513,624,165&lt;/td&gt;
&lt;td&gt;483,394,015&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;td&gt;DVA&lt;/td&gt;
&lt;td&gt;30,100,585&lt;/td&gt;
&lt;td&gt;28,880,209&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;td&gt;KR&lt;/td&gt;
&lt;td&gt;50,000,000&lt;/td&gt;
&lt;td&gt;39,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;td&gt;COF&lt;/td&gt;
&lt;td&gt;7,150,000&lt;/td&gt;
&lt;td&gt;3,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;td&gt;NUE&lt;/td&gt;
&lt;td&gt;3,907,075&lt;/td&gt;
&lt;td&gt;1,857,752&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reduced&lt;/td&gt;
&lt;td&gt;ALLY&lt;/td&gt;
&lt;td&gt;29,000,000&lt;/td&gt;
&lt;td&gt;27,000,000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exited&lt;/td&gt;
&lt;td&gt;STZ&lt;/td&gt;
&lt;td&gt;632,890&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Fifteen changes. Now the check.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Find the two filings on EDGAR
&lt;/h2&gt;

&lt;p&gt;Every filer's history is in &lt;code&gt;https://data.sec.gov/submissions/CIK0001067983.json&lt;/code&gt;. The two 13F-HR filings I need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quarter ended March 31, 2026: accession &lt;code&gt;0001193125-26-226661&lt;/code&gt;, filed May 15, 2026 (&lt;a href="https://www.sec.gov/Archives/edgar/data/1067983/000119312526226661/0001193125-26-226661-index.html" rel="noopener noreferrer"&gt;index&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Quarter ended June 30, 2026: accession &lt;code&gt;0001193125-26-352200&lt;/code&gt;, filed August 14, 2026 (&lt;a href="https://www.sec.gov/Archives/edgar/data/1067983/000119312526352200/0001193125-26-352200-index.html" rel="noopener noreferrer"&gt;index&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each filing folder holds a &lt;code&gt;primary_doc.xml&lt;/code&gt; cover page and an information table XML with one &lt;code&gt;&amp;lt;infoTable&amp;gt;&lt;/code&gt; element per row. File names vary by filer agent, so the script finds the table by its root element, &lt;code&gt;informationTable&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Diff them by CUSIP
&lt;/h2&gt;

&lt;p&gt;The script below uses only the standard library. It finds the information table in each filing folder, sums shares per CUSIP, and prints every position whose share count changed. It also warns when a filing leaves positions out under confidential treatment (trap 6).&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="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Diff two 13F-HR filings by CUSIP, straight from SEC EDGAR.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;urllib.request&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;xml.etree.ElementTree&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;ET&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;collections&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;defaultdict&lt;/span&gt;

&lt;span class="c1"&gt;# SEC asks automated clients to identify themselves.
&lt;/span&gt;&lt;span class="n"&gt;HEADERS&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;User-Agent&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;your-name your-email@example.com&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;NS&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;t&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;http://www.sec.gov/edgar/document/thirteenf/informationtable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;req&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;HEADERS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;urllib&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;urlopen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;req&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;rsplit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;holdings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;accession&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Sum share counts per CUSIP across every row of the information table.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="n"&gt;folder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;https://www.sec.gov/Archives/edgar/data/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;accession&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;-&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="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
    &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loads&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/index.json&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;directory&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;item&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;cover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ET&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/primary_doc.xml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="n"&gt;omitted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;isConfidentialOmitted&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;true&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;cover&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;iter&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="c1"&gt;# The information table is the XML whose root element is informationTable.
&lt;/span&gt;    &lt;span class="n"&gt;root&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;doc&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ET&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fromstring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;folder&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;
                                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;endswith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;.xml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;name&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="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;primary_doc.xml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;local&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;doc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;informationTable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;shares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;defaultdict&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findall&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t:infoTable&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NS&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t:putCall&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NS&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;  &lt;span class="c1"&gt;# options are not share ownership
&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t:shrsOrPrnAmt/t:sshPrnamtType&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;SH&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;  &lt;span class="c1"&gt;# PRN rows are dollars of principal, not shares
&lt;/span&gt;        &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t:cusip&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;shares&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nf"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t:shrsOrPrnAmt/t:sshPrnamt&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NS&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;row&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findtext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;t:nameOfIssuer&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;namespaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;NS&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;omitted&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;WARNING: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;accession&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; omits positions under confidential treatment; &lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
              &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;they arrive later in a 13F-HR/A&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;shares&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;


&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prior_accession&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;latest_accession&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;old_names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows_before&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;holdings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prior_accession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new_names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;rows_after&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;holdings&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cik&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;latest_accession&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;old_names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="n"&gt;new_names&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rows: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rows_before&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;rows_after&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;, positions: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nf"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
        &lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;after&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="n"&gt;label&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;NEW&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;EXIT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;ADD&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;CUT&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
        &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;label&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;old&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; -&amp;gt; &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="si"&gt;:&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;


&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Put your own name and email in the User-Agent, then run it with the CIK and the two accession numbers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python3 diff_13f.py 1067983 0001193125-26-226661 0001193125-26-352200
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output from my run of the revised script on October 9, 2026:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;rows: 90 -&amp;gt; 89, positions: 29 -&amp;gt; 29
CUT  ALLY FINL INC              02005N100    29,000,000 -&amp;gt;    27,000,000
ADD  ALPHABET INC               02079K107     3,585,215 -&amp;gt;    27,188,433
ADD  ALPHABET INC               02079K305    54,249,798 -&amp;gt;    78,791,167
CUT  BANK OF AMER CORP          060505104   513,624,165 -&amp;gt;   483,394,015
CUT  CAPITAL ONE FINL CORP      14040H105     7,150,000 -&amp;gt;     3,000,000
EXIT CONSTELLATION BRANDS INC   21036P108       632,890 -&amp;gt;             0
NEW  D R HORTON INC             23331A109             0 -&amp;gt;         3,564
CUT  DAVITA INC                 23918K108    30,100,585 -&amp;gt;    28,880,209
ADD  DELTA AIR LINES INC        247361702    39,809,456 -&amp;gt;    57,320,000
CUT  KROGER CO                  501044101    50,000,000 -&amp;gt;    39,000,000
ADD  LENNAR CORP                526057104    10,099,642 -&amp;gt;    13,111,741
ADD  LENNAR CORP                526057302       237,703 -&amp;gt;       298,117
ADD  MACYS INC                  55616P104     3,038,355 -&amp;gt;     7,347,426
ADD  NEW YORK TIMES CO MTN BE   650111107    15,146,535 -&amp;gt;    15,700,000
CUT  NUCOR CORP                 670346105     3,907,075 -&amp;gt;     1,857,752
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All fifteen changes match the MCP table share for share, including the 3,564-share D.R. Horton position and both Alphabet classes. Neither filing prints a confidential-treatment warning.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Six traps the script handles (and an answer should too)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;One position is many rows.&lt;/strong&gt; The June filing has 89 rows but only 29 distinct CUSIPs. Berkshire splits a position across rows by the combination of reporting managers listed for it, and 19 of the 29 positions span more than one row; Bank of America alone takes 8. Compare single rows across quarters and you will report trades that never happened. Sum per CUSIP first.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key on CUSIP, never on the issuer name.&lt;/strong&gt; Issuer names are free text typed by the filer, and they drift. In the March filing the bank is &lt;code&gt;BANK AMERICA CORP&lt;/code&gt; and the insurer is &lt;code&gt;CHUBB LTD SWITZ&lt;/code&gt;; in June they are &lt;code&gt;BANK OF AMER CORP&lt;/code&gt; and &lt;code&gt;CHUBB LIMITED&lt;/code&gt;. A diff keyed on names reports that Berkshire sold its entire Bank of America stake and bought 483 million shares of a "new" company, then does the same for Chubb.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A change in value is not a trade.&lt;/strong&gt; Each row carries a reported dollar value. Berkshire's Bank of America share count fell by 30,230,150, yet the reported value rose from $25.04 billion to $27.54 billion because the price went up. New York Times went the other way: 553,465 more shares, $169.5 million less value. Rank by share change when the question is what the fund did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share classes are separate lines.&lt;/strong&gt; Alphabet Class A (&lt;code&gt;02079K305&lt;/code&gt;) and Class C (&lt;code&gt;02079K107&lt;/code&gt;) have different CUSIPs. Berkshire added to both, 24.5 million and 23.6 million shares, so "Berkshire added 24.5 million Alphabet shares" leaves out half the buying.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Size before headline.&lt;/strong&gt; "Berkshire opened a position in D.R. Horton" is accurate and nearly meaningless: 3,564 shares with a reported value of $580,504, about 0.0002% of the $299.25 billion the filing reports in total. A good answer puts the size next to the label.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A filing can leave positions out on purpose.&lt;/strong&gt; A manager can ask the SEC to keep a position confidential for a time. The filing's summary page then sets &lt;code&gt;isConfidentialOmitted&lt;/code&gt; to true, and the position shows up months later in a 13F-HR/A marked NEW HOLDINGS. Berkshire's original filing for September 30, 2023 did this, and the amendment filed May 15, 2024 added 8,143,530 shares of Chubb. Run the script on that quarter and it prints the warning. A share-for-share match shows the tool read the filing correctly, not that the filing is the whole book, so for a "what did they buy" answer, check for an amendment and re-run once it lands.&lt;/p&gt;

&lt;p&gt;One timing caveat applies to all of it: a 13F shows holdings on the last day of the quarter and can be filed up to 45 days later, so this filing describes June 30, 2026, not today. It also covers only long positions in 13(f) securities. Options appear as rows with a &lt;code&gt;putCall&lt;/code&gt; field, which the script skips (the June filing has none). Rows whose &lt;code&gt;sshPrnamtType&lt;/code&gt; is &lt;code&gt;PRN&lt;/code&gt; count dollars of principal, such as convertible notes, not shares, so the script skips those too.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Make it routine
&lt;/h2&gt;

&lt;p&gt;When an assistant answers a 13F question, ask it for the report date and the accession number, then run a check like this whenever the answer matters. On the Equibles side, the tool reference is in the &lt;a href="https://equibles.com/docs/mcp/tools/holdings" rel="noopener noreferrer"&gt;holdings docs&lt;/a&gt;, the same data is available through the &lt;a href="https://equibles.com/docs/api/endpoints/holdings" rel="noopener noreferrer"&gt;REST API&lt;/a&gt; for scheduled jobs, and Berkshire's filings are browsable on its &lt;a href="https://equibles.com/institutions/1067983/berkshire-hathaway-inc" rel="noopener noreferrer"&gt;institution page&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Updated October 9, 2026, after a reader's comment: the script now finds the information table by its root element, skips principal (PRN) rows and warns on confidential treatment, and trap 6 is new. The output above is from a re-run of the revised script.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build Equibles. This post was written by an AI agent working from the EDGAR filings named above; every figure was re-derived from them on October 8 and 9, 2026, and the script output is from an actual run. Nothing here is investment advice.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>python</category>
      <category>finance</category>
      <category>mcp</category>
      <category>ai</category>
    </item>
    <item>
      <title>6 Best Stock Market MCP Servers in 2026: Real-Time &amp; SEC Data</title>
      <dc:creator>Daniel Oliveira</dc:creator>
      <pubDate>Mon, 10 Aug 2026 20:46:27 +0000</pubDate>
      <link>https://dev.to/daniel_oliveira_4bd55d35d/6-best-stock-market-mcp-servers-in-2026-real-time-sec-data-je9</link>
      <guid>https://dev.to/daniel_oliveira_4bd55d35d/6-best-stock-market-mcp-servers-in-2026-real-time-sec-data-je9</guid>
      <description>&lt;p&gt;Most lists of stock market MCP servers quietly compare price feeds. That is useful if an agent only needs a quote. It is not enough when the question starts in an 8-K, continues into management guidance, and ends with institutional ownership or an option chain.&lt;/p&gt;

&lt;p&gt;For that wider research job, my pick is &lt;strong&gt;Equibles&lt;/strong&gt;. It is the best overall fit here because one connection joins hybrid keyword and semantic search across SEC filings and earnings-call transcripts, XBRL fundamentals, management guidance, company-specific KPIs, 13F holdings, insider transactions, daily stock prices, intraday quotes, and options data.&lt;/p&gt;

&lt;p&gt;The boundary matters: &lt;strong&gt;Massive is better for real-time tick, quote, and options feeds&lt;/strong&gt;. &lt;strong&gt;EODHD is better for global exchange breadth&lt;/strong&gt;. &lt;strong&gt;EdgarTools is better for a local, Python-first EDGAR workflow&lt;/strong&gt;. “Best” changes with the assignment.&lt;/p&gt;

&lt;h2&gt;
  
  
  My ranking at a glance
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rank&lt;/th&gt;
&lt;th&gt;Stock market MCP server&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Main trade-off&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://equibles.com/docs/mcp" rel="noopener noreferrer"&gt;Equibles&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Joined U.S. equity research across filings, fundamentals, guidance, ownership, prices, and options&lt;/td&gt;
&lt;td&gt;U.S.-listed focus; not a consolidated tick or order-book feed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://docs.financialdatasets.ai/mcp-server" rel="noopener noreferrer"&gt;Financial Datasets&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Structured financials, segments, company KPIs, guidance, 13F, and insider data&lt;/td&gt;
&lt;td&gt;No options, transcript, or semantic document-search tool is listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;3&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.massive.com/docs/ai-tools/quickstart" rel="noopener noreferrer"&gt;Massive&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Real-time U.S. stock and options market data&lt;/td&gt;
&lt;td&gt;No filing or earnings-call research corpus is documented&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://edgartools.readthedocs.io/en/stable/ai/mcp-tools/" rel="noopener noreferrer"&gt;EdgarTools&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SEC filings, XBRL, ownership forms, and Python-first analysis&lt;/td&gt;
&lt;td&gt;No earnings-call transcript, stock-price, or options tool is listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://eodhd.com/financial-apis/mcp-server-for-financial-data-by-eodhd" rel="noopener noreferrer"&gt;EODHD&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;International instruments, exchanges, fundamentals, and market data&lt;/td&gt;
&lt;td&gt;No filing-search or transcript tool is listed; freshness varies by dataset&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://github.com/alphavantage/alpha_vantage_mcp" rel="noopener noreferrer"&gt;Alpha Vantage&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-asset prices, options, macro data, news, and technical indicators&lt;/td&gt;
&lt;td&gt;Has transcripts, but no semantic filing-and-transcript search is documented&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What I compared
&lt;/h2&gt;

&lt;p&gt;I reviewed each provider's first-party documentation on 10 August 2026. I did not run the same production benchmark against all six servers, so this is a documentation-based product-fit review. It does not score latency, uptime, support, or answer accuracy.&lt;/p&gt;

&lt;p&gt;I used a research task that forces several datasets to work together:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Find what management changed in its guidance, verify the supporting financial facts and company-specific KPIs, check the current stock and option data, then show whether insiders or large institutions changed their positions.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That task tests eight things:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Semantic and exact-keyword search across both SEC filings and earnings-call transcripts.&lt;/li&gt;
&lt;li&gt;Source passages and exact lines that can be checked.&lt;/li&gt;
&lt;li&gt;Fundamentals with fiscal period, unit, and filing provenance.&lt;/li&gt;
&lt;li&gt;Management guidance with ranges, periods, and GAAP or non-GAAP basis.&lt;/li&gt;
&lt;li&gt;Company-specific KPIs such as ARR, backlog, subscribers, units delivered, DAU/MAU, same-store sales, or adjusted EBITDA.&lt;/li&gt;
&lt;li&gt;13F and insider records that preserve the meaning of the original forms.&lt;/li&gt;
&lt;li&gt;Daily and current stock prices with their feed timestamp or delay stated.&lt;/li&gt;
&lt;li&gt;Option expirations, chains, prices, implied volatility, open interest, and greeks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;“Company-specific KPIs” does not mean a metric invented by the model. It means a measure the company itself reports, even when standardized XBRL does not carry it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Feature comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Server&lt;/th&gt;
&lt;th&gt;Filings, transcripts, and search&lt;/th&gt;
&lt;th&gt;Guidance and company KPIs&lt;/th&gt;
&lt;th&gt;13F and insiders&lt;/th&gt;
&lt;th&gt;Stock and options data&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Equibles&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Hybrid keyword and semantic search across filings and calls; source excerpts and exact-line retrieval&lt;/td&gt;
&lt;td&gt;Extracted guidance, source wording, KPI histories, non-GAAP bridges&lt;/td&gt;
&lt;td&gt;13F portfolios and changes; Forms 3, 4, and 144&lt;/td&gt;
&lt;td&gt;Daily OHLCV, intraday quotes, technicals, option chains, IV, OI, and greeks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Financial Datasets&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Filing items and structured financials; no transcript or semantic document-search tool listed&lt;/td&gt;
&lt;td&gt;KPI guidance, operating KPIs, and non-GAAP measures&lt;/td&gt;
&lt;td&gt;13F, 13D/G, insider ownership, and insider trades&lt;/td&gt;
&lt;td&gt;Current and historical stock prices; no options tool listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Massive&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No filing or earnings-call corpus documented; natural-language search discovers API endpoints&lt;/td&gt;
&lt;td&gt;Not a documented MCP specialty&lt;/td&gt;
&lt;td&gt;Not a documented MCP specialty&lt;/td&gt;
&lt;td&gt;Real-time and historical stocks and options through entitled REST and WebSocket products&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EdgarTools&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SEC EFTS full-text search, parsed filings, sections, and notes; no earnings-call transcripts listed&lt;/td&gt;
&lt;td&gt;Filing content can be read, but no dedicated guidance/KPI extraction tool is listed&lt;/td&gt;
&lt;td&gt;Insider transactions and institutional portfolios&lt;/td&gt;
&lt;td&gt;No market-price or options tools listed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;EODHD&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fundamentals, but no filing-search or transcript tool listed&lt;/td&gt;
&lt;td&gt;Earnings trends and estimates rather than filing-grounded KPI extraction&lt;/td&gt;
&lt;td&gt;Depends on the selected dataset&lt;/td&gt;
&lt;td&gt;Live and historical prices, U.S. streams, technicals, and U.S. options data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Alpha Vantage&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Earnings-call transcript endpoint, but no filing-passage or semantic corpus search listed&lt;/td&gt;
&lt;td&gt;Earnings and transcripts, but no dedicated company-KPI guidance tool listed&lt;/td&gt;
&lt;td&gt;Institutional holdings and insider transactions&lt;/td&gt;
&lt;td&gt;Intraday, real-time bulk quotes, real-time and historical options, plus technical indicators&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The table describes documented capabilities, not equivalent test results. Among these six MCP catalogs as reviewed on 10 August 2026, Equibles is the only one that documents semantic search across a shared corpus of SEC filings and earnings-call transcripts, with an exact-keyword and line-reading path for verification. Alpha Vantage provides transcripts without that cross-corpus search. EdgarTools provides SEC EFTS full-text search without earnings-call transcripts. The other three do not list an equivalent transcript-search workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Equibles: best overall for joined U.S. equity research
&lt;/h2&gt;

&lt;p&gt;Equibles ranks first because the useful unit is not one API response. It is the path from source document to reported fact to market and ownership context.&lt;/p&gt;

&lt;p&gt;Its &lt;a href="https://equibles.com/docs/mcp/tools/filings" rel="noopener noreferrer"&gt;filings tools&lt;/a&gt; use hybrid keyword-plus-semantic matching across 10-K, 10-Q, 8-K, 20-F, 6-K, and earnings-call transcripts. The agent can search every company, one company, or one document by meaning, then switch to exact-keyword search and retrieve precise lines around the hit. That makes the source passage part of the answer instead of a link added after the fact.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://equibles.com/docs/mcp/tools/fundamentals" rel="noopener noreferrer"&gt;fundamentals tools&lt;/a&gt; cover more than standardized statements. They include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;XBRL facts and full income, balance-sheet, and cash-flow statements.&lt;/li&gt;
&lt;li&gt;Revenue breakdowns by business, product, service, and geography.&lt;/li&gt;
&lt;li&gt;Company-reported KPIs with their original wording, period shape, source quote, and comparable year-over-year change.&lt;/li&gt;
&lt;li&gt;Management guidance with the range, unit, fiscal period, GAAP or non-GAAP basis, and source filing or call.&lt;/li&gt;
&lt;li&gt;Actual-versus-guidance checks after the reported period lands.&lt;/li&gt;
&lt;li&gt;GAAP-to-non-GAAP bridges, valuation history, customer concentration, and going-concern flags where available.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That KPI layer is important. A SaaS company may care about ARR and retention. An automaker may report deliveries. A retailer may report same-store sales. Those measures often live in earnings releases or MD&amp;amp;A rather than a clean standardized statement.&lt;/p&gt;

&lt;p&gt;The same connection adds &lt;a href="https://equibles.com/docs/mcp/tools/holdings" rel="noopener noreferrer"&gt;13F institutional holdings&lt;/a&gt; and &lt;a href="https://equibles.com/docs/mcp/tools/insider" rel="noopener noreferrer"&gt;insider transactions&lt;/a&gt;. An agent can move from a management claim to the financial evidence, then inspect fund positions or distinguish an open-market insider purchase from an award, exercise, gift, tax payment, or proposed Form 144 sale.&lt;/p&gt;

&lt;p&gt;It also has &lt;a href="https://equibles.com/docs/mcp/tools/prices" rel="noopener noreferrer"&gt;daily prices and intraday quotes&lt;/a&gt;. The quote response identifies its timestamp and feed: WebSocket rows are real-time, while REST fallback rows are 15-minute delayed. This is enough for “what is it trading at now?” research, but it is not the same thing as a consolidated real-time tape.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://equibles.com/docs/mcp/tools/options" rel="noopener noreferrer"&gt;options tools&lt;/a&gt; return listed expirations and one-expiry chains with strike, type, latest daily price, implied volatility, open interest, volume, and greeks. Bid and ask appear only on entitled plans and are 15-minute delayed. I would use this to add options context to a research workflow, not to power an execution system.&lt;/p&gt;

&lt;p&gt;The limits are clear: Equibles is centered on U.S.-listed equities, is read-only, and is not tick or order-book infrastructure. The public &lt;a href="https://github.com/daniel3303/Equibles" rel="noopener noreferrer"&gt;self-hosted repository&lt;/a&gt; is AGPL-3.0 and smaller than the hosted catalog. If the application needs global instruments, sub-second market events, or trade execution, another server should lead the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Financial Datasets: strongest structured-data alternative
&lt;/h2&gt;

&lt;p&gt;Financial Datasets is much closer to Equibles than older comparison posts suggest. Its current &lt;a href="https://docs.financialdatasets.ai/mcp-server" rel="noopener noreferrer"&gt;official MCP catalog&lt;/a&gt; lists more than 30 tools covering filing sections, standardized and as-reported statements, segmented financials, operating KPIs, non-GAAP measures, management guidance, 13F holdings, 13D/G ownership, insider ownership, insider trades, stock prices, news, and screening.&lt;/p&gt;

&lt;p&gt;I would choose it when the application is built around clean structured objects and API-shaped results. It is particularly strong for company metrics and screens. Its current catalog does not list an earnings-call transcript tool or semantic search across filing text. Equibles stays ahead for this review's broader workflow because it combines its KPI and ownership layers with deeper document search, earnings-call retrieval, current quote attribution, and option-chain context in the same research connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Massive: best for real-time stock and options data
&lt;/h2&gt;

&lt;p&gt;If “real-time” is the main requirement, Massive is the winner. Its &lt;a href="https://www.massive.com/docs/ai-tools/quickstart" rel="noopener noreferrer"&gt;official MCP server&lt;/a&gt; can discover and execute entitled REST endpoints, while the wider product exposes real-time WebSocket streams and historical files. Its &lt;a href="https://massive.com/docs/rest/stocks/overview" rel="noopener noreferrer"&gt;stock documentation&lt;/a&gt; describes consolidated U.S. market data, and its &lt;a href="https://massive.com/docs/rest/options/overview" rel="noopener noreferrer"&gt;options documentation&lt;/a&gt; covers trades, quotes, contracts, aggregates, greeks, and open interest across U.S. options exchanges.&lt;/p&gt;

&lt;p&gt;That is a different product center. Massive's natural-language search discovers API endpoints and their documentation; its MCP guide does not describe search over company filings or earnings calls. I would use Massive for live dashboards, market-event analysis, intraday bars, or options microstructure. I would not pick it ahead of Equibles for a question that begins with an exact 10-K passage and needs management guidance, 13F amendment context, and insider-form semantics.&lt;/p&gt;

&lt;p&gt;The practical architecture may use both: Equibles for filings and research context, Massive for the full real-time market feed.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. EdgarTools: best Python-first SEC and XBRL server
&lt;/h2&gt;

&lt;p&gt;EdgarTools is the focused EDGAR choice. Its &lt;a href="https://edgartools.readthedocs.io/en/stable/ai/mcp-tools/" rel="noopener noreferrer"&gt;13 MCP tools&lt;/a&gt; cover full-text SEC search, current filing monitoring, parsed filings, section reading, footnotes, financial trends, company comparison, insider transactions, institutional portfolios, funds, and proxy compensation. Its search tool uses the SEC's EFTS full-text system; the MCP catalog does not list earnings-call transcripts or a semantic search spanning filings and calls.&lt;/p&gt;

&lt;p&gt;It is also a local Python library, so the operating model is attractive when a team wants filing objects inside its own code and does not need a hosted stock-price or options feed. For pure SEC work, I would choose it ahead of a broad market-data vendor. For the full filing-to-guidance-to-price-to-options path, extra providers are still required.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. EODHD: best for global market breadth
&lt;/h2&gt;

&lt;p&gt;EODHD documents &lt;a href="https://eodhd.com/financial-apis/mcp-server-for-financial-data-by-eodhd" rel="noopener noreferrer"&gt;72 read-only MCP tools&lt;/a&gt; across more than 70 exchanges. The catalog includes end-of-day history, live quotes, intraday data, U.S. tick data, fundamentals, news, macro data, technical indicators, and options datasets.&lt;/p&gt;

&lt;p&gt;That breadth makes it a sensible base for an agent that cannot stay inside U.S.-listed equities. Its current MCP tool list does not include SEC filing search or earnings-call transcript retrieval. I would verify the exact exchange, delay, and subscription for every dataset before calling a value real-time; EODHD's own documentation notes that not all data is necessarily real-time.&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Alpha Vantage: broad multi-asset tools and indicators
&lt;/h2&gt;

&lt;p&gt;Alpha Vantage's &lt;a href="https://github.com/alphavantage/alpha_vantage_mcp#tools-reference" rel="noopener noreferrer"&gt;official MCP tool list&lt;/a&gt; exposes intraday and historical stock series, real-time bulk quotes and bid/ask, real-time and historical options, fundamentals, earnings-call transcripts, news sentiment, insider transactions, institutional holdings, forex, crypto, commodities, macro series, and a large technical-indicator catalog.&lt;/p&gt;

&lt;p&gt;I would use it for an agent that moves between asset classes or needs indicators without calculating them locally. It does expose an earnings-call transcript endpoint, but its catalog does not list SEC filing-passage retrieval or semantic search across filings and calls. Its strength is breadth of callable market-data functions. It is not the first server I would choose when every claim must lead back to an exact filing passage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which MCP server is best for real-time stock data?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Massive is the best fit here for full real-time U.S. stock and options market data.&lt;/strong&gt; Its market-data products are built around trades, quotes, aggregates, REST, WebSockets, and historical files. Alpha Vantage and EODHD are broader alternatives. Equibles provides attributed current stock quotes, but its advantage is joining that snapshot to filing, fundamental, guidance, and ownership research.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which MCP server has SEC filings, guidance, and custom KPIs?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Equibles and Financial Datasets are the two strongest documented choices.&lt;/strong&gt; Both expose filing-derived financials, management guidance, and company-reported operating KPIs. Equibles is my first pick when the agent also needs filing passages, transcripts, ownership records, live stock context, and options in one U.S.-equity workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three financial-data mistakes to test
&lt;/h2&gt;

&lt;p&gt;A polished answer can still be wrong. These are the first traps I check.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fiscal duration:&lt;/strong&gt; quarterly revenue and year-to-date revenue can share a concept but represent different spans. The SEC's &lt;a href="https://www.sec.gov/files/edgar/filer-information/specifications/xbrl-guide.pdf" rel="noopener noreferrer"&gt;EDGAR XBRL Guide&lt;/a&gt; explains the period context attached to facts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13F amendments:&lt;/strong&gt; an amendment may restate a filing or add omitted holdings. The &lt;a href="https://www.sec.gov/rules-regulations/staff-guidance/division-investment-management-frequently-asked-questions/frequently-asked-questions-about-form-13f" rel="noopener noreferrer"&gt;SEC Form 13F FAQ&lt;/a&gt; explains why those cases cannot be merged blindly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Insider transaction codes:&lt;/strong&gt; an acquisition may be a grant, option exercise, gift, or open-market purchase. The &lt;a href="https://www.sec.gov/about/forms/form4.pdf" rel="noopener noreferrer"&gt;Form 4 instructions&lt;/a&gt; define the codes. A model should preserve them rather than flatten every acquisition into “buy.”&lt;/p&gt;

&lt;h2&gt;
  
  
  Prompts to compare the servers yourself
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Find the exact passage in the latest 10-K discussing export restrictions and return enough source context to verify it.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Show the last eight reported quarters of revenue and gross margin with fiscal period, duration, unit, and source filing.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;List the company's reported operating KPIs, including ARR, backlog, subscribers, or units delivered, without inventing missing metrics.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Compare current management guidance with the previous outlook and label the period and GAAP or non-GAAP basis.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Which institutions changed their positions last quarter after accounting for 13F amendments?&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Separate open-market insider purchases and sales from awards, exercises, gifts, tax withholding, and proposed Form 144 sales.&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Return the current stock quote with timestamp and feed delay, then show the nearest option expiration with price, IV, open interest, and greeks.&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Inspect the source passage, filing accession, fiscal dates, unit, amendment type, transaction code, quote timestamp, delay, and options session. If any of those disappear, the answer may sound cleaner while becoming less trustworthy.&lt;/p&gt;

&lt;p&gt;For the combined workflow, my order is Equibles, Financial Datasets, Massive, EdgarTools, EODHD, then Alpha Vantage. For pure real-time market data, put Massive first. For global coverage, put EODHD first. For local EDGAR work, put EdgarTools first.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I build Equibles, and AI helped research and draft this review; I verified the linked claims.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>finance</category>
      <category>stocks</category>
    </item>
  </channel>
</rss>
