Financial Data Collector

by daymade2c6d263d1fccNo license1.4K starsListed Oct 8, 2026Updated Oct 8, 2026Repository updated today

Collects real financial data for any US publicly traded company from free public sources (yfinance) and outputs structured JSON for downstream skills (DCF modeling, comps analysis, earnings review): market data, historical financials, WACC inputs, analyst estimates — never fabricated fallback values. Use to collect or pull financial/market data, or gather DCF inputs, for a ticker.

AI-generated overview

Collects real financial and market data for US public companies via yfinance and outputs validated structured JSON.

What it does
Runs a Python collection script that pulls market data, historical financial statements, WACC inputs and analyst estimates for a given US ticker from yfinance, including the 10Y Treasury yield as a risk-free proxy. A validation script then checks field completeness, cross-field consistency, range sanity and sign conventions. The deliverable is a single standardized JSON file, with missing values set to null and source attribution rather than defaults.
When to use it
Use when you need to gather or pull financial and market data for a US-listed ticker, or to assemble inputs for downstream DCF modeling, comps analysis or earnings review. It is intended for data collection and validation, not for producing the analysis itself.
Requirements
Python with pandas and yfinance, plus network access to fetch data. Ships two executable scripts (collect_data.py, validate_data.py) and reference documents. No credentials are mentioned.

Financial Data Collector

Collect and validate real financial data for US public companies using free data sources. Output is a standardized JSON file ready for consumption by other financial skills.

Critical Constraints

NO FALLBACK values. If a field cannot be retrieved, set it to null with _source: "missing". Never substitute defaults (e.g., beta or 1.0). The downstream skill decides how to handle missing data.

Data source attribution is mandatory. Every data section must have a _source field.

CapEx sign convention: yfinance returns CapEx as negative (cash outflow). Preserve the original sign. Document the convention in output metadata. Do NOT flip signs.

yfinance FCF ≠ Investment bank FCF. yfinance FCF = Operating CF + CapEx (no SBC deduction). Flag this in output metadata so downstream DCF skills don't overstate FCF.

Workflow

Step 1: Collect Data

Run the collection script:

bash
python scripts/collect_data.py TICKER [--years 5] [--output path/to/output.json]

The script collects in this priority:

  1. yfinance — market data, historical financials, beta, analyst estimates
  2. yfinance ^TNX — 10Y Treasury yield as risk-free rate proxy
  3. User supplement — for years where yfinance returns NaN (report to user, do not guess)

Step 2: Validate Data

bash
python scripts/validate_data.py path/to/output.json

Checks: field completeness, cross-field consistency (Market Cap = Price × Shares), range sanity (WACC 5-20%, beta 0.3-3.0), sign conventions.

Step 3: Deliver JSON

Single file: {TICKER}_financial_data.json. Schema in references/output-schema.md.

Do NOT create: README, CSV, summary reports, or any auxiliary files.

Output Schema (Summary)

json
{  "ticker": "META",  "company_name": "Meta Platforms, Inc.",  "data_date": "2026-03-02",  "currency": "USD",  "unit": "millions_usd",  "data_sources": { "market_data": "...", "2022_to_2024": "..." },  "market_data": { "current_price": 648.18, "shares_outstanding_millions": 2187, "market_cap_millions": 1639607, "beta_5y_monthly": 1.284 },  "income_statement": { "2024": { "revenue": 164501, "ebit": 69380, "tax_expense": ..., "net_income": ..., "_source": "yfinance" } },  "cash_flow": { "2024": { "operating_cash_flow": ..., "capex": -37256, "depreciation_amortization": 15498, "free_cash_flow": ..., "change_in_nwc": ..., "_source": "yfinance" } },  "balance_sheet": { "2024": { "total_debt": 30768, "cash_and_equivalents": 77815, "net_debt": -47047, "current_assets": ..., "current_liabilities": ..., "_source": "yfinance" } },  "wacc_inputs": { "risk_free_rate": 0.0396, "beta": 1.284, "credit_rating": null, "_source": "yfinance + ^TNX" },  "analyst_estimates": { "revenue_next_fy": 251113, "revenue_fy_after": 295558, "eps_next_fy": 29.59, "_source": "yfinance" },  "metadata": { "_capex_convention": "negative = cash outflow", "_fcf_note": "yfinance FCF = OperatingCF + CapEx. Does NOT deduct SBC." }}

Full schema with all field definitions: references/output-schema.md

<correct_patterns>

Handling Missing Years

python
if pd.isna(revenue):    result[year] = {"revenue": None, "_source": "yfinance returned NaN — supplement from 10-K"}# Report missing years to the user. Do NOT skip or fill with estimates.

CapEx Sign Preservation

python
capex = cash_flow.loc["Capital Expenditure", year_col]  # -37256.0result["capex"] = float(capex)  # Preserve negative

Datetime Column Indexing

python
year_col = [c for c in financials.columns if c.year == target_year][0]revenue = financials.loc["Total Revenue", year_col]

Field Name Guards

python
if "Total Revenue" in financials.index:    revenue = financials.loc["Total Revenue", year_col]elif "Revenue" in financials.index:    revenue = financials.loc["Revenue", year_col]else:    revenue = None

</correct_patterns>

<common_mistakes>

Mistake 1: Default Values for Missing Data

python
# ❌ WRONGbeta = info.get("beta", 1.0)growth = data.get("growth") or 0.02
# ✅ RIGHTbeta = info.get("beta")  # May be None — that's OK

Mistake 2: Assuming All Years Have Data

python
# ❌ WRONG — 2020-2021 may be NaNrevenue = float(financials.loc["Total Revenue", year_col])
# ✅ RIGHTvalue = financials.loc["Total Revenue", year_col]revenue = float(value) if pd.notna(value) else None

Mistake 3: Using yfinance FCF in DCF Models Directly

yfinance FCF does NOT deduct SBC. For mega-caps like META, SBC can be $20-30B/yr, making yfinance FCF ~30% higher than investment-bank FCF. Always flag this in output.

Mistake 4: Flipping CapEx Sign

python
# ❌ WRONG — double-negation risk downstreamcapex = abs(cash_flow.loc["Capital Expenditure", year_col])
# ✅ RIGHT — preserve original, document conventioncapex = float(cash_flow.loc["Capital Expenditure", year_col])  # -37256.0

</common_mistakes>

Known yfinance Pitfalls

See references/yfinance-pitfalls.md for detailed field mapping and workarounds.

Source and attribution

Source:daymade/claude-code-skillsindaymade-financial/financial-data-collectorat commit2c6d263

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal