Financial and Quantitative Prompts
Earnings analysis, risk scoring, SEC filing extraction prompts.
Financial and Quantitative Prompts is a free AI Prompt Engineering lesson on CoddyKit — lesson 3 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the AI Prompt Engineering learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
Financial Prompting Context
Financial domain prompting extracts structured data from unstructured documents — earnings reports, SEC filings, analyst notes. Precision matters: a misread revenue figure or inverted growth direction can cause serious downstream errors.
Earnings Report Extraction Prompt
Earnings reports follow a semi-standard structure. A targeted extraction prompt pulls the key financial metrics precisely, handling both GAAP and non-GAAP variants.
EARNINGS_EXTRACTION_PROMPT = '''Extract the following financial metrics from the earnings report below.
Return ONLY a JSON object with these exact keys.
If a value is not stated, use null.
Do not calculate or derive values — only extract explicitly stated figures.
Required fields:
- revenue_usd_millions: total net revenue (GAAP)
- revenue_yoy_pct: year-over-year revenue growth percentage
- gross_margin_pct: gross margin percentage (GAAP)
- operating_income_usd_millions: GAAP operating income/loss
- ebitda_usd_millions: Adjusted EBITDA (non-GAAP, if reported)
- net_income_usd_millions: GAAP net income/loss
- eps_diluted: diluted EPS (GAAP)
- eps_adj_diluted: adjusted diluted EPS (non-GAAP, if reported)
- guidance_next_quarter_revenue_low: low end of next quarter revenue guidance
- guidance_next_quarter_revenue_high: high end of next quarter revenue guidance
- fiscal_period: e.g. "Q3 FY2024"
Earnings Report:
{report_text}'''
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
def extract_earnings(report_text):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=1000,
messages=[{'role': 'user', 'content':
EARNINGS_EXTRACTION_PROMPT.format(report_text=report_text)}]
)
return json.loads(response.content[0].text)Financial Ratio Calculation Prompt
When you want the model to calculate financial ratios, provide the formula explicitly. Do not assume the model knows the exact definition — different analysts use slightly different formulas.
RATIO_PROMPT = '''Calculate the following financial ratios using the data provided.
Show your work: state the formula, plug in the numbers, and give the result.
Round all ratios to 2 decimal places.
Ratios to calculate:
1. Gross Margin = (Revenue - COGS) / Revenue * 100
2. Operating Margin = Operating Income / Revenue * 100
3. Net Margin = Net Income / Revenue * 100
4. Current Ratio = Current Assets / Current Liabilities
5. Quick Ratio = (Current Assets - Inventory) / Current Liabilities
6. Debt-to-Equity = Total Debt / Total Shareholders Equity
7. Return on Equity (ROE) = Net Income / Average Shareholders Equity * 100
8. EV/EBITDA = Enterprise Value / EBITDA (if EV is provided)
Financial Data:
{financial_data}'''
def calculate_ratios(financial_data):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content':
RATIO_PROMPT.format(financial_data=financial_data)}]
)
return response.content[0].textYear-over-Year Growth Extraction
YoY growth can be reported as absolute change, percentage, or both. The prompt must handle all cases and distinguish between reported growth and constant-currency growth.
YOY_PROMPT = '''From the financial document below, extract year-over-year growth metrics.
For each metric found, provide:
- metric_name: e.g. "Revenue", "Gross Profit", "Operating Income"
- current_period: value and period (e.g. "$4.2B, Q3 2024")
- prior_period: value and period (e.g. "$3.8B, Q3 2023")
- yoy_change_pct: percentage change (positive = growth, negative = decline)
- constant_currency_yoy_pct: if reported, the constant-currency growth rate (else null)
- commentary: any management commentary on drivers of the change
IMPORTANT:
- Do not mix GAAP and non-GAAP figures in the same row.
- Mark each row with gaap: true or false.
- If growth is reported only in narrative form (e.g. "revenue grew 15%"),
still capture it but set current_period and prior_period to null.
Document:
{document_text}'''
def extract_yoy_growth(document_text):
import json
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content':
YOY_PROMPT.format(document_text=document_text)}]
)
return response.content[0].textSEC Filing Extraction Pattern
SEC filings (10-K, 10-Q) have standardized section headers. Target specific sections with section-aware extraction prompts to reduce context window usage and improve precision.
SEC_EXTRACTION_PROMPT = '''You are analyzing a {filing_type} SEC filing.
From {section_name}, extract the following:
{extraction_targets}
Rules:
1. Quote exact figures as stated — do not round or reformat numbers.
2. Note the fiscal year end and reporting currency.
3. If the section uses tables, extract all rows of the table.
4. Flag any restatements: "[RESTATED from prior filing]".
5. Note any forward-looking statements with [FLS] tag.
Filing Section Text:
{section_text}'''
# Section targets by filing type
SECTION_TARGETS = {
'10-K': {
'Item 7 MD&A': 'Revenue breakdown by segment, key cost drivers, liquidity discussion',
'Item 1A Risk Factors': 'Top 5 risks by category (operational, financial, regulatory, competitive)',
'Item 8 Financial Statements': 'Consolidated income statement, balance sheet key line items'
},
'10-Q': {
'Item 1 Financial Statements': 'Revenue, operating income, cash flow from operations',
'Item 2 MD&A': 'Quarter-over-quarter and YoY comparisons'
}
}
def extract_sec_section(filing_type, section_name, section_text):
targets = SEC_EXTRACTION_TARGETS = SECTION_TARGETS[filing_type][section_name]
response = client.messages.create(
model='claude-opus-4-5', max_tokens=3000,
messages=[{'role': 'user', 'content':
SEC_EXTRACTION_PROMPT.format(
filing_type=filing_type, section_name=section_name,
extraction_targets=targets, section_text=section_text
)}]
)
return response.content[0].textRisk Factor Summarization
SEC filings can have 50+ pages of risk factors. A summarization prompt that categorizes and ranks risks enables analysts to quickly identify the most material ones.
RISK_FACTOR_PROMPT = '''Summarize the risk factors from this SEC filing.
Categories to use:
1. Financial Risks (liquidity, debt, interest rate, FX)
2. Operational Risks (supply chain, technology, key personnel)
3. Regulatory / Legal Risks (compliance, litigation, government action)
4. Market / Competitive Risks (competition, market conditions, pricing)
5. Macroeconomic Risks (recession, inflation, geopolitical)
For each risk:
- Title: 5-8 word summary
- Category: one of the 5 above
- Materiality: HIGH / MEDIUM / LOW (based on language used: "could significantly...",
"may adversely affect...", "could result in material...")
- Summary: 2-3 sentence description
Sort each category by Materiality descending.
Limit to top 3 risks per category (15 total max).
Risk Factors Section:
{risk_factors_text}'''
def summarize_risk_factors(risk_factors_text):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=3000,
messages=[{'role': 'user', 'content':
RISK_FACTOR_PROMPT.format(risk_factors_text=risk_factors_text)}]
)
return response.content[0].textAnalyst Note Generation
After extracting and analyzing financial data, generate an analyst-style note summarizing the findings. The prompt must enforce the structure and objective tone of professional financial research.
ANALYST_NOTE_PROMPT = '''Write an equity research analyst note for the earnings results below.
STRUCTURE (required sections):
1. Headline: one sentence (include ticker, period, key takeaway, and target price if updated)
2. Investment Thesis: 2-3 sentences on the core bull/bear case
3. Earnings Summary: revenue, gross margin, EPS vs consensus estimates
4. Key Positives: 3 bullet points
5. Key Risks/Concerns: 3 bullet points
6. Guidance Commentary: management outlook, consensus vs guidance delta
7. Valuation: brief note on current multiple vs historical and peers
8. Recommendation: OUTPERFORM / MARKET PERFORM / UNDERPERFORM with 12-month target
TONE: Professional, data-driven, third person. Attribute claims to the company
("Management guided...", "The company reported...").
Do not use vague language — state numbers.
DISCLAIMER: This is AI-generated analysis for informational purposes only.
It does not constitute investment advice. Past performance is not indicative
of future results.
Earnings Data:
{earnings_data}'''Financial Disclaimer Patterns
Like legal and medical tools, financial AI tools require mandatory disclaimers. Inject them at the application layer to ensure they are never omitted.
FINANCIAL_DISCLAIMER = (
'\n\n---\n'
'DISCLAIMER: This content is generated by an AI system for informational '
'and educational purposes only. It does not constitute investment advice, '
'a solicitation to buy or sell any security, or a recommendation to invest. '
'Financial data extracted by AI may contain errors — always verify against '
'primary source filings. Past performance does not guarantee future results. '
'Consult a licensed financial advisor before making investment decisions.'
)
def get_financial_analysis(prompt):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content': prompt}]
)
raw = response.content[0].text
return raw + FINANCIAL_DISCLAIMER
# Always use get_financial_analysis() rather than calling the API directly
# to ensure disclaimer is never accidentally omittedGAAP vs Non-GAAP Disambiguation
One of the most common errors in financial extraction is mixing GAAP and non-GAAP figures. Prompts must explicitly require the model to label every number and flag discrepancies.
GAAP_PROMPT = '''Extract all income statement figures from the text below.
For every number:
- Label it as GAAP or Non-GAAP (Adjusted/Pro Forma)
- If the company reports both, show both on separate rows
- Never combine GAAP and Non-GAAP in a single calculation
Common non-GAAP labels to watch for:
"Adjusted", "Non-GAAP", "Pro Forma", "Normalized", "Underlying",
"Core", "Recurring", "Organic" (for revenue)
Output as a table:
| Metric | GAAP Value | Non-GAAP Value | Period |
|--------|------------|----------------|--------|
Also note in a separate section any reconciliation items between GAAP and Non-GAAP:
- Stock-based compensation
- Amortization of acquired intangibles
- Restructuring charges
- Any other adjustments
Document:
{document_text}'''
print('Always verify GAAP/Non-GAAP labels against the company\'s own reconciliation tables.')Multi-Period Trend Analysis
Single-period extraction gives a snapshot. A trend analysis prompt compares metrics across multiple periods to surface trajectory and acceleration/deceleration patterns.
TREND_PROMPT = '''Analyze the financial trend for {company_name} using the multi-period data below.
1. Create a summary table with these columns:
| Period | Revenue | Rev Growth YoY | Gross Margin | Op Margin | Net Margin |
2. Identify trends:
- Is revenue growth accelerating, decelerating, or stable?
- Margin expansion or compression trend?
- Any notable inflection points (period where trend changed direction)?
3. Key observations (5 bullet points max):
- Focus on directional changes, not just absolute numbers
- Note any seasonality patterns if visible in quarterly data
4. Risks in the trend:
- Flag any deterioration that management has not addressed
- Note if guidance implies trend continuation or reversal
Data ({num_periods} periods):
{multi_period_data}'''
def analyze_trend(company_name, multi_period_data, num_periods):
response = client.messages.create(
model='claude-opus-4-5', max_tokens=2000,
messages=[{'role': 'user', 'content':
TREND_PROMPT.format(
company_name=company_name,
multi_period_data=multi_period_data,
num_periods=num_periods
)}]
)
return response.content[0].textValidation: Cross-Checking Extracted Numbers
Financial extraction errors are dangerous. Build a validation step that cross-checks extracted numbers using accounting identities (e.g., gross profit = revenue - COGS) to detect hallucinations or extraction errors.
def validate_financials(extracted):
errors = []
# Check revenue consistency
if extracted.get('revenue_usd_millions') and extracted.get('cogs_usd_millions'):
calc_gp = extracted['revenue_usd_millions'] - extracted['cogs_usd_millions']
stated_gp = extracted.get('gross_profit_usd_millions')
if stated_gp and abs(calc_gp - stated_gp) > 1: # $1M tolerance
errors.append(
f'Gross profit mismatch: calculated {calc_gp:.1f}M '
f'vs stated {stated_gp:.1f}M'
)
# Check gross margin consistency
if extracted.get('revenue_usd_millions') and extracted.get('gross_profit_usd_millions'):
calc_gm = (extracted['gross_profit_usd_millions'] /
extracted['revenue_usd_millions']) * 100
stated_gm = extracted.get('gross_margin_pct')
if stated_gm and abs(calc_gm - stated_gm) > 0.5: # 0.5 pp tolerance
errors.append(
f'Gross margin mismatch: calculated {calc_gm:.1f}% '
f'vs stated {stated_gm:.1f}%'
)
return errors
# Always run validation after extraction
errors = validate_financials(extracted_data)
if errors:
print('Validation errors — manually verify:', errors)
else:
print('Validation passed')Quick Check
When extracting financial metrics from an earnings report, the model returns a gross margin of 45% but the revenue and COGS figures imply a gross margin of 51%. What should you do?
Financial Prompting Summary
Financial and quantitative prompting requires precision, labeling, and validation:
- Extraction prompts: specify exact field names and return JSON for machine processing
- Formula explicit: always provide the exact formula for ratio calculations
- GAAP vs non-GAAP: label every number — never mix in calculations
- SEC sections: target specific Item sections to reduce noise
- Validation: cross-check using accounting identities to detect extraction errors
- Disclaimers: always inject investment disclaimer at application layer
Frequently asked questions
Is the “Financial and Quantitative Prompts” lesson free?
Yes — the full text of “Financial and Quantitative Prompts” is free to read here on the web, and the AI Prompt Engineering course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the AI Prompt Engineering course, upgrade to CoddyKit PRO.
What will I learn in “Financial and Quantitative Prompts”?
Earnings analysis, risk scoring, SEC filing extraction prompts. You practise AI Prompt Engineering with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start AI Prompt Engineering?
No prior experience is required. AI Prompt Engineering on CoddyKit is structured for beginners through advanced learners; this is — lesson 3 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “Financial and Quantitative Prompts” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this AI Prompt Engineering lesson?
Yes. Every AI Prompt Engineering lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Legal Domain Prompt Patterns
- Medical and Clinical Prompting
- Financial and Quantitative Prompts
- Domain Glossary and Ontology Injection