Skip to content

Piotroski F-Score

i=191[checki passed]

Nine-point fundamentals scorecard (Piotroski 2000). 7-9 = strong, 4-6 = mid, 0-3 = weak. Four profitability checks (NI > 0, OCF > 0, ROA improving, OCF > NI), three leverage/liquidity checks (LT debt down, current ratio up, no dilution), two efficiency checks (gross margin up, asset turnover up).

Direction: Higher better Category: forensic

Inputs (XBRL fallback chains):

  • assets: Assets
  • cost_of_revenue: CostOfRevenue -> CostOfGoodsAndServicesSold -> CostOfGoodsSold -> CostOfServices
  • current_assets: AssetsCurrent
  • current_liabilities: LiabilitiesCurrent
  • long_term_debt: LongTermDebt -> LongTermDebtNoncurrent
  • net_income: NetIncomeLoss -> ProfitLoss
  • operating_cash_flow: NetCashProvidedByUsedInOperatingActivities
  • revenue: Revenues -> RevenueFromContractWithCustomerExcludingAssessedTax -> RevenueFromContractWithCustomerIncludingAssessedTax -> SalesRevenueNet -> SalesRevenueGoodsNet
  • shares_outstanding: EntityCommonStockSharesOutstanding -> CommonStockSharesOutstanding
  • weighted_avg_shares_basic: WeightedAverageNumberOfSharesOutstandingBasic
  • weighted_avg_shares_diluted: WeightedAverageNumberOfDilutedSharesOutstanding

Returns None when: Returns None when prior-year anchor isn't reachable — six of the nine points are YoY-anchored. Score is integer 0-9 returned as Decimal.

Source code

Implementation: piotroski_f_score in src/eqtytrk/metrics/ratios.py (or valuation.py for multiples).

See also

For full methodology — decomposition, thresholds, when each score lights up vs the others, citations to original papers — see the Forensic screening essay.

EqtyTrk methodology reference. Data from SEC EDGAR.