Ora
All use cases All industries

Individuals

Retail investorActive day traderSwing traderOptions traderDividend investorLong-term passive investorCrypto traderFX traderCommodities traderSocial trading communityStudents and universities

Buy side

Financial advisor / RIAWealth managerFamily officeHedge fund PMQuant researcherPortfolio manager (long-only)Risk managerPrivate equityVC / growth investorFund-of-funds allocator

Sell side

Equity research analystSell-side sales traderExecution trader / deskMarket makerProp trading firmCompliance officer

Corporates

Investor relations teamCorporate treasuryCFO officeBank credit analystFinancial journalist / media

Builders

Quant developerFintech app builderRobo-advisorBroker appAlgo / bot developerData vendor / platformTrading educator / newsletter

Institutions

ETF issuerIndex providerInsurance investment officePension fundEndowmentSovereign wealth fund

Use cases · Sell side

Equity research analyst: 21 ways to use Ora

Covers a sector: earnings previews and reviews, estimate beats, dividends and the tape. Each example is a complete, runnable request with the real answers it returned (42 requests, captured 2026-10-31), what they mean and, where it fits, the action it would send.

Answers were captured on ora-fin-0.1.1. Another model changes the request JSON and the Playground link; run it there to see its answers.
Rule functions and facts used by this player (69)

sma 13days_to_earnings 5beat_eps_last 4last_earnings_gap 4last_eps 4abs 3last_earnings_move 3eps_surprise_pct 3raised_last 3max 3beat_streak 2pre_earnings_close 2ema 2div_yield_ttm 2years_of_growth 2days_since_earnings 2eps_year_ago 2offset 2adx 2diminus 2diplus 2days_to_split 2beats_last4 1beat_revenue_last 1eps_growth_yoy 1roc 1cut_last 1macd 1macdsignal 1revenue_growth_yoy 1revenue_surprise_pct 1linreg 1log 1ref 1sqrt 1std 1days_since_split 1last_split_ratio 1reverse_split_last 1splits_5y 1atr 1cci 1willr 1next_report_amc 1next_report_bmo 1miss_eps_last 1misses_last4 1swinghigh 1swinglow 1hlc3 1median 1obv 1percentrank 1sum 1harami_bull 1morning_star 1piercing_line 1tweezer_bottom 1rsi 1wma 1barssince 1highest 1highestbars 1last_div_amount 1last_eps_est 1last_revenue 1next_split_ratio 1prev_div_amount 1revenue_year_ago 1

Examples 1–10 of 21 · page 1 of 3

Equity research analyst · example 1

NVDA earnings preview: date, streak and setup into the print

Build the preview note: when NVDA reports, its beat record, how it reacted last time, and whether the stock goes into the print in an uptrend.

ora-fin-0.1.1NVDA6 questions
  1. StateNVDA
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"NVDA"} The server fills in the latest completed session.

Questions

soonruledays_to_earnings <= 10
Reports earnings within 10 days
streakrulebeat_streak >= 4
Beat four quarters in a row
beats3English → ruleHas the stock beaten EPS estimates in at least 3 of the last 4 quarters?
big_reactruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
trend_inruledays_to_earnings <= 10 and C > sma(C, 50)
Earnings within 10 days, above the 50-day
beat_nextforecastWill the stock beat earnings next quarter?
Beating earnings next quarter

Answers

QuestionAnswerReading
soon
Reports earnings within 10 days
0.0563false
streak
Beat four quarters in a row
0.9463true
beats3
Has the stock beaten EPS estimates in at least 3 of the last 4 quarters
compiled to beats_last4 >= 3
0.8591true
big_react
Last earnings move bigger than 5%
0.9463true
trend_in
Earnings within 10 days, above the 50-day
0.0563false
beat_next
Beating earnings next quarter
0.51652% · close to even

What it means

For NVDA on the session of 2026-10-30: True now: Beat four quarters in a row; Has the stock beaten EPS estimates in at least 3 of the last 4 quarters; Last earnings move bigger than 5%. Not true: Reports earnings within 10 days; Earnings within 10 days, above the 50-day. Forecasts: Beating earnings next quarter 52%.

The facts fill the preview table directly; the beat-next-quarter forecast is shown as odds, separate from the analyst's own estimate.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "streak": {
      "type": "yes_no",
      "ask": "beat_streak >= 4"
    },
    "beats3": {
      "type": "yes_no",
      "instructions": "Has the stock beaten EPS estimates in at least 3 of the last 4 quarters?"
    },
    "big_react": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "trend_in": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10 and C > sma(C, 50)"
    },
    "beat_next": {
      "type": "yes_no",
      "instructions": "Will the stock beat earnings next quarter?"
    }
  }
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "soon": {
      "yes_no": 0.0563,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "streak": {
      "yes_no": 0.9463,
      "rule": "beat_streak >= 4",
      "basis": "rule"
    },
    "beats3": {
      "yes_no": 0.8591,
      "rule": "beats_last4 >= 3",
      "basis": "pattern"
    },
    "big_react": {
      "yes_no": 0.9463,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "trend_in": {
      "yes_no": 0.0563,
      "rule": "days_to_earnings <= 10 and C > sma(C, 50)",
      "basis": "rule"
    },
    "beat_next": {
      "yes_no": 0.516
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  }
}

abs beat_streak beats_last4 days_to_earnings last_earnings_move sma

Equity research analyst · example 2

JPM earnings review: beat on both lines, and did the stock hold?

After the bank reports, document whether EPS and revenue beat, the surprise size, the gap, and whether the stock holds above its pre-report close.

ora-fin-0.1.1JPM6 questions2 actions
  1. StateJPM
  2. Questions6 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

{"symbol":"JPM"} The server fills in the latest completed session.

Questions

bothrulebeat_eps_last > 0.5 and beat_revenue_last > 0.5
Beat on EPS and revenue last quarter
surpriseruleeps_surprise_pct > 5
EPS beat by more than 5%
rev_beatEnglish → ruleDid revenue beat estimates last quarter?
gaprulelast_earnings_gap > 0
Gapped up after the last report
above_preruleC > pre_earnings_close
Holding above the pre-earnings close
eps_gruleeps_growth_yoy > 10
EPS up more than 10% on the year

Answers

QuestionAnswerReading
both
Beat on EPS and revenue last quarter
0.1409false
surprise
EPS beat by more than 5%
0.0844false
rev_beat
Did revenue beat estimates last quarter
compiled to beat_revenue_last > 0.5
0.1409false
gap
Gapped up after the last report
0.9463true
above_pre
Holding above the pre-earnings close
0.6505true
eps_g
EPS up more than 10% on the year
0.6893true

Actions

Rules on the answers decide what to send.

both >= 0.6→Emailresearch-team
else→Emailresearch-team
What each action would send 1 of 2 fired · dry run, nothing sent
review_noterule false: skipped
mixed_notewould send (dry run)Email → research-team
{
  "subject": "JPM review: mixed quarter (2026-10-30)",
  "text": "JPM did not beat on both lines (rule 14%). Revenue beat: 14%. EPS growth over 10%: 69%."
}

What it means

For JPM on the session of 2026-10-30: True now: Gapped up after the last report; Holding above the pre-earnings close; EPS up more than 10% on the year. Not true: Beat on EPS and revenue last quarter; EPS beat by more than 5%; Did revenue beat estimates last quarter. Fired: mixed_note (Email → research-team).

Either branch drafts the review email to the team; the analyst adds the why, the facts are already in it.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "both": {
      "type": "yes_no",
      "ask": "beat_eps_last > 0.5 and beat_revenue_last > 0.5"
    },
    "surprise": {
      "type": "yes_no",
      "ask": "eps_surprise_pct > 5"
    },
    "rev_beat": {
      "type": "yes_no",
      "instructions": "Did revenue beat estimates last quarter?"
    },
    "gap": {
      "type": "yes_no",
      "ask": "last_earnings_gap > 0"
    },
    "above_pre": {
      "type": "yes_no",
      "ask": "C > pre_earnings_close"
    },
    "eps_g": {
      "type": "yes_no",
      "ask": "eps_growth_yoy > 10"
    }
  },
  "actions": [
    {
      "id": "review_note",
      "when": "both >= 0.6",
      "do": "email",
      "connection": "research-team",
      "subject": "{{symbol}} review: beat on EPS and revenue ({{as_of}})",
      "message": "{{symbol}} beat on both lines ({{both|pct}}). Surprise over 5%: {{surprise|pct}}. Gapped up: {{gap|pct}}. Holding above the pre-report close: {{above_pre|pct}}."
    },
    {
      "id": "mixed_note",
      "when": "else",
      "do": "email",
      "connection": "research-team",
      "subject": "{{symbol}} review: mixed quarter ({{as_of}})",
      "message": "{{symbol}} did not beat on both lines (rule {{both|pct}}). Revenue beat: {{rev_beat|pct}}. EPS growth over 10%: {{eps_g|pct}}."
    }
  ],
  "dry_run": true
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "both": {
      "yes_no": 0.1409,
      "rule": "beat_eps_last > 0.5 and beat_revenue_last > 0.5",
      "basis": "rule"
    },
    "surprise": {
      "yes_no": 0.0844,
      "rule": "eps_surprise_pct > 5",
      "basis": "rule"
    },
    "rev_beat": {
      "yes_no": 0.1409,
      "rule": "beat_revenue_last > 0.5",
      "basis": "pattern"
    },
    "gap": {
      "yes_no": 0.9463,
      "rule": "last_earnings_gap > 0",
      "basis": "rule"
    },
    "above_pre": {
      "yes_no": 0.6505,
      "rule": "C > pre_earnings_close",
      "basis": "rule"
    },
    "eps_g": {
      "yes_no": 0.6893,
      "rule": "eps_growth_yoy > 10",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "review_note",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "mixed_note",
      "fired": true,
      "status": "dry_run",
      "do": "email",
      "connection": "research-team",
      "preview": {
        "subject": "JPM review: mixed quarter (2026-10-30)",
        "text": "JPM did not beat on both lines (rule 14%). Revenue beat: 14%. EPS growth over 10%: 69%."
      }
    }
  ]
}

beat_eps_last beat_revenue_last eps_growth_yoy eps_surprise_pct last_earnings_gap pre_earnings_close

Equity research analyst · example 3

Semiconductor coverage sheet: AMD, MU, TXN, QCOM, INTC

One row per covered chip name: trend, momentum, last quarter's beat and next report date, for the weekly sector pack.

ora-fin-0.1.15 symbols, one request each5 questions
  1. State5 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"AMD"} then MU, TXN, QCOM, INTC, one request each. The server fills in the latest completed session.

Questions

trendruleC > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)
Stacked averages: close > 20 EMA > 50 > 200
momentumruleroc(C, 20) > 5
Up more than 5% in 20 sessions
beatEnglish → ruleDid the stock beat EPS estimates last quarter?
earn_soonEnglish → ruleIs earnings in the next 14 days?
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symboltrendrulemomentumrulebeatruleearn_soonrulebeat_spyforecast
AMD0.10480.09320.85910.94630.54
MU0.13250.070.85910.05370.559
TXN0.86760.33510.85910.05370.513
QCOM0.0760.08840.14090.94630.506
INTC0.05380.0580.85910.05370.525

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 5 symbols: Stacked averages: close > 20 EMA > 50 > 200: true for TXN of 5. Up more than 5% in 20 sessions: true for none of 5. Did the stock beat EPS estimates last quarter: true for AMD, MU, TXN, INTC of 5. Is earnings in the next 14 days: true for AMD, QCOM of 5. Highest odds for “Beating SPY over a month”: MU at 56%.

Identical questions per symbol make the sheet comparable; sort by trend and odds of beating SPY, flag names reporting soon.

Request JSON (AMD; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AMD"
  },
  "questions": {
    "trend": {
      "type": "yes_no",
      "ask": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)"
    },
    "momentum": {
      "type": "yes_no",
      "ask": "roc(C, 20) > 5"
    },
    "beat": {
      "type": "yes_no",
      "instructions": "Did the stock beat EPS estimates last quarter?"
    },
    "earn_soon": {
      "type": "yes_no",
      "instructions": "Is earnings in the next 14 days?"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (AMD, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend": {
      "yes_no": 0.1048,
      "rule": "C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)",
      "basis": "rule"
    },
    "momentum": {
      "yes_no": 0.0932,
      "rule": "roc(C, 20) > 5",
      "basis": "rule"
    },
    "beat": {
      "yes_no": 0.8591,
      "rule": "beat_eps_last > 0.5",
      "basis": "pattern"
    },
    "earn_soon": {
      "yes_no": 0.9463,
      "rule": "days_to_earnings <= 14",
      "basis": "pattern"
    },
    "beat_spy": {
      "yes_no": 0.54
    }
  },
  "context": {
    "symbol": "AMD",
    "as_of": "2026-10-30"
  }
}

beat_eps_last days_to_earnings ema roc sma

Equity research analyst · example 4

Staples dividend monitor: PG, KO, PEP, CL, KMB

Track payout facts for the consumer staples coverage list: still raising, no cut, yield level and growth streak.

ora-fin-0.1.15 symbols, one request each5 questionsworkflow · Mon at 08:00 ET
  1. ScheduleMon at 08:00 ET
  2. State5 symbols
  3. Questions5 asked
  4. Answersreal, captured
  5. Actionsnone

State

{"symbol":"PG"} then KO, PEP, CL, KMB, one request each. The server fills in the latest completed session.

Questions

raisedruleraised_last > 0.5
Raised its last dividend
no_cutrulecut_last < 0.5
Did not cut its last dividend
yield3rulediv_yield_ttm > 3
Yield above 3%
grow10ruleyears_of_growth >= 10
Ten years of dividend growth
trendrulediv_yield_ttm > 2 and C > sma(C, 200)
Yield above 2% and above the 200-day

Answers

Symbolraisedruleno_cutruleyield3rulegrow10ruletrendrule
PG0.14090.85910.20910.94630.9431
KO0.14090.85910.05370.94630.9463
PEP0.14090.85910.94630.94630.1034
CL0.14090.85910.05370.94630.9337
KMB0.14090.85910.94630.94630.8926

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 5 symbols: Raised its last dividend: true for none of 5. Did not cut its last dividend: true for PG, KO, PEP, CL, KMB of 5. Yield above 3%: true for PEP, KMB of 5. Ten years of dividend growth: true for PG, KO, PEP, CL, KMB of 5.

A Monday workflow refreshes the dividend table; a cut or a lost streak is the line to write about.

As a scheduled workflow (Mon at 08:00 ET)

Create it under Workflows in the console: it runs these questions for every symbol on the schedule and fires the actions per symbol. The answers above are what one run returned.

{
  "name": "Staples dividend monitor: PG, KO, PEP, CL, KMB",
  "symbols": "PG KO PEP CL KMB",
  "days": [
    1
  ],
  "at_time": "08:00",
  "model": "ora-fin-0.1.1",
  "questions": {
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "no_cut": {
      "type": "yes_no",
      "ask": "cut_last < 0.5"
    },
    "yield3": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 3"
    },
    "grow10": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "trend": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 2 and C > sma(C, 200)"
    }
  }
}
Request JSON (PG; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "PG"
  },
  "questions": {
    "raised": {
      "type": "yes_no",
      "ask": "raised_last > 0.5"
    },
    "no_cut": {
      "type": "yes_no",
      "ask": "cut_last < 0.5"
    },
    "yield3": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 3"
    },
    "grow10": {
      "type": "yes_no",
      "ask": "years_of_growth >= 10"
    },
    "trend": {
      "type": "yes_no",
      "ask": "div_yield_ttm > 2 and C > sma(C, 200)"
    }
  }
}
Response JSON (PG, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "raised": {
      "yes_no": 0.1409,
      "rule": "raised_last > 0.5",
      "basis": "rule"
    },
    "no_cut": {
      "yes_no": 0.8591,
      "rule": "cut_last < 0.5",
      "basis": "rule"
    },
    "yield3": {
      "yes_no": 0.2091,
      "rule": "div_yield_ttm > 3",
      "basis": "rule"
    },
    "grow10": {
      "yes_no": 0.9463,
      "rule": "years_of_growth >= 10",
      "basis": "rule"
    },
    "trend": {
      "yes_no": 0.9431,
      "rule": "div_yield_ttm > 2 and C > sma(C, 200)",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "PG",
    "as_of": "2026-10-30"
  }
}

cut_last div_yield_ttm raised_last sma years_of_growth

Equity research analyst · example 5

NFLX post-earnings drift check for the follow-up note

Days after the report, check whether the beat, gap and hold above the pre-report price add up to drift.

ora-fin-0.1.1NFLX5 questions
  1. StateNFLX
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"NFLX"} The server fills in the latest completed session.

Questions

driftrulebeat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_close
Post-earnings drift: beat, gapped up, still above the pre-earnings close
recentruledays_since_earnings <= 5
Reported in the last 5 days
fellEnglish → ruleDid the stock fall after its last earnings report?
macdEnglish → ruleIs the MACD line above its signal line?
up_weekforecastWill the stock be higher in a week?
Higher in a week

Answers

QuestionAnswerReading
drift
Post-earnings drift: beat, gapped up, still above the pre-earnings close
0.0537false
recent
Reported in the last 5 days
0.0813false
fell
Did the stock fall after its last earnings report
compiled to last_earnings_move < 0
0.9463true
macd
Is the MACD line above its signal line
compiled to macd(C) > macdsignal(C)
0.1584false
up_week
Higher in a week
0.50651% · close to even

What it means

For NFLX on the session of 2026-10-30: True now: Did the stock fall after its last earnings report. Not true: Post-earnings drift: beat, gapped up, still above the pre-earnings close; Reported in the last 5 days; Is the MACD line above its signal line. Forecasts: Higher in a week 51%.

Drift true supports a 'the market is still repricing' paragraph; false means the reaction is already in the price.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NFLX"
  },
  "questions": {
    "drift": {
      "type": "yes_no",
      "ask": "beat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_close"
    },
    "recent": {
      "type": "yes_no",
      "ask": "days_since_earnings <= 5"
    },
    "fell": {
      "type": "yes_no",
      "instructions": "Did the stock fall after its last earnings report?"
    },
    "macd": {
      "type": "yes_no",
      "instructions": "Is the MACD line above its signal line?"
    },
    "up_week": {
      "type": "yes_no",
      "instructions": "Will the stock be higher in a week?"
    }
  }
}
Response JSON (NFLX, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "drift": {
      "yes_no": 0.0537,
      "rule": "beat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_close",
      "basis": "rule"
    },
    "recent": {
      "yes_no": 0.0813,
      "rule": "days_since_earnings <= 5",
      "basis": "rule"
    },
    "fell": {
      "yes_no": 0.9463,
      "rule": "last_earnings_move < 0",
      "basis": "pattern"
    },
    "macd": {
      "yes_no": 0.1584,
      "rule": "macd(C) > macdsignal(C)",
      "basis": "comparison"
    },
    "up_week": {
      "yes_no": 0.506
    }
  },
  "context": {
    "symbol": "NFLX",
    "as_of": "2026-10-30"
  }
}

beat_eps_last days_since_earnings last_earnings_gap last_earnings_move macd macdsignal pre_earnings_close

Equity research analyst · example 6

MSFT beat quality: surprise size, growth and reaction

Separate a quality beat (revenue, growth, positive reaction) from a low-bar beat for the client call.

ora-fin-0.1.1MSFT5 questions
  1. StateMSFT
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"MSFT"} The server fills in the latest completed session.

Questions

surpriseEnglish → ruleDid EPS beat estimates by more than 5% last quarter?
rev_growthEnglish → ruleDid revenue grow more than 5% year over year?
eps_upEnglish → ruleIs EPS up year over year?
gapEnglish → ruleDid the stock gap up after its last earnings?
rev_surpriserulerevenue_surprise_pct > 1
Revenue beat estimates by more than 1%

Answers

QuestionAnswerReading
surprise
Did EPS beat estimates by more than 5% last quarter
compiled to eps_surprise_pct > 5
0.0537false
rev_growth
Did revenue grow more than 5% year over year
compiled to revenue_growth_yoy > 5
0.9463true
eps_up
Is EPS up year over year
compiled to last_eps > eps_year_ago
0.9463true
gap
Did the stock gap up after its last earnings
compiled to last_earnings_gap > 0
0.8374true
rev_surprise
Revenue beat estimates by more than 1%
0.9463true

What it means

For MSFT on the session of 2026-10-30: True now: Did revenue grow more than 5% year over year; Is EPS up year over year; Did the stock gap up after its last earnings; Revenue beat estimates by more than 1%. Not true: Did EPS beat estimates by more than 5% last quarter.

Growth and revenue facts true alongside the EPS beat is the stronger story; a beat with a negative reaction is worth a paragraph on expectations.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "MSFT"
  },
  "questions": {
    "surprise": {
      "type": "yes_no",
      "instructions": "Did EPS beat estimates by more than 5% last quarter?"
    },
    "rev_growth": {
      "type": "yes_no",
      "instructions": "Did revenue grow more than 5% year over year?"
    },
    "eps_up": {
      "type": "yes_no",
      "instructions": "Is EPS up year over year?"
    },
    "gap": {
      "type": "yes_no",
      "instructions": "Did the stock gap up after its last earnings?"
    },
    "rev_surprise": {
      "type": "yes_no",
      "ask": "revenue_surprise_pct > 1"
    }
  }
}
Response JSON (MSFT, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "surprise": {
      "yes_no": 0.0537,
      "rule": "eps_surprise_pct > 5",
      "basis": "pattern"
    },
    "rev_growth": {
      "yes_no": 0.9463,
      "rule": "revenue_growth_yoy > 5",
      "basis": "pattern"
    },
    "eps_up": {
      "yes_no": 0.9463,
      "rule": "last_eps > eps_year_ago",
      "basis": "pattern"
    },
    "gap": {
      "yes_no": 0.8374,
      "rule": "last_earnings_gap > 0",
      "basis": "pattern"
    },
    "rev_surprise": {
      "yes_no": 0.9463,
      "rule": "revenue_surprise_pct > 1",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "MSFT",
    "as_of": "2026-10-30"
  }
}

eps_surprise_pct eps_year_ago last_earnings_gap last_eps revenue_growth_yoy revenue_surprise_pct

Equity research analyst · example 7

LLY initiation: the technical context section

For a new coverage initiation, describe the chart objectively: long trend, regression slope, distance from highs and volatility.

ora-fin-0.1.1LLY6 questions
  1. StateLLY
  2. Questions6 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"LLY"} The server fills in the latest completed session.

Questions

trend200English → ruleIs the stock above its 200-day moving average?
sloperulelinreg(C, 50) > ref(linreg(C, 50), -10)
50-day regression line higher than ten sessions ago
near_highruleC >= 0.98 * max(H, 252)
Within 2% of the 52-week high
drawdownruleC < 0.8 * max(H, 252)
More than 20% off the 52-week high
hv40rulestd(log(C / C[-1]), 20) * sqrt(252) > 0.4
Annualized 20-day volatility above 40%
rally10forecastWill it rally at least 10% at some point in the next month?
A 10% rally within a month

Answers

QuestionAnswerReading
trend200
Is the stock above its 200-day moving average
compiled to C > sma(C, 200)
0.9463true
slope
50-day regression line higher than ten sessions ago
0.9463true
near_high
Within 2% of the 52-week high
0.4572on the line (false)
drawdown
More than 20% off the 52-week high
0.0537false
hv40
Annualized 20-day volatility above 40%
0.1939false
rally10
A 10% rally within a month
0.60360% · likely

What it means

For LLY on the session of 2026-10-30: True now: Is the stock above its 200-day moving average; 50-day regression line higher than ten sessions ago. Not true: More than 20% off the 52-week high; Annualized 20-day volatility above 40%. On the line: Within 2% of the 52-week high. Forecasts: A 10% rally within a month 60%.

The answers become plain sentences in the initiation; the forecast is labelled as model odds, not the rating.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "LLY"
  },
  "questions": {
    "trend200": {
      "type": "yes_no",
      "instructions": "Is the stock above its 200-day moving average?"
    },
    "slope": {
      "type": "yes_no",
      "ask": "linreg(C, 50) > ref(linreg(C, 50), -10)"
    },
    "near_high": {
      "type": "yes_no",
      "ask": "C >= 0.98 * max(H, 252)"
    },
    "drawdown": {
      "type": "yes_no",
      "ask": "C < 0.8 * max(H, 252)"
    },
    "hv40": {
      "type": "yes_no",
      "ask": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4"
    },
    "rally10": {
      "type": "yes_no",
      "instructions": "Will it rally at least 10% at some point in the next month?"
    }
  }
}
Response JSON (LLY, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "trend200": {
      "yes_no": 0.9463,
      "rule": "C > sma(C, 200)",
      "basis": "comparison"
    },
    "slope": {
      "yes_no": 0.9463,
      "rule": "linreg(C, 50) > ref(linreg(C, 50), -10)",
      "basis": "rule"
    },
    "near_high": {
      "yes_no": 0.4572,
      "rule": "C >= 0.98 * max(H, 252)",
      "basis": "rule"
    },
    "drawdown": {
      "yes_no": 0.0537,
      "rule": "C < 0.8 * max(H, 252)",
      "basis": "rule"
    },
    "hv40": {
      "yes_no": 0.1939,
      "rule": "std(log(C / C[-1]), 20) * sqrt(252) > 0.4",
      "basis": "rule"
    },
    "rally10": {
      "yes_no": 0.603
    }
  },
  "context": {
    "symbol": "LLY",
    "as_of": "2026-10-30"
  }
}

linreg log max offset ref sma sqrt std

Equity research analyst · example 8

Bank peers relative strength: JPM, BAC, WFC, C, GS

Rank the large banks by trend and momentum before the sector earnings season preview.

ora-fin-0.1.15 symbols, one request each5 questions
  1. State5 symbols
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"JPM"} then BAC, WFC, C, GS, one request each. The server fills in the latest completed session.

Questions

above_50druleC > sma(C, 50)
Above the 50-day average
three_mruleC > C[-63]
Higher than three months ago
adxruleadx(14) > 20 and diplus(14) > diminus(14)
Trending up (ADX over 20 and +DI over −DI)
earn_soonruledays_to_earnings <= 10
Reports earnings within 10 days
beat_spyforecastWill it beat SPY over the next month?
Beating SPY over a month

Answers

Symbolabove_50drulethree_mruleadxruleearn_soonrulebeat_spyforecast
JPM0.30340.26250.10120.05370.488
BAC0.09510.10280.12140.05370.473
WFC0.32960.23030.12710.05370.505
C0.07650.11750.08910.05370.476
GS0.0990.11250.22350.05370.529

true false not known for rules; forecasts are odds. Hover a column for its question.

What it means

Session of 2026-10-30, 5 symbols: Above the 50-day average: true for none of 5. Higher than three months ago: true for none of 5. Trending up (ADX over 20 and +DI over −DI): true for none of 5. Reports earnings within 10 days: true for none of 5. Highest odds for “Beating SPY over a month”: GS at 53%.

Leaders on trend and momentum go first in the preview; a name reporting within days gets its own line.

Request JSON (JPM; the others differ only in the symbol)
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "JPM"
  },
  "questions": {
    "above_50d": {
      "type": "yes_no",
      "ask": "C > sma(C, 50)"
    },
    "three_m": {
      "type": "yes_no",
      "ask": "C > C[-63]"
    },
    "adx": {
      "type": "yes_no",
      "ask": "adx(14) > 20 and diplus(14) > diminus(14)"
    },
    "earn_soon": {
      "type": "yes_no",
      "ask": "days_to_earnings <= 10"
    },
    "beat_spy": {
      "type": "yes_no",
      "instructions": "Will it beat SPY over the next month?"
    }
  }
}
Response JSON (JPM, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "above_50d": {
      "yes_no": 0.3034,
      "rule": "C > sma(C, 50)",
      "basis": "rule"
    },
    "three_m": {
      "yes_no": 0.2625,
      "rule": "C > C[-63]",
      "basis": "rule"
    },
    "adx": {
      "yes_no": 0.1012,
      "rule": "adx(14) > 20 and diplus(14) > diminus(14)",
      "basis": "rule"
    },
    "earn_soon": {
      "yes_no": 0.0537,
      "rule": "days_to_earnings <= 10",
      "basis": "rule"
    },
    "beat_spy": {
      "yes_no": 0.488
    }
  },
  "context": {
    "symbol": "JPM",
    "as_of": "2026-10-30"
  }
}

adx days_to_earnings diminus diplus offset sma

Equity research analyst · example 9

AMZN: flag an outsized earnings reaction to the desk

When the report reaction exceeds five percent, post to the research Slack so the analyst can publish a quick take.

ora-fin-0.1.1AMZN5 questions2 actions
  1. StateAMZN
  2. Questions5 asked
  3. Answersreal, captured
  4. Actions2 rules · dry run

State

{"symbol":"AMZN"} The server fills in the latest completed session.

Questions

recentruledays_since_earnings <= 5
Reported in the last 5 days
bigruleabs(last_earnings_move) > 5
Last earnings move bigger than 5%
gaprulelast_earnings_gap > 0
Gapped up after the last report
surpriseruleeps_surprise_pct > 5
EPS beat by more than 5%
drop5forecastWill it drop at least 5% at some point in the next month?
A 5% drawdown within a month

Answers

QuestionAnswerReading
recent
Reported in the last 5 days
0.8967true
big
Last earnings move bigger than 5%
0.0537false
gap
Gapped up after the last report
0.0537false
surprise
EPS beat by more than 5%
0.0537false
drop5
A 5% drawdown within a month
0.46246% · close to even

Actions

Rules on the answers decide what to send.

recent >= 0.6 and big >= 0.6→Slackresearch-desk
else→Slackresearch-desk
What each action would send 1 of 2 fired · dry run, nothing sent
quick_takerule false: skipped
no_takewould send (dry run)Slack → research-desk
{
  "text": "AMZN (2026-10-30): no outsized post-earnings reaction to write up (recent report 90%, big reaction 5%)."
}

What it means

For AMZN on the session of 2026-10-30: True now: Reported in the last 5 days. Not true: Last earnings move bigger than 5%; Gapped up after the last report; EPS beat by more than 5%. Forecasts: A 5% drawdown within a month 46%. Fired: no_take (Slack → research-desk).

The alert only asks for a quick take when the report is fresh and the move was big; otherwise it says so.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "AMZN"
  },
  "questions": {
    "recent": {
      "type": "yes_no",
      "ask": "days_since_earnings <= 5"
    },
    "big": {
      "type": "yes_no",
      "ask": "abs(last_earnings_move) > 5"
    },
    "gap": {
      "type": "yes_no",
      "ask": "last_earnings_gap > 0"
    },
    "surprise": {
      "type": "yes_no",
      "ask": "eps_surprise_pct > 5"
    },
    "drop5": {
      "type": "yes_no",
      "instructions": "Will it drop at least 5% at some point in the next month?"
    }
  },
  "actions": [
    {
      "id": "quick_take",
      "when": "recent >= 0.6 and big >= 0.6",
      "do": "slack",
      "connection": "research-desk",
      "message": "{{symbol}} ({{as_of}}): reported in the last 5 days and the reaction was over 5%. Gap up {{gap|pct}}, surprise over 5% {{surprise|pct}}. Quick take needed."
    },
    {
      "id": "no_take",
      "when": "else",
      "do": "slack",
      "connection": "research-desk",
      "message": "{{symbol}} ({{as_of}}): no outsized post-earnings reaction to write up (recent report {{recent|pct}}, big reaction {{big|pct}})."
    }
  ],
  "dry_run": true
}
Response JSON (AMZN, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "recent": {
      "yes_no": 0.8967,
      "rule": "days_since_earnings <= 5",
      "basis": "rule"
    },
    "big": {
      "yes_no": 0.0537,
      "rule": "abs(last_earnings_move) > 5",
      "basis": "rule"
    },
    "gap": {
      "yes_no": 0.0537,
      "rule": "last_earnings_gap > 0",
      "basis": "rule"
    },
    "surprise": {
      "yes_no": 0.0537,
      "rule": "eps_surprise_pct > 5",
      "basis": "rule"
    },
    "drop5": {
      "yes_no": 0.462
    }
  },
  "context": {
    "symbol": "AMZN",
    "as_of": "2026-10-30"
  },
  "actions": [
    {
      "id": "quick_take",
      "fired": false,
      "status": "skipped"
    },
    {
      "id": "no_take",
      "fired": true,
      "status": "dry_run",
      "do": "slack",
      "connection": "research-desk",
      "preview": {
        "text": "AMZN (2026-10-30): no outsized post-earnings reaction to write up (recent report 90%, big reaction 5%)."
      }
    }
  ]
}

abs days_since_earnings eps_surprise_pct last_earnings_gap last_earnings_move

Equity research analyst · example 10

NVDA split history for the per-share data footnote

Confirm recent splits and the ratio before comparing per-share numbers across years in a model.

ora-fin-0.1.1NVDA5 questions
  1. StateNVDA
  2. Questions5 asked
  3. Answersreal, captured
  4. Actionsnone

State

{"symbol":"NVDA"} The server fills in the latest completed session.

Questions

split3yruledays_since_split <= 1095
Split in the last three years
ratio4rulelast_split_ratio >= 4
Last split at least 4-for-1
multirulesplits_5y >= 2
Two or more splits in five years
reverserulereverse_split_last > 0.5
Last split was a reverse split
announcedruledays_to_split <= 365
A split is announced

Answers

QuestionAnswerReading
split3y
Split in the last three years
0.9463true
ratio4
Last split at least 4-for-1
0.9463true
multi
Two or more splits in five years
0.1409false
reverse
Last split was a reverse split
0.1409false
announced
A split is announced
0.0537false

What it means

For NVDA on the session of 2026-10-30: True now: Split in the last three years; Last split at least 4-for-1. Not true: Two or more splits in five years; Last split was a reverse split; A split is announced.

Split facts tell the analyst which periods need adjusting; an announced split is only known once it is in the record.

Request JSON
{
  "model": "ora-fin-0.1.1",
  "state": {
    "symbol": "NVDA"
  },
  "questions": {
    "split3y": {
      "type": "yes_no",
      "ask": "days_since_split <= 1095"
    },
    "ratio4": {
      "type": "yes_no",
      "ask": "last_split_ratio >= 4"
    },
    "multi": {
      "type": "yes_no",
      "ask": "splits_5y >= 2"
    },
    "reverse": {
      "type": "yes_no",
      "ask": "reverse_split_last > 0.5"
    },
    "announced": {
      "type": "yes_no",
      "ask": "days_to_split <= 365"
    }
  }
}
Response JSON (NVDA, real)
{
  "model": "ora-fin-0.1.1",
  "answers": {
    "split3y": {
      "yes_no": 0.9463,
      "rule": "days_since_split <= 1095",
      "basis": "rule"
    },
    "ratio4": {
      "yes_no": 0.9463,
      "rule": "last_split_ratio >= 4",
      "basis": "rule"
    },
    "multi": {
      "yes_no": 0.1409,
      "rule": "splits_5y >= 2",
      "basis": "rule"
    },
    "reverse": {
      "yes_no": 0.1409,
      "rule": "reverse_split_last > 0.5",
      "basis": "rule"
    },
    "announced": {
      "yes_no": 0.0537,
      "rule": "days_to_split <= 365",
      "basis": "rule"
    }
  },
  "context": {
    "symbol": "NVDA",
    "as_of": "2026-10-30"
  }
}

days_since_split days_to_split last_split_ratio reverse_split_last splits_5y

Information, not investment advice. Rules answer from the latest completed daily session; forecasts are probabilities. Actions ran as dry runs: nothing was sent. More in Sell side: Sell-side sales trader, Execution trader / desk, Market maker, Prop trading firm, Compliance officer.

Create an account Open the Playground Everything here also lives in the console, next to your keys and usage.