▲ 4 r/FMPDATA+1 crossposts

The bull market turns 4 on Monday, up 118%. Every bull market since 1950 that made it to 4 years kept going. The shortest lasted 7 more weeks

The bull market turns four on Monday. The S&P 500 closed at 3,577 on October 12, 2022, and it closed Friday at 7,812, up 118%. Barron's ran it this weekend as "Four Years In, $40 Trillion Up," and with the 10-year yield above 5%, everyone's asking how much is left...

So I went back to 1950 and pulled every bull market that made it to four years. A bull market starts at the low after a 20% drop, on closing prices.

  • Six made it to four years before this one, and all six kept going.
  • The shortest ran 7 more weeks, ending in December 1961. The longest ran another 8 years, to March 2000.
  • After year four, they gained anywhere from 7% to 302% more.
  • Only two were up more than this one at four years: 1982 (+138%) and 2009 (+130%).

How much higher do you think this one goes?

Info pulled through the FMP MCP server:

import asyncio, json
from fastmcp import Client            # pip install fastmcp

KEY = "YOUR_API_KEY"
DROP = 0.20                           # a bear market = a 20% fall from the high, on closing prices

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        days = []
        for year in range(1950, 2027, 15):                  # 15 years per call, each call returns up to 5,000 days
            r = await fmp.call_tool("indexes", {"endpoint": "index-historical-price-eod-light", "symbol": "^GSPC",
                                                "from_date": f"{year}-01-01", "to_date": f"{year + 14}-12-31"})
            days += json.loads(r.content[0].text)
    days.sort(key=lambda d: d["date"])

    bulls, low, high, in_bull = [], days[0], days[0], True
    for d in days:
        if in_bull:
            if d["price"] > high["price"]: high = d
            if d["price"] <= high["price"] * (1 - DROP):
                bulls.append((low, high)); in_bull, low = False, d
        else:
            if d["price"] < low["price"]: low = d
            if d["price"] >= low["price"] * (1 + DROP):
                in_bull, high = True, d

    for start, peak in bulls[1:] + [(low, days[-1])]:      # skip the one already running in 1950
        birthday = f"{int(start['date'][:4]) + 4}{start['date'][4:]}"
        four = next((d for d in days if d["date"] >= birthday), days[-1])
        if four["date"] <= peak["date"]:                     # made it to four years
            after = "still going" if peak is days[-1] else f"{peak['price'] / four['price'] - 1:+.0%} more"
            print(f"{start['date']} to {peak['date']}  {four['price'] / start['price'] - 1:+.0%} at 4 years, {after}")

asyncio.run(main())

Output:

1957-10-22 to 1961-12-12  +75% at 4 years, +7% more
1974-10-03 to 1980-11-28  +65% at 4 years, +37% more
1982-08-12 to 1987-08-25  +138% at 4 years, +38% more
1987-12-04 to 2000-03-24  +70% at 4 years, +302% more
2002-07-23 to 2007-10-09  +58% at 4 years, +24% more
2009-03-09 to 2020-02-19  +130% at 4 years, +118% more
2022-10-12 to 2026-10-09  +118% at 4 years, still going
reddit.com
u/Bmoses99 — 4 days ago
▲ 8 r/FMPDATA+1 crossposts

Applied Digital just reported $342 million in quarterly sales, more than 4x a year ago. How to calculate any stock's price to sales ratio with FMP. APLD went from 46 times sales to 8

Applied Digital, the AI data center company, reported earnings after the close today. Sales were $341.9 million, more than four times the same quarter last year. Over half of that, $183.5 million, came from building out space for tenants, not from rent. The stock closed at $23.81, 52% below its record close in May.

So what are buyers paying for each dollar of sales now? Here's how to track any stock's price to sales ratio on every filing day, using only sales that were public at the time.

Findings:

  • The stock has gotten much cheaper next to its sales. It hit 46 times sales last October, and at today's close it was 8.1.
  • It's now below the 11.9 times sales from July 2025, before the run up to 46.

Output from tonight:

2025-07-30 filing: 11.9 times sales
2025-10-09 filing: 35.7 times sales
2026-01-08 filing: 30.8 times sales
2026-04-08 filing: 21.2 times sales
2026-07-29 filing: 11.1 times sales
2026-10-07 filing: 8.1 times sales
Highest: 46.0 times sales on 2025-10-15

The code divides each day's market cap by the last four quarters of sales filed by that day. Change SYMBOL to run it on any stock.

Info pulled through the FMP MCP server:

import asyncio, json, os
from fastmcp import Client            # pip install -U fastmcp (needs Python 3.10+)

KEY = "YOUR_API_KEY"
SYMBOL = "APLD"
SINCE = "2025-07-01"                  # first day to check

async def call(fmp, tool, **args):
    r = await fmp.call_tool(tool, args, raise_on_error=False)
    text = r.content[0].text if r.content else ""
    if text.startswith("Rate limit reached"):                    # over your plan's per-minute limit, so wait and try again
        await asyncio.sleep(10)
        return await call(fmp, tool, **args)
    if r.is_error:                                               # a bad key, or a plan without this data
        print(text, flush=True)
        os._exit(1)
    return json.loads(text) if text.startswith("[") else []

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        quarters = await call(fmp, "statements", endpoint="income-statement", symbol=SYMBOL, period="quarter")
        days = await call(fmp, "company", endpoint="historical-market-cap", symbol=SYMBOL, from_date=SINCE, limit=5000)  # every day since SINCE

    def price_to_sales(day):
        filed = sorted((q for q in quarters if q["filingDate"] <= day["date"]), key=lambda q: q["date"])  # only the quarters filed by that day
        return day["marketCap"] / sum(q["revenue"] for q in filed[-4:])                                   # market cap over the last 4 quarters of sales

    filing_days = {q["filingDate"] for q in quarters}
    for day in sorted(days, key=lambda d: d["date"]):
        if day["date"] in filing_days:
            print(f"{day['date']} filing: {price_to_sales(day):.1f} times sales")
    peak = max(days, key=price_to_sales)
    print(f"Highest: {price_to_sales(peak):.1f} times sales on {peak['date']}")

asyncio.run(main())

Is 8 times sales cheap for a company growing this fast?

reddit.com
u/Bmoses99 — 7 days ago
▲ 27 r/FMPDATA+2 crossposts

Oracle insider buying is incredibly rare. Director Stephen Rusckowski just bought $3.5 million, 2.4x the biggest buy in FMP's records since 2005

Last Tuesday (Sep 29), director Stephen Rusckowski bought 25,000 Oracle shares through his living trust. He paid about $139 a share, so ~$3.5 million. Before this he owned 450 shares. It was a regular open-market buy, not a planned one.

So I pulled every open-market buy at Oracle in FMP's records.

Oracle insiders almost never buy. The biggest buy before this was Charles Moorman's ~$1.4 million in March 2020. Rusckowski's buy is 2.4x that!

Does a buy this rare tell you anything, or is it just noise? What do you guys think?

Info pulled through the FMP MCP server:

import asyncio, json
from fastmcp import Client            # pip install fastmcp

KEY = "YOUR_API_KEY"

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        result = await fmp.call_tool("insiderTrades", {"endpoint": "search-insider-trades", "symbol": "ORCL",
                                                       "transactionType": "P-Purchase", "limit": 100})
    rows = json.loads(result.content[0].text)

    bought = {}
    for t in rows:
        key = (t["transactionDate"][:7], t["reportingName"])
        bought[key] = bought.get(key, 0) + t["securitiesTransacted"] * t["price"]

    for (month, name), usd in sorted(bought.items(), key=lambda kv: -kv[1])[:5]:
        print(f"{month}  {name}  ${usd:,.0f}")

asyncio.run(main())

Output:

2026-09  RUSCKOWSKI STEPHEN H  $3,483,800
2020-03  MOORMAN CHARLES W  $1,424,162
2022-01  MOORMAN CHARLES W  $1,256,445
2025-02  MOORMAN CHARLES W  $947,913
2021-03  Fairhead Rona Alison  $688,966
reddit.com
u/Bmoses99 — 10 days ago
▲ 3 r/FMPDATA+1 crossposts

Why are diesel prices so high? How to calculate the diesel crack spread. It hit $98 a barrel Friday, triple the norm!

Diesel at the pump hit a record in September, and on Friday the G7 countries agreed to release up to 100 million barrels of diesel and crude. So why are diesel prices so high? Of course, crude is only part of the story. Oil closed Friday at $91.11 a barrel.

The bigger part is the crack spread. That's the gap between a barrel of crude and the diesel made from it. Here's how you can calculate it. The code below pulls daily futures prices for diesel and crude and multiplies diesel by 42 gallons (amount in a barrel), then subtracts the crude.

Output through Friday's close:

2019 average spread $24.43 a barrel
2020 average spread $12.93 a barrel
2021 average spread $18.80 a barrel
2022 average spread $54.72 a barrel
2023 average spread $40.59 a barrel
2024 average spread $26.70 a barrel
2025 average spread $31.99 a barrel
2026 average spread $68.46 a barrel
2026-10-02 diesel $4.50 a gallon, crude $91.11 a barrel, spread $97.94 a barrel

The gap is more than 3x what it used to be. It was $97.94 a barrel on Friday. From 2019 to 2025 it averaged ~$30. At that average, Friday's crude would put diesel futures near $2.88 a gallon instead of $4.50. These are futures prices, clearly not what you pay at the pump.

Info pulled through the FMP MCP server:

import asyncio, json
from statistics import mean
from fastmcp import Client  # pip install fastmcp

KEY = "YOUR_API_KEY"

async def closes(fmp, symbol):
    r = await fmp.call_tool("commodity", {"endpoint": "commodities-historical-price-eod-light",
        "symbol": symbol, "from_date": "2019-01-01", "to_date": "2026-10-02"})
    return {day["date"]: day["price"] for day in json.loads(r.content[0].text)}

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        diesel = await closes(fmp, "HOUSD")  # dollars per gallon
        crude = await closes(fmp, "CLUSD")   # dollars per barrel

    # a barrel is 42 gallons
    spread = {date: diesel[date] * 42 - crude[date] for date in diesel if date in crude}

    for year in range(2019, 2027):
        print(year, f"average spread ${mean(v for d, v in spread.items() if d.startswith(str(year))):.2f} a barrel")

    last = max(spread)
    print(f"{last} diesel ${diesel[last]:.2f} a gallon, crude ${crude[last]:.2f} a barrel, spread ${spread[last]:.2f} a barrel")

asyncio.run(main())

What do you guys think?

reddit.com
u/Bmoses99 — 11 days ago
▲ 8 r/FMPDATA+1 crossposts

How to measure market breadth with FMP's financial data MCP server. The S&P 500 is up 12.8% this year and nearly half its stocks are down

You keep hearing the market is near a record. The S&P 500 closed Friday about 1% under its all-time high. But how many of the stocks inside it are actually up?

That's called market breadth. Here's how you can measure it for any index. The code below pulls the S&P 500's member list, then every stock's price change over the past month, three months, this year and one year, and compares each one to the index.

Output from Friday's close:

1M  S&P 500 -0.3%  median stock -6.0%  down 388 of 504  beating the index 119
3M  S&P 500 +2.5%  median stock -4.8%  down 329 of 504  beating the index 145
ytd  S&P 500 +12.8%  median stock +2.6%  down 229 of 504  beating the index 161
1Y  S&P 500 +15.0%  median stock +2.5%  down 227 of 504  beating the index 173

Most stocks aren't keeping up. The S&P 500 is up 12.8% this year, but the median stock is only up 2.6%. The past month looks worse. The index is down 0.3% and 388 stocks fell.

Swap in the Nasdaq, the Dow or your own list of symbols.

Info pulled through the FMP MCP server:

import asyncio, json
from statistics import median
from fastmcp import Client

KEY = "YOUR_API_KEY"

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        r = await fmp.call_tool("indexes", {"endpoint": "sp-500"})
        symbols = [company["symbol"] for company in json.loads(r.content[0].text)]

        r = await fmp.call_tool("quote", {"endpoint": "quote-change", "symbol": ",".join(symbols)})
        stocks = json.loads(r.content[0].text)

        r = await fmp.call_tool("quote", {"endpoint": "quote-change", "symbol": "^GSPC"})
        index = json.loads(r.content[0].text)[0]

        for period in ["1M", "3M", "ytd", "1Y"]:
            changes = [stock[period] for stock in stocks]
            down = sum(change < 0 for change in changes)
            beating = sum(change > index[period] for change in changes)
            print(f"{period}  S&P 500 {index[period]:+.1f}%  median stock {median(changes):+.1f}%  down {down} of {len(changes)}  beating the index {beating}")

asyncio.run(main())

Do you guys think market breadth will continue to get worse or recover?

reddit.com
u/Bmoses99 — 11 days ago
▲ 41 r/FMPDATA+1 crossposts

Micron is expected to report $51 billion of sales tonight. That's more than it made in any full year before 2026

Micron reports earnings tonight, and the numbers Wall Street expects are hard to believe.

Analysts expect about $51 billion of sales for the quarter. The same quarter a year ago was $11.3 billion. Micron has never made $51 billion in a full year before this one. Its best was $37.4 billion.

The profit is even crazier. Last quarter Micron made $28.2 billion. That's more than it made in the last seven years COMBINED.

One quarter, more than seven years. What do you guys think happens tonight?

Info pulled through the FMP MCP server:

import asyncio, json
from fastmcp import Client            # pip install fastmcp

KEY = "YOUR_API_KEY"

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        async def call(tool, args):
            r = await fmp.call_tool(tool, args)
            return json.loads(r.content[0].text)

        reports = await call("calendar", {"endpoint": "earnings-company", "symbol": "MU", "limit": 8})
        years = await call("statements", {"endpoint": "income-statement", "symbol": "MU", "period": "annual", "limit": 7})
        quarters = await call("statements", {"endpoint": "income-statement", "symbol": "MU", "period": "quarter", "limit": 4})

    tonight = next(r for r in reports if r["date"] == "2026-09-30")
    best = max(years, key=lambda y: y["revenue"])
    rows = [("expected sales tonight, one quarter", tonight["revenueEstimated"]),
            ("same quarter a year ago", quarters[3]["revenue"]),
            (f"best full year before this one (FY{best['fiscalYear']})", best["revenue"]),
            ("profit last quarter", quarters[0]["netIncome"]),
            (f"profit, FY{years[-1]['fiscalYear']} to FY{years[0]['fiscalYear']} combined", sum(y["netIncome"] for y in years))]
    for label, value in rows:
        print(f"{label:<41}${value / 1e9:.1f}B")

asyncio.run(main())

Output:

expected sales tonight, one quarter      $51.3B
same quarter a year ago                  $11.3B
best full year before this one (FY2025)  $37.4B
profit last quarter                      $28.2B
profit, FY2019 to FY2025 combined        $27.0B
reddit.com
u/Bmoses99 — 15 days ago
▲ 4 r/FMPDATA+1 crossposts

Meta's new AI app books trips and shops for you. Goldman named 8 stocks it could hurt, and only half of them have really dropped

Meta launched Muse this month, an AI app that can plan and book travel, send emails and make purchases for you. It hit No. 1 on the App Store this week, and Meta's market value is up $199 billion since Friday.

The worry on Wall Street is simple. A lot of companies make money because people don't shop around: they keep the same insurance, the same phone plan and the same subscriptions out of habit, and book trips through the same sites. An app that compares prices for you, or books straight with the airline, breaks that.

Goldman's trading desk named eight stocks it sees at risk. Since Friday, four have dropped hard and four have barely moved. Allstate, Expedia, Booking and Progressive are down roughly 5% to 10%. AT&T, Netflix, T-Mobile and Paramount are down ~2.5% or less.

Investors are betting an AI app will shop your car insurance and your hotel, but won't cancel your phone plan or Netflix.

Would you let an app switch any of these for you?

Info pulled through the FMP MCP server:

import asyncio, json
from fastmcp import Client            # pip install fastmcp

KEY = "YOUR_API_KEY"
GOLDMAN = ["T", "TMUS", "ALL", "PGR", "NFLX", "PSKY", "EXPE", "BKNG"]

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        async def change(sym):
            r = await fmp.call_tool("company", {"endpoint": "historical-market-cap", "symbol": sym,
                                               "from": "2026-09-18", "to": "2026-09-23"})
            cap = {row["date"]: row["marketCap"] for row in json.loads(r.content[0].text)}
            start, end = cap["2026-09-18"], cap["2026-09-23"]
            return (end - start) / start, end - start, sym

        rows = await asyncio.gather(*[change(s) for s in ["META"] + GOLDMAN])
        for pct, dollars, sym in sorted(rows, reverse=True):
            print(f"{sym:<5} {pct:+7.1%}  {dollars/1e9:+7.1f}B")
        lost = sum(dollars for pct, dollars, sym in rows if sym != "META")
        print(f"Goldman's eight combined: {lost/1e9:+.1f}B")

asyncio.run(main())

Output:

META   +11.8%   +199.2B
T       -0.4%     -0.7B
NFLX    -0.6%     -1.8B
TMUS    -1.5%     -2.7B
PSKY    -2.4%     -0.3B
PGR     -4.8%     -6.0B
BKNG    -7.1%     -9.2B
EXPE    -7.3%     -2.5B
ALL     -9.7%     -6.2B
Goldman's eight combined: -29.4B
reddit.com
u/Bmoses99 — 21 days ago
▲ 3 r/FMPDATA+1 crossposts

How to connect FMP's MCP server and pull insider buys. First run found three Cooper Companies directors buying $1.9 million this week near a 52-week low

Every screen I've posted here was a script for one question: pull a feed, filter it, print it. That works until the question changes. An MCP server flips it. You connect once, the model sees every tool and what each one needs, and it makes the call itself when you ask. FMP runs one, so I tried it.

Setup is one URL: https://financialmodelingprep.com/mcp?apikey=YOUR\_API\_KEY. In Claude it's Settings, Connectors, Add custom connector, paste. Any MCP client takes the same URL. Here's the Python version, so you can see what actually comes back.

import asyncio, json
from fastmcp import Client   # pip install fastmcp

KEY = "YOUR_API_KEY"

async def main():
    async with Client(f"https://financialmodelingprep.com/mcp?apikey={KEY}") as fmp:
        tools = await fmp.list_tools()
        print(len(tools), "tools:", ", ".join(t.name for t in tools), "\n")
        r = await fmp.call_tool("insiderTrades", {"endpoint": "search-insider-trades",
                                                  "symbol": "COO", "transactionType": "P-Purchase", "limit": 5})
        for x in json.loads(r.content[0].text):
            print(x["transactionDate"], f'{x["reportingName"]:23s} {x["securitiesTransacted"]:>9,} @ ${x["price"]:.2f}')

asyncio.run(main())

28 tools: ESG, Fundraisers, analyst, calendar, chart, commitmentOfTraders, commodity, company, crypto, directory, discountedCashFlow, earningsTranscript, economics, etfAndMutualFunds, forex, form13F, indexes, insiderTrades, marketHours, marketPerformance, news, quote, search, secFilings, senate, statements, technicalIndicators, tipranks

2026-09-16 Kurzius Lawrence Erik      10,000 @ $54.93
2026-09-14 Rosebrough Walter M Jr      3,000 @ $54.29
2026-09-11 Rosebrough Walter M Jr      7,000 @ $54.11
2026-09-14 Kurzius Lawrence Erik      10,000 @ $53.91
2026-09-11 Keel Paul A             4,701.015 @ $53.18

Cooper Companies makes contact lenses, it's in the S&P 500, and it's trading a few dollars off its 52-week low. Between September 11 and 16, three directors bought: five buys, $1.9 million.

Lawrence Kurzius bought 2,000 shares in December at $82.50. This week he bought 20,000 at around $54. Walter Rosebrough bought 10,000 through his trust, and Paul Keel put in $250,000. No position, and buying near a low doesn't mean the low is in.

I'll be showing all sorts of tips and tricks with the MCP server!

reddit.com
u/Bmoses99 — 27 days ago
▲ 9 r/FMPDATA+2 crossposts

How to get a notification the moment an insider buys. Tonight it caught G-III's CEO buying $1.1 million

Every insider post on this sub (GameStop, Uber, Upstart, Celsius) came out of FMP's insider feed. It's a hundred filings a page, mostly option exercises and awards, and the buys that matter are buried in it. So I wrote alert for insider buying activity.

Every 10 minutes it pulls the newest open-market buys, keeps officers and directors, skips anything under $1 million, and pings a Discord channel. First run, 10:17 tonight, two alerts:

FTK: Wilks Matthew (director) bought 1,319,493 shares at $26.01 = $34,320,013 on 2026-09-11, filed 2026-09-15
(SEC filing link)
GIII: GOLDFARB MORRIS (director, officer: CEO) bought 40,000 shares at $27.94 = $1,117,600 on 2026-09-14, filed 2026-09-15
(SEC filing link)

The second one is the real thing. Morris Goldfarb runs G-III, the apparel company behind DKNY and Donna Karan. On Monday he bought 40,000 shares at $27.94, $1.1 million (not on a plan). It's his first open-market buy since December 2022, when he bought $3.1 million.

The first one is why the ping carries the filing link. $34 million looks like a giant buy. Open the Form 4 and it's a debt swap: the director's fund took 1.3 million Flotek shares from ProFrac, a 10% holder, in exchange for cancelling $34 million of loans. It's coded as a purchase. It isn't one.

To run it: your FMP key, a Discord webhook (server settings, integrations, new webhook, copy the URL), pip install requests. Leave the webhook blank and it prints.

import requests, json, time, os

KEY = "YOUR_API_KEY"
WEBHOOK = ""          # paste a Discord webhook URL to get pinged; leave blank to print
MIN_USD = 1_000_000   # ignore small buys
SEEN_FILE = "seen.json"

seen = set(json.load(open(SEEN_FILE))) if os.path.exists(SEEN_FILE) else set()

def check():
    rows = requests.get("https://financialmodelingprep.com/stable/insider-trading/search"
                        f"?transactionType=P-Purchase&page=0&limit=100&apikey={KEY}").json()
    for r in rows:
        usd = r["securitiesTransacted"] * r["price"]
        key = r["url"] + r["transactionDate"]
        insider = "officer" in r["typeOfOwner"] or "director" in r["typeOfOwner"]
        if key in seen or usd < MIN_USD or not insider:
            continue
        seen.add(key)
        msg = (f"{r['symbol']}: {r['reportingName']} ({r['typeOfOwner']}) bought "
               f"{r['securitiesTransacted']:,.0f} shares at ${r['price']:.2f} = ${usd:,.0f} "
               f"on {r['transactionDate']}, filed {r['filingDate']}\n{r['url']}")
        requests.post(WEBHOOK, json={"content": msg}) if WEBHOOK else print(msg, "\n")
    json.dump(sorted(seen), open(SEEN_FILE, "w"))

while True:
    check()
    time.sleep(600)   # every 10 minutes
reddit.com
u/Bmoses99 — 29 days ago
▲ 7 r/FMPDATA+1 crossposts

Celsius's CEO sold at $85, nine days before the top. Last week he started buying at $27

Celsius's CEO John Fieldly bought 18,000 shares last Thursday at $27.44. It's a small buy, $494,000. But when you pull his Form 4 history, two things stand out.

He'd never bought on the open market until this year. Nine years of filings, and the first time is May 22, 2026: 8,475 shares at $29.36. Thursday was the second.

And nine days before the all-time high, he sold. Celsius closed at $96.11 on March 13, 2024. On March 4 he sold 119,604 shares at an average of $85.07. $10.2 million, not under a pre-set trading plan.

That's two buys in nine years, $743,000 total. Celsius closed at $28.45 yesterday, 70% below the high. Thoughts?

Info pulled from the FMP endpoint:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
trades = requests.get(f"{BASE}/insider-trading/search?symbol=CELH&reportingCik=0001685586&limit=1000&apikey={KEY}").json()
for t in sorted(trades, key=lambda t: t["transactionDate"]):
    if t["transactionType"] == "P-Purchase" or (t["transactionType"] == "S-Sale" and t["transactionDate"].startswith("2024-03")):
        print(t["transactionDate"], t["transactionType"], f"{t['securitiesTransacted']:,.0f} sh at ${t['price']:.2f} = ${t['securitiesTransacted'] * t['price']:,.0f}")
prices = requests.get(f"{BASE}/historical-price-eod/full?symbol=CELH&from=2015-01-01&apikey={KEY}").json()
top = max(prices, key=lambda p: p["close"])
print("all-time high close:", top["date"], top["close"])

Output:

2024-03-04 S-Sale 119,604 sh at $85.07 = $10,174,712
2026-05-22 P-Purchase 8,475 sh at $29.36 = $248,826
2026-09-10 P-Purchase 18,000 sh at $27.44 = $493,843
all-time high close: 2024-03-13 96.11
reddit.com
u/Bmoses99 — 30 days ago
▲ 13 r/FMPDATA+1 crossposts

Upstart's co-founder sold $60 million of stock the day it hit its all-time high in 2021. He's the CEO now, and he's bought three times since November. The stock is down 93%

Upstart closed at $390 on October 15, 2021, its all-time high. That same day Paul Gu (co-founder) sold 155,000 shares at an average of $390.71.

He wasn't the only one. Dave Girouard (also a co-founder) and the CEO at the time, sold too. Between them they sold $288 million of stock in 2021.

Then the stock fell 93%. And the founders started buying. Gu bought $3.9 million at $39 in November, his first open-market purchase since the IPO. Girouard bought $5 million at $29 in May, his first too. Gu bought again in May at $27.50, and again last Wednesday at $25.55. That's $11.6 million from the two founders, none of it under a pre-set trading plan.

Upstart closed at $26.10 today. Gu is the CEO now and is actively holding his positions. What's your read?

Info pulled from the FMP endpoint:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
rows, page = [], 0
while True:
    r = requests.get(f"{BASE}/insider-trading/search?symbol=UPST&page={page}&limit=1000&apikey={KEY}").json()
    if not r: break
    rows += r; page += 1
for name in ["Girouard Dave", "Gu Paul"]:
    mine = [r for r in rows if r["reportingName"] == name and r["price"]]
    sold = sum(r["securitiesTransacted"] * r["price"] for r in mine if r["transactionType"] == "S-Sale" and r["transactionDate"].startswith("2021"))
    print(f"{name}: sold ${sold/1e6:,.1f}M in 2021")
    buys = {}
    for r in mine:
        if r["transactionType"] == "P-Purchase":
            b = buys.setdefault(r["transactionDate"][:10], [0, 0])
            b[0] += r["securitiesTransacted"]; b[1] += r["securitiesTransacted"] * r["price"]
    for day, (sh, usd) in sorted(buys.items()):
        print(f"   bought {day}  {sh:>7,.0f} shares  ${usd/1e6:.1f}M")

Output:

Girouard Dave: sold $144.7M in 2021
   bought 2026-05-07  170,240 shares  $5.0M
Gu Paul: sold $143.3M in 2021
   bought 2025-11-11  100,000 shares  $3.9M
   bought 2026-05-13   50,000 shares  $1.4M
   bought 2026-09-10   50,000 shares  $1.3M
reddit.com
u/Bmoses99 — 1 month ago
▲ 5 r/FMPDATA+1 crossposts

CoreWeave's three founders have sold $2.2 billion of their own stock this year, and their biggest early backer sold $2.4 billion more

CoreWeave is down 6% this morning after the weekend's pace-the-frontier debate. So I pulled the insider feed to see what the people who built it have been doing with their shares.

Selling, every month. Michael Intrator, the CEO, has sold in 35 sessions this year, $782 million under a plan he set up last November. Brian Venturo, the chief strategy officer, $871 million. Brannin McBee, the chief development officer, $547 million. Magnetar, one of its biggest pre-IPO investors, another $2.4 billion.

Info pulled from the FMP endpoint:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
rows, page = [], 0
while True:
    r = requests.get(f"{BASE}/insider-trading/search?symbol=CRWV&transactionType=S-Sale&page={page}&limit=1000&apikey={KEY}").json()
    if not r: break
    rows += r; page += 1
sold = {}
for r in rows:
    if r["transactionDate"] >= "2026" and r["securityName"] == "Class A Common Stock":
        sold[r["reportingName"]] = sold.get(r["reportingName"], 0) + r["securitiesTransacted"] * r["price"]
for name, v in sorted(sold.items(), key=lambda kv: -kv[1])[:6]:
    print(f"{name:26} ${v/1e6:>8,.0f}M")
print(f"{'all insiders, 2026':26} ${sum(sold.values())/1e6:>8,.0f}M")

Output:

Magnetar Financial LLC     $   2,401M
Venturo Brian M            $     871M
Intrator Michael N         $     782M
McBee Brannin              $     547M
Cogen Jack D               $     178M
Agrawal Nitin              $      30M
all insiders, 2026         $   4,863M
reddit.com
u/Bmoses99 — 1 month ago
▲ 5 r/FMPDATA+1 crossposts

The CEOs of Anthropic and OpenAI called for slowing AI down this weekend. The chip index was already 19% below its record before they said a word, more downside coming?

On Saturday Anthropic's CEO Dario Amodei published "We Must Pace the Frontier": "We must slow the pace at which we improve the capabilities of AI models." Sam Altman posted "I agree with Dario" within hours and said OpenAI would match Anthropic's commitment to independent evaluators. Musk: "Dario is right." Everyone seems to be on the same page.

So I pulled up where the chips stand going into Monday.

The Philadelphia Semiconductor Index closed Friday 19% below its June 22 record. Nvidia is 7% off its high. The equipment makers are in a bear market: KLA down 40%, Applied Materials 37%, Lam 31%.

The market started pricing something in June. Could it be pricing a sector wide commitment to slow innovation to ensure safety policy can keep up?

Info pulled from the FMP endpoint:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
for s in ["^SOX", "NVDA", "TSM", "AVGO", "AMD", "MU", "ASML", "INTC", "AMAT", "LRCX", "KLAC", "ARM"]:
    h = requests.get(f"{BASE}/historical-price-eod/full?symbol={s}&from=2026-01-01&to=2026-09-13&apikey={KEY}").json()
    high = max(h, key=lambda r: r["close"])
    last = max(h, key=lambda r: r["date"])
    print(f"{s:5} {last['close']:>10,.2f}  {(last['close']/high['close']-1)*100:>6.1f}% from its 2026 high on {high['date']}")

Output:

^SOX   11,824.00   -19.2% from its 2026 high on 2026-06-22
NVDA      218.29    -7.4% from its 2026 high on 2026-05-14
TSM       433.24    -9.3% from its 2026 high on 2026-06-30
AVGO      361.99   -24.8% from its 2026 high on 2026-06-02
AMD       516.13   -11.2% from its 2026 high on 2026-06-30
MU        975.26   -19.6% from its 2026 high on 2026-06-25
ASML    1,698.30   -14.6% from its 2026 high on 2026-06-30
INTC      102.94   -27.0% from its 2026 high on 2026-06-22
AMAT      456.49   -36.9% from its 2026 high on 2026-06-30
LRCX      298.22   -31.2% from its 2026 high on 2026-06-30
KLAC      180.64   -40.1% from its 2026 high on 2026-06-30
ARM       264.79   -39.7% from its 2026 high on 2026-06-18
reddit.com
u/Bmoses99 — 1 month ago
▲ 3 r/FMPDATA+1 crossposts

Dell closed at a record $567 on Friday, up 351% this year. The private equity firm that took it private in 2013 has sold $2.9 billion of it since March

Dell closed at a record on Friday. $567.29, up 12% on the day and 351% on the year. So I pulled the insider feed to see who's been selling into it.

The seller is Silver Lake, the private equity firm that took Dell private with Michael Dell in 2013. Their funds filed sales every day this week, $444 million across four sessions. They sold through March and April, then unloaded $1.2 billion in June.

So the record since March: 27 sessions, 10.4 million shares, $2.9 billion. The average price was $276. They still hold 42.6 million shares, about 6.4% of the company, $24 billion at Friday's close.

Info pulled from the FMP endpoint:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
rows, page = [], 0
while True:
    r = requests.get(f"{BASE}/insider-trading/search?symbol=DELL&transactionType=S-Sale&page={page}&limit=1000&apikey={KEY}").json()
    if not r: break
    rows += r; page += 1
sold = {}
for r in rows:
    if r["transactionDate"] >= "2026" and ("Silver Lake" in r["reportingName"] or r["reportingName"].startswith("SL")):
        m = r["transactionDate"][:7]
        sold[m] = sold.get(m, 0) + r["securitiesTransacted"] * r["price"]
for m in sorted(sold):
    print(m, f"${sold[m]/1e6:,.0f}M")
print("2026 total", f"${sum(sold.values())/1e6:,.0f}M")

Output:

2026-03 $702M
2026-04 $297M
2026-06 $1,212M
2026-07 $221M
2026-09 $444M
2026 total $2,876M
reddit.com
u/Bmoses99 — 1 month ago
▲ 30 r/FMPDATA+2 crossposts

Larry Ellison's plan to sell up to 50 million Oracle shares lasted one day. Oracle announced Saturday that he cancelled it and has no other plans to sell

Friday's 10-Q disclosed that Larry Ellison had a 10b5-1 plan to sell up to 50 million Oracle shares by October 24. At Friday's close of $150.28 that was $7.5 billion, about what he's sold in every filing since 2004 combined. I posted about it Friday night.

At 12:16pm Oracle put out a two-sentence press release. He has cancelled the plan. "No Oracle stock was sold under that plan, and he has no other plans to sell any of his Oracle stock."

So the plan was public for about a day and nothing moved under it. The filings agree. His last Form 4 was an option award in October 2025, and there's been nothing since.

Where it stands: he still owns 1.16 billion shares, 38% of the company. Oracle closed Friday at $150.28, 54% below its September 2025 high, the day after it beat on revenue and EPS. The release gives no reason for the cancellation.

A $7.5 billion sale disclosed on a Friday and withdrawn on a Saturday. Kinda wild.

Info pulled from FMP, Ellison's five most recent insider rows:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
rows = requests.get(f"{BASE}/insider-trading/search?symbol=ORCL&reportingCik=0000901999&limit=5&apikey={KEY}").json()
for r in rows:
    print(r["transactionDate"][:10], f"{r['transactionType']:10}", f"{r['securitiesTransacted']:>10,}", f"{r['securityName']:13}", f"owned after {r['securitiesOwned']:,}")

Output:

2025-10-23 A-Award       571,286 Stock Option  owned after 571,286
2025-07-15 M-Exempt    5,000,000 Common Stock  owned after 1,158,232,353
2025-07-15 M-Exempt    1,500,000 Common Stock  owned after 1,153,232,353
2025-07-15 M-Exempt    5,000,000 Stock Option  owned after 0
2025-07-09 M-Exempt    1,000,000 Common Stock  owned after 1,151,732,353
reddit.com
u/Bmoses99 — 1 month ago
▲ 13 r/FMPDATA+1 crossposts

Uber's CEO bought $10 million of his own stock yesterday. The COO bought $5.3 million last week, at higher prices

Uber closed at $80.35 on August 25. Since then it has dropped 11%, and it sits about 30% below its 52-week high of $101.99. The backdrop is a Q2 revenue miss, softer Q3 guidance, another round of layoffs announced last week, and a steady stream of robotaxi headlines.

On September 4, Andrew Macdonald (President and COO) bought the dip. Two lots the same day, 70,000 shares total at $75.65 and $76.44. About $5.3 million. The dip kept dipping. By Tuesday the stock closed at $71.08, so his buy was underwater within three sessions.

Then yesterday Dara Khosrowshahi (CEO of Uber) bought 141,000 shares at a $70.96 average. That's $10 million, and the Form 4 puts his direct stake at 1,367,100 shares after the purchase. I went back through Uber's insider feed to April, 400 filings, and this is the only time his name appears in it.

Info pulled from FMP:

import requests

KEY = "YOUR_API_KEY"
url = f"https://financialmodelingprep.com/stable/insider-trading/search?symbol=UBER&page=0&limit=100&apikey={KEY}"

for r in requests.get(url).json():
    if r["transactionType"] == "P-Purchase":
        total = r["securitiesTransacted"] * r["price"]
        print(f'{r["transactionDate"]}   {r["reportingName"]:18} {r["securitiesTransacted"]:>8,} @ {r["price"]:<8} ${total:>12,.0f}')

Output:

2026-09-10   KHOSROWSHAHI DARA   141,000 @ 70.9642  $  10,005,952
2026-09-04   Macdonald Andrew     15,675 @ 76.4425  $   1,198,236
2026-09-04   Macdonald Andrew     54,325 @ 75.6526  $   4,109,827

$15.3 million from the two people running the company, into a falling knife. When the CEO's first feed appearance in months is a $10 million buy, what is your take away?

reddit.com
u/Bmoses99 — 1 month ago
▲ 12 r/FMPDATA+1 crossposts

Brent Just Crossed $100 Again. Last Time, Headline Inflation Nearly Doubled in Three Months and the Fed Didn't Move

Brent traded above $100 this morning, from $97.92 at yesterday's close. The last crossing was March 8. What followed, month by month:

  • Brent, monthly average: $69 in February. $100 in March. $102 in April. $104 in May.
  • Headline CPI, year over year: 2.4% (Feb). 3.3% (Mar). 3.8% (Apr). 4.2% (May).
  • Core CPI: 2.5%. 2.6%. 2.8%. 2.9%.
  • The Fed: 3.75% on March 18. 3.75% on April 29. 3.75% on June 17.

Then oil rolled over. Brent averaged $84 in June and $83 in July. Headline CPI came back to 3.5%, then 3.4%. Core back to 2.5%.

This week:

  • Friday: August CPI. Estimates 3.4% headline, same as July. 2.4% core. 0.4% on the month, from 0.1%.
  • Wednesday the 16th: the Fed. The calendar's estimate is 4.00%, from 3.75%.

Off the economic calendar endpoint, every CPI print and Fed decision this year:

import requests
KEY = "YOUR_API_KEY"
BASE = "https://financialmodelingprep.com/stable"
rows = []
for a, b in [("2026-01-01", "2026-03-31"), ("2026-04-01", "2026-06-30"), ("2026-07-01", "2026-09-30")]:
    rows += requests.get(f"{BASE}/economic-calendar?from={a}&to={b}&apikey={KEY}").json()
for r in sorted(rows, key=lambda r: r["date"]):
    if r["country"] == "US" and r["event"].startswith(("Inflation Rate YoY", "Core Inflation Rate YoY", "Fed Interest Rate Decision")):
        print(r["date"][:10], f"{r['event']:32}", "actual", r["actual"], "estimate", r["estimate"])

Output:

2026-01-13 Inflation Rate YoY (Dec)         actual 2.7 estimate 2.7
2026-01-13 Core Inflation Rate YoY (Dec)    actual 2.6 estimate 2.7
2026-01-28 Fed Interest Rate Decision       actual 3.75 estimate 3.75
2026-02-13 Inflation Rate YoY (Jan)         actual 2.4 estimate 2.5
2026-02-13 Core Inflation Rate YoY (Jan)    actual 2.5 estimate 2.5
2026-03-11 Inflation Rate YoY (Feb)         actual 2.4 estimate 2.4
2026-03-11 Core Inflation Rate YoY (Feb)    actual 2.5 estimate 2.5
2026-03-18 Fed Interest Rate Decision       actual 3.75 estimate 3.75
2026-04-10 Inflation Rate YoY (Mar)         actual 3.3 estimate 3.3
2026-04-10 Core Inflation Rate YoY (Mar)    actual 2.6 estimate 2.7
2026-04-29 Fed Interest Rate Decision       actual 3.75 estimate 3.75
2026-05-12 Core Inflation Rate YoY (Apr)    actual 2.8 estimate 2.7
2026-05-12 Inflation Rate YoY (Apr)         actual 3.8 estimate 3.7
2026-06-10 Core Inflation Rate YoY (May)    actual 2.9 estimate 2.9
2026-06-10 Inflation Rate YoY (May)         actual 4.2 estimate 4.2
2026-06-17 Fed Interest Rate Decision       actual 3.75 estimate 3.75
2026-07-14 Core Inflation Rate YoY (Jun)    actual 2.6 estimate 2.8
2026-07-14 Inflation Rate YoY (Jun)         actual 3.5 estimate 3.8
2026-07-29 Fed Interest Rate Decision       actual 3.75 estimate 3.75
2026-08-12 Inflation Rate YoY (Jul)         actual 3.4 estimate 3.4
2026-08-12 Core Inflation Rate YoY (Jul)    actual 2.5 estimate 2.5
2026-09-11 Inflation Rate YoY (Aug)         actual None estimate 3.4
2026-09-11 Core Inflation Rate YoY (Aug)    actual None estimate 2.4
2026-09-16 Fed Interest Rate Decision       actual None estimate 4
reddit.com
u/Bmoses99 — 1 month ago

For algo traders: How do you handle restatements in a backtest?

Building a fundamentals factor backtest, got paranoid about the feed after the data quality threads I have seen here. Wanted to make sure nothing was poisoned. Ran 60 S&P 500 names, latest fiscal year, revenue, net income, diluted EPS, diluted shares. My vendor (used fmp's free api) against SEC companyfacts.

About 9 in 10 rows tie within 1%. The rest took a day to sort out:

  • Splits. CRWD and CVNA read 4x and 5x off. Both split after fiscal year end. The feed is split-adjusted, the 10-K isn't. My diff was wrong, not the data.
  • Restatements. The SEC carries two values for the same period once the next 10-K restates. Which one is "right" depends on the date your backtest is standing on.
  • Definitions. Asset managers and brokers tag revenue gross or net (ARES, KKR, BX, IBKR). Same filing, two tags.
  • One real one. AXON diluted shares came back as 100,000,000 exactly. The 10-K says 82.4M. Reported it.

The actual question: first-filed or latest-restated? companyfacts gives you both if you keep the filed date. Every vendor I've used gives latest. Leaning first-filed with a lag, which means building the as-of layer myself. Still not sure 100% tho

How im running it if anyone is curious:

import requests

KEY = "YOUR_API_KEY"
sym = "AXON"

fmp = requests.get(f"https://financialmodelingprep.com/stable/income-statement?symbol={sym}&period=annual&limit=1&apikey={KEY}").json()[0]
cik = requests.get(f"https://financialmodelingprep.com/stable/profile?symbol={sym}&apikey={KEY}").json()[0]["cik"]
sec = requests.get(f"https://data.sec.gov/api/xbrl/companyfacts/CIK{int(cik):010d}.json", headers={"User-Agent": "you@example.com"}).json()["facts"]["us-gaap"]

def from_10k(tags, unit):
    rows = [r for t in tags if t in sec for r in sec[t]["units"][unit] if r["end"] == fmp["date"] and r["fp"] == "FY"]
    return max(rows, key=lambda r: r["filed"])["val"] if rows else None

for field, tags, unit in [("revenue", ["Revenues", "RevenueFromContractWithCustomerExcludingAssessedTax"], "USD"),
                          ("netIncome", ["NetIncomeLoss"], "USD"),
                          ("epsDiluted", ["EarningsPerShareDiluted", "EarningsPerShareBasicAndDiluted"], "USD/shares"),
                          ("weightedAverageShsOutDil", ["WeightedAverageNumberOfDilutedSharesOutstanding"], "shares")]:
    v, s = fmp[field], from_10k(tags, unit)
    sec_txt, diff = (f"{s:,}", f"{abs(v / s - 1) * 100:.1f}%") if s else ("n/a", "n/a")
    print(f"{field:26} vendor {v:>15,}   sec {sec_txt:>15}   diff {diff}")

output:

revenue                    vendor   2,779,536,000   sec   2,779,536,000   diff 0.0%
netIncome                  vendor     124,911,000   sec     124,656,000   diff 0.2%
epsDiluted                 vendor            1.51   sec            1.51   diff 0.0%
weightedAverageShsOutDil   vendor     100,000,000   sec      82,370,000   diff 21.4%
reddit.com
u/Bmoses99 — 1 month ago

1 in 10 fundamentals rows didn't match the SEC. How do you handle restatements in a backtest?

Building a fundamentals factor backtest, got paranoid about the feed after the data quality threads I have seen here. Wanted to make sure nothing was poisoned. Ran 60 S&P 500 names, latest fiscal year, revenue, net income, diluted EPS, diluted shares. My vendor (used fmp's free api) against SEC companyfacts.

About 9 in 10 rows tie within 1%. The rest took a day to sort out:

  • Splits. CRWD and CVNA read 4x and 5x off. Both split after fiscal year end. The feed is split-adjusted, the 10-K isn't. My diff was wrong, not the data.
  • Restatements. The SEC carries two values for the same period once the next 10-K restates. Which one is "right" depends on the date your backtest is standing on.
  • Definitions. Asset managers and brokers tag revenue gross or net (ARES, KKR, BX, IBKR). Same filing, two tags.
  • One real one. AXON diluted shares came back as 100,000,000 exactly. The 10-K says 82.4M. Reported it.

The actual question: first-filed or latest-restated? companyfacts gives you both if you keep the filed date. Every vendor I've used gives latest. Leaning first-filed with a lag, which means building the as-of layer myself. Still not sure 100% tho

How im running it if anyone is curious:

import requests

KEY = "YOUR_API_KEY"
sym = "AXON"

fmp = requests.get(f"https://financialmodelingprep.com/stable/income-statement?symbol={sym}&period=annual&limit=1&apikey={KEY}").json()[0]
cik = requests.get(f"https://financialmodelingprep.com/stable/profile?symbol={sym}&apikey={KEY}").json()[0]["cik"]
sec = requests.get(f"https://data.sec.gov/api/xbrl/companyfacts/CIK{int(cik):010d}.json", headers={"User-Agent": "you@example.com"}).json()["facts"]["us-gaap"]

def from_10k(tags, unit):
    rows = [r for t in tags if t in sec for r in sec[t]["units"][unit] if r["end"] == fmp["date"] and r["fp"] == "FY"]
    return max(rows, key=lambda r: r["filed"])["val"] if rows else None

for field, tags, unit in [("revenue", ["Revenues", "RevenueFromContractWithCustomerExcludingAssessedTax"], "USD"),
                          ("netIncome", ["NetIncomeLoss"], "USD"),
                          ("epsDiluted", ["EarningsPerShareDiluted", "EarningsPerShareBasicAndDiluted"], "USD/shares"),
                          ("weightedAverageShsOutDil", ["WeightedAverageNumberOfDilutedSharesOutstanding"], "shares")]:
    v, s = fmp[field], from_10k(tags, unit)
    sec_txt, diff = (f"{s:,}", f"{abs(v / s - 1) * 100:.1f}%") if s else ("n/a", "n/a")
    print(f"{field:26} vendor {v:>15,}   sec {sec_txt:>15}   diff {diff}")

output:

revenue                    vendor   2,779,536,000   sec   2,779,536,000   diff 0.0%
netIncome                  vendor     124,911,000   sec     124,656,000   diff 0.2%
epsDiluted                 vendor            1.51   sec            1.51   diff 0.0%
weightedAverageShsOutDil   vendor     100,000,000   sec      82,370,000   diff 21.4%
reddit.com
u/Bmoses99 — 1 month ago
▲ 38 r/FMPDATA+1 crossposts

GameStop just posted its second most profitable quarter in 25 years. Sales fell 19%

Net income $298.7 million on $790.2 million of sales. 38% net margin. The only bigger quarter in 25 years of filings is the one right before it.

Where the profit came from:

  • The stores: $160.2 million.
  • Interest on the cash: $77.1 million.
  • A derivative gain: $166.3 million.
  • The eBay stake: $72.1 million.
  • Digital assets: a $75.0 million loss.

62% of it came from outside the stores.

Sales $790.2 million, down 19%. Last year's quarter had the Switch 2 launch. Collectibles $356.3 million, up 57%, now 45% of sales. Gross margin 43.7%, from 29.1%.

GAAP EPS $0.51. Adjusted $0.27, in line.

$5.1 billion of cash and securities, down from $8.7 billion a year ago, plus $4.9 billion of eBay stock ahead of the proposed acquisition.

Trailing twelve months of sales: $3.55 billion. The January 2011 quarter alone did $3.69 billion.

Revenue and EPS were in the FMP earnings endpoint tonight. The rest is from the 8-K

reddit.com
u/Bmoses99 — 1 month ago