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.
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.
- StateNVDA
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
streak | rule | beat_streak >= 4Beat four quarters in a row |
beats3 | English → rule | Has the stock beaten EPS estimates in at least 3 of the last 4 quarters? |
big_react | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
trend_in | rule | days_to_earnings <= 10 and C > sma(C, 50)Earnings within 10 days, above the 50-day |
beat_next | forecast | Will the stock beat earnings next quarter? Beating earnings next quarter |
Answers
| Question | Answer | Reading |
|---|---|---|
soonReports earnings within 10 days | 0.0563 | false |
streakBeat four quarters in a row | 0.9463 | true |
beats3Has the stock beaten EPS estimates in at least 3 of the last 4 quarters compiled to beats_last4 >= 3 | 0.8591 | true |
big_reactLast earnings move bigger than 5% | 0.9463 | true |
trend_inEarnings within 10 days, above the 50-day | 0.0563 | false |
beat_nextBeating earnings next quarter | 0.516 | 52% · 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.
- StateJPM
- Questions6 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"JPM"} The server fills in the latest completed session.
Questions
both | rule | beat_eps_last > 0.5 and beat_revenue_last > 0.5Beat on EPS and revenue last quarter |
surprise | rule | eps_surprise_pct > 5EPS beat by more than 5% |
rev_beat | English → rule | Did revenue beat estimates last quarter? |
gap | rule | last_earnings_gap > 0Gapped up after the last report |
above_pre | rule | C > pre_earnings_closeHolding above the pre-earnings close |
eps_g | rule | eps_growth_yoy > 10EPS up more than 10% on the year |
Answers
| Question | Answer | Reading |
|---|---|---|
bothBeat on EPS and revenue last quarter | 0.1409 | false |
surpriseEPS beat by more than 5% | 0.0844 | false |
rev_beatDid revenue beat estimates last quarter compiled to beat_revenue_last > 0.5 | 0.1409 | false |
gapGapped up after the last report | 0.9463 | true |
above_preHolding above the pre-earnings close | 0.6505 | true |
eps_gEPS up more than 10% on the year | 0.6893 | true |
Actions
Rules on the answers decide what to send.
both >= 0.6→Emailresearch-teamelse→Emailresearch-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.
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"AMD"} then MU, TXN, QCOM, INTC, one request each. The server fills in the latest completed session.
Questions
trend | rule | C > ema(C, 20) and ema(C, 20) > sma(C, 50) and sma(C, 50) > sma(C, 200)Stacked averages: close > 20 EMA > 50 > 200 |
momentum | rule | roc(C, 20) > 5Up more than 5% in 20 sessions |
beat | English → rule | Did the stock beat EPS estimates last quarter? |
earn_soon | English → rule | Is earnings in the next 14 days? |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | trendrule | momentumrule | beatrule | earn_soonrule | beat_spyforecast |
|---|---|---|---|---|---|
AMD | 0.1048 | 0.0932 | 0.8591 | 0.9463 | 0.54 |
MU | 0.1325 | 0.07 | 0.8591 | 0.0537 | 0.559 |
TXN | 0.8676 | 0.3351 | 0.8591 | 0.0537 | 0.513 |
QCOM | 0.076 | 0.0884 | 0.1409 | 0.9463 | 0.506 |
INTC | 0.0538 | 0.058 | 0.8591 | 0.0537 | 0.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"
}
}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.
- ScheduleMon at 08:00 ET
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"PG"} then KO, PEP, CL, KMB, one request each. The server fills in the latest completed session.
Questions
raised | rule | raised_last > 0.5Raised its last dividend |
no_cut | rule | cut_last < 0.5Did not cut its last dividend |
yield3 | rule | div_yield_ttm > 3Yield above 3% |
grow10 | rule | years_of_growth >= 10Ten years of dividend growth |
trend | rule | div_yield_ttm > 2 and C > sma(C, 200)Yield above 2% and above the 200-day |
Answers
| Symbol | raisedrule | no_cutrule | yield3rule | grow10rule | trendrule |
|---|---|---|---|---|---|
PG | 0.1409 | 0.8591 | 0.2091 | 0.9463 | 0.9431 |
KO | 0.1409 | 0.8591 | 0.0537 | 0.9463 | 0.9463 |
PEP | 0.1409 | 0.8591 | 0.9463 | 0.9463 | 0.1034 |
CL | 0.1409 | 0.8591 | 0.0537 | 0.9463 | 0.9337 |
KMB | 0.1409 | 0.8591 | 0.9463 | 0.9463 | 0.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"
}
}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.
- StateNFLX
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NFLX"} The server fills in the latest completed session.
Questions
drift | rule | beat_eps_last > 0.5 and last_earnings_gap > 0 and C > pre_earnings_closePost-earnings drift: beat, gapped up, still above the pre-earnings close |
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
fell | English → rule | Did the stock fall after its last earnings report? |
macd | English → rule | Is the MACD line above its signal line? |
up_week | forecast | Will the stock be higher in a week? Higher in a week |
Answers
| Question | Answer | Reading |
|---|---|---|
driftPost-earnings drift: beat, gapped up, still above the pre-earnings close | 0.0537 | false |
recentReported in the last 5 days | 0.0813 | false |
fellDid the stock fall after its last earnings report compiled to last_earnings_move < 0 | 0.9463 | true |
macdIs the MACD line above its signal line compiled to macd(C) > macdsignal(C) | 0.1584 | false |
up_weekHigher in a week | 0.506 | 51% · 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.
- StateMSFT
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"MSFT"} The server fills in the latest completed session.
Questions
surprise | English → rule | Did EPS beat estimates by more than 5% last quarter? |
rev_growth | English → rule | Did revenue grow more than 5% year over year? |
eps_up | English → rule | Is EPS up year over year? |
gap | English → rule | Did the stock gap up after its last earnings? |
rev_surprise | rule | revenue_surprise_pct > 1Revenue beat estimates by more than 1% |
Answers
| Question | Answer | Reading |
|---|---|---|
surpriseDid EPS beat estimates by more than 5% last quarter compiled to eps_surprise_pct > 5 | 0.0537 | false |
rev_growthDid revenue grow more than 5% year over year compiled to revenue_growth_yoy > 5 | 0.9463 | true |
eps_upIs EPS up year over year compiled to last_eps > eps_year_ago | 0.9463 | true |
gapDid the stock gap up after its last earnings compiled to last_earnings_gap > 0 | 0.8374 | true |
rev_surpriseRevenue beat estimates by more than 1% | 0.9463 | true |
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.
- StateLLY
- Questions6 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"LLY"} The server fills in the latest completed session.
Questions
trend200 | English → rule | Is the stock above its 200-day moving average? |
slope | rule | linreg(C, 50) > ref(linreg(C, 50), -10)50-day regression line higher than ten sessions ago |
near_high | rule | C >= 0.98 * max(H, 252)Within 2% of the 52-week high |
drawdown | rule | C < 0.8 * max(H, 252)More than 20% off the 52-week high |
hv40 | rule | std(log(C / C[-1]), 20) * sqrt(252) > 0.4Annualized 20-day volatility above 40% |
rally10 | forecast | Will it rally at least 10% at some point in the next month? A 10% rally within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
trend200Is the stock above its 200-day moving average compiled to C > sma(C, 200) | 0.9463 | true |
slope50-day regression line higher than ten sessions ago | 0.9463 | true |
near_highWithin 2% of the 52-week high | 0.4572 | on the line (false) |
drawdownMore than 20% off the 52-week high | 0.0537 | false |
hv40Annualized 20-day volatility above 40% | 0.1939 | false |
rally10A 10% rally within a month | 0.603 | 60% · 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"
}
}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.
- State5 symbols
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"JPM"} then BAC, WFC, C, GS, one request each. The server fills in the latest completed session.
Questions
above_50d | rule | C > sma(C, 50)Above the 50-day average |
three_m | rule | C > C[-63]Higher than three months ago |
adx | rule | adx(14) > 20 and diplus(14) > diminus(14)Trending up (ADX over 20 and +DI over −DI) |
earn_soon | rule | days_to_earnings <= 10Reports earnings within 10 days |
beat_spy | forecast | Will it beat SPY over the next month? Beating SPY over a month |
Answers
| Symbol | above_50drule | three_mrule | adxrule | earn_soonrule | beat_spyforecast |
|---|---|---|---|---|---|
JPM | 0.3034 | 0.2625 | 0.1012 | 0.0537 | 0.488 |
BAC | 0.0951 | 0.1028 | 0.1214 | 0.0537 | 0.473 |
WFC | 0.3296 | 0.2303 | 0.1271 | 0.0537 | 0.505 |
C | 0.0765 | 0.1175 | 0.0891 | 0.0537 | 0.476 |
GS | 0.099 | 0.1125 | 0.2235 | 0.0537 | 0.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"
}
}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.
- StateAMZN
- Questions5 asked
- Answersreal, captured
- Actions2 rules · dry run
State
{"symbol":"AMZN"} The server fills in the latest completed session.
Questions
recent | rule | days_since_earnings <= 5Reported in the last 5 days |
big | rule | abs(last_earnings_move) > 5Last earnings move bigger than 5% |
gap | rule | last_earnings_gap > 0Gapped up after the last report |
surprise | rule | eps_surprise_pct > 5EPS beat by more than 5% |
drop5 | forecast | Will it drop at least 5% at some point in the next month? A 5% drawdown within a month |
Answers
| Question | Answer | Reading |
|---|---|---|
recentReported in the last 5 days | 0.8967 | true |
bigLast earnings move bigger than 5% | 0.0537 | false |
gapGapped up after the last report | 0.0537 | false |
surpriseEPS beat by more than 5% | 0.0537 | false |
drop5A 5% drawdown within a month | 0.462 | 46% · close to even |
Actions
Rules on the answers decide what to send.
recent >= 0.6 and big >= 0.6→Slackresearch-deskelse→Slackresearch-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.
- StateNVDA
- Questions5 asked
- Answersreal, captured
- Actionsnone
State
{"symbol":"NVDA"} The server fills in the latest completed session.
Questions
split3y | rule | days_since_split <= 1095Split in the last three years |
ratio4 | rule | last_split_ratio >= 4Last split at least 4-for-1 |
multi | rule | splits_5y >= 2Two or more splits in five years |
reverse | rule | reverse_split_last > 0.5Last split was a reverse split |
announced | rule | days_to_split <= 365A split is announced |
Answers
| Question | Answer | Reading |
|---|---|---|
split3ySplit in the last three years | 0.9463 | true |
ratio4Last split at least 4-for-1 | 0.9463 | true |
multiTwo or more splits in five years | 0.1409 | false |
reverseLast split was a reverse split | 0.1409 | false |
announcedA split is announced | 0.0537 | false |
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.