Piotroski F-Score Calculator
Current Year (CY) Financials
Previous Year (PY) Financials
Piotroski F-Score Results
Please fill in the financial data on the 'Current Year' and 'Previous Year' tabs, then click "Calculate F-Score & View Results" on the 'Previous Year Data' tab.
Error: Missing input data. Please fill all fields in both 'Current Year' and 'Previous Year' tabs.
"; return; } } let profitabilityScore = 0; let leverageLiquidityScore = 0; let operatingEfficiencyScore = 0; this.scores = {}; // --- Profitability --- // 1. Positive Net Income (NI_CY > 0) this.scores.s1_NetIncome = (this.inputs.netIncome_CY > 0) ? 1 : 0; profitabilityScore += this.scores.s1_NetIncome; // 2. Positive Operating Cash Flow (OCF_CY > 0) this.scores.s2_OpCashFlow = (this.inputs.opCashFlow_CY > 0) ? 1 : 0; profitabilityScore += this.scores.s2_OpCashFlow; // 3. ROA Trend (ROA_CY > ROA_PY) const roa_CY = (this.inputs.totalAssets_BoP_CY !== 0) ? (this.inputs.netIncome_CY / this.inputs.totalAssets_BoP_CY) : -Infinity; const roa_PY = (this.inputs.totalAssets_BoP_PY !== 0) ? (this.inputs.netIncome_PY / this.inputs.totalAssets_BoP_PY) : -Infinity; this.scores.s3_ROATrend = (roa_CY > roa_PY && isFinite(roa_CY) && isFinite(roa_PY)) ? 1 : 0; profitabilityScore += this.scores.s3_ROATrend; // 4. Quality of Earnings (OCF_CY > NI_CY) this.scores.s4_EarningsQuality = (this.inputs.opCashFlow_CY > this.inputs.netIncome_CY) ? 1 : 0; profitabilityScore += this.scores.s4_EarningsQuality; // --- Leverage, Liquidity, and Source of Funds --- // 5. Long-Term Debt Trend (Leverage_CY < Leverage_PY or LTD_CY = 0) const leverage_CY = (this.inputs.totalAssets_BoP_CY !== 0) ? (this.inputs.longTermDebt_CY / this.inputs.totalAssets_BoP_CY) : Infinity; const leverage_PY = (this.inputs.totalAssets_BoP_PY !== 0) ? (this.inputs.longTermDebt_PY / this.inputs.totalAssets_BoP_PY) : Infinity; this.scores.s5_DebtTrend = (this.inputs.longTermDebt_CY === 0 || (leverage_CY < leverage_PY && isFinite(leverage_CY) && isFinite(leverage_PY))) ? 1 : 0; leverageLiquidityScore += this.scores.s5_DebtTrend; // 6. Current Ratio Trend (CurrentRatio_CY > CurrentRatio_PY) const currentRatio_CY = (this.inputs.currentLiabilities_CY !== 0) ? (this.inputs.currentAssets_CY / this.inputs.currentLiabilities_CY) : -Infinity; const currentRatio_PY = (this.inputs.currentLiabilities_PY !== 0) ? (this.inputs.currentAssets_PY / this.inputs.currentLiabilities_PY) : -Infinity; this.scores.s6_CurrentRatioTrend = (currentRatio_CY > currentRatio_PY && isFinite(currentRatio_CY) && isFinite(currentRatio_PY)) ? 1 : 0; leverageLiquidityScore += this.scores.s6_CurrentRatioTrend; // 7. No New Shares Issued (Shares_CY <= Shares_PY) this.scores.s7_NoNewShares = (this.inputs.commonSharesOutstanding_CY <= this.inputs.commonSharesOutstanding_PY) ? 1 : 0; leverageLiquidityScore += this.scores.s7_NoNewShares; // --- Operating Efficiency --- // 8. Gross Margin Trend (GrossMarginRatio_CY > GrossMarginRatio_PY) const grossMarginRatio_CY = (this.inputs.revenue_CY !== 0) ? (this.inputs.grossProfit_CY / this.inputs.revenue_CY) : -Infinity; const grossMarginRatio_PY = (this.inputs.revenue_PY !== 0) ? (this.inputs.grossProfit_PY / this.inputs.revenue_PY) : -Infinity; this.scores.s8_GrossMarginTrend = (grossMarginRatio_CY > grossMarginRatio_PY && isFinite(grossMarginRatio_CY) && isFinite(grossMarginRatio_PY)) ? 1 : 0; operatingEfficiencyScore += this.scores.s8_GrossMarginTrend; // 9. Asset Turnover Trend (AssetTurnover_CY > AssetTurnover_PY) const assetTurnover_CY = (this.inputs.totalAssets_BoP_CY !== 0) ? (this.inputs.revenue_CY / this.inputs.totalAssets_BoP_CY) : -Infinity; const assetTurnover_PY = (this.inputs.totalAssets_BoP_PY !== 0) ? (this.inputs.revenue_PY / this.inputs.totalAssets_BoP_PY) : -Infinity; this.scores.s9_AssetTurnoverTrend = (assetTurnover_CY > assetTurnover_PY && isFinite(assetTurnover_CY) && isFinite(assetTurnover_PY)) ? 1 : 0; operatingEfficiencyScore += this.scores.s9_AssetTurnoverTrend; const totalFScore = profitabilityScore + leverageLiquidityScore + operatingEfficiencyScore; // Display Results this.elements.resultsArea.innerHTML = `Total Piotroski F-Score
${totalFScore} / 9
Breakdown by Category:
| Criteria | Score |
|---|---|
| Profitability | |
| 1. Positive Net Income (Current Year) | ${this.scores.s1_NetIncome} |
| 2. Positive Operating Cash Flow (Current Year) | ${this.scores.s2_OpCashFlow} |
| 3. ROA better than Previous Year | ${this.scores.s3_ROATrend} |
| 4. Operating Cash Flow > Net Income (Current Year) | ${this.scores.s4_EarningsQuality} |
| Profitability Score | ${profitabilityScore} / 4 |
| Leverage, Liquidity & Source of Funds | |
| 5. Lower Long-Term Debt/Assets ratio than PY (or no LTD) | ${this.scores.s5_DebtTrend} |
| 6. Higher Current Ratio than Previous Year | ${this.scores.s6_CurrentRatioTrend} |
| 7. No new shares issued (Shares CY <= Shares PY) | ${this.scores.s7_NoNewShares} |
| Leverage, Liquidity & Funds Score | ${leverageLiquidityScore} / 3 |
| Operating Efficiency | |
| 8. Higher Gross Margin than Previous Year | ${this.scores.s8_GrossMarginTrend} |
| 9. Higher Asset Turnover than Previous Year | ${this.scores.s9_AssetTurnoverTrend} |
| Operating Efficiency Score | ${operatingEfficiencyScore} / 2 |
Piotroski F-Score Calculation Report
`; // Inputs Summary pdfHtml += `Inputs Summary
`; pdfHtml += `Current Year Data
`; const cyInputOrder = ['netIncome_CY', 'opCashFlow_CY', 'totalAssets_BoP_CY', 'longTermDebt_CY', 'currentAssets_CY', 'currentLiabilities_CY', 'commonSharesOutstanding_CY', 'revenue_CY', 'grossProfit_CY']; cyInputOrder.forEach(key => { const label = key.replace(/_CY|_BoP/g, '').replace(/([A-Z])/g, ' $1').trim().replace(/^./, str => str.toUpperCase()); pdfHtml += `Previous Year Data
`; const pyInputOrder = ['netIncome_PY', 'totalAssets_BoP_PY', 'longTermDebt_PY', 'currentAssets_PY', 'currentLiabilities_PY', 'commonSharesOutstanding_PY', 'revenue_PY', 'grossProfit_PY']; pyInputOrder.forEach(key => { const label = key.replace(/_PY|_BoP/g, '').replace(/([A-Z])/g, ' $1').trim().replace(/^./, str => str.toUpperCase()); pdfHtml += `F-Score Results
`; const resultsTableClone = this.elements.resultsArea.querySelector('.pf-results-breakdown table').cloneNode(true); const totalScoreDivClone = this.elements.resultsArea.querySelector('.pf-results-summary').cloneNode(true); // Modify clones for PDF styling consistency if needed, e.g. simplify table headers totalScoreDivClone.querySelector('h3').style.fontSize = '14pt'; totalScoreDivClone.querySelector('p').style.fontSize = '18pt'; totalScoreDivClone.style.backgroundColor = '#1abc9c'; totalScoreDivClone.style.color = '#fff'; totalScoreDivClone.style.padding = '15px'; totalScoreDivClone.style.textAlign = 'center'; totalScoreDivClone.style.borderRadius = '4px'; pdfHtml += `Results Breakdown
${tableCloneForPdf.outerHTML}`; } pdfExportContainer.innerHTML = pdfHtml; document.body.appendChild(pdfExportContainer); try { const canvas = await html2canvas(pdfExportContainer, { scale: 1.5, useCORS: true, logging: false }); document.body.removeChild(pdfExportContainer); const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'p', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const imgProps = pdf.getImageProperties(imgData); const imgWidth = pdfWidth - 40; const imgHeight = (imgProps.height * imgWidth) / imgProps.width; let heightLeft = imgHeight; let position = 20; pdf.addImage(imgData, 'PNG', 20, position, imgWidth, imgHeight); heightLeft -= (pdfHeight - 40); while (heightLeft > 0) { position = heightLeft - imgHeight; pdf.addPage(); pdf.addImage(imgData, 'PNG', 20, position, imgWidth, imgHeight); heightLeft -= (pdfHeight - 40); } pdf.save('Piotroski_F-Score_Report.pdf'); } catch (error) { console.error("Error generating PDF:", error); alert("An error occurred while generating PDF."); if (document.body.contains(pdfExportContainer)) document.body.removeChild(pdfExportContainer); } } }; document.addEventListener('DOMContentLoaded', function() { pfApp.init(); });In the complex landscape of stock market analysis, investors are constantly seeking reliable methods to identify financially sound companies with strong potential for future growth. While many metrics focus on valuation, a more robust approach involves scrutinizing a company’s fundamental financial health and operational efficiency. One of the most respected quantitative tools for this purpose is the Piotroski F-Score, developed by Stanford accounting professor Joseph Piotroski. This nine-point scoring system provides a comprehensive assessment of a company’s financial strength based on its recent financial statements. The WorkToolz Piotroski F-Score Calculator is your essential online resource for accurately computing this powerful score, helping you distinguish between healthy companies and those that might be struggling, thereby refining your investment selection process.
The Piotroski F-Score is invaluable because it goes beyond simple profitability. It systematically evaluates a company across three critical areas: profitability, leverage/liquidity, and operational efficiency. Each of the nine criteria, derived from a company’s balance sheet and income statement, earns one point if met and zero points if not. A higher F-Score, ranging from 0 to 9, indicates a stronger financial position and greater operational efficiency, suggesting a more robust company that is less likely to face financial distress and potentially more likely to outperform. Conversely, a low F-Score can signal underlying financial weaknesses. By providing a single, consolidated score, the F-Score helps investors quickly grasp a company’s fundamental quality without getting lost in individual financial ratios, making it a particularly powerful tool for value investors and fundamental analysts seeking quality companies.
Using the WorkToolz Piotroski F-Score Calculator is a multi-step yet intuitive process designed for thorough financial analysis. You begin by entering Current Year (CY) Financials, which include key metrics such as Net Income, Operating Cash Flow, Total Assets (Beginning of CY / End of PY), Long Term Debt, Current Assets, Current Liabilities, Common Shares Outstanding, Revenue, and Gross Profit. These figures allow the calculator to assess profitability and aspects of liquidity and leverage for the most recent period. Once you’ve accurately inputted the current year data, you’ll proceed to the “Previous Year Data” tab, where you’ll input corresponding financial figures from the prior fiscal year. This comparison across two periods is crucial for assessing trends in profitability, leverage, and operational efficiency, which are core to several of the F-Score criteria.
After inputting both current and previous year’s financial data, simply navigate to the “F-Score Results” tab. The WorkToolz Piotroski F-Score Calculator will then automatically process all the entered information and present you with the final Piotroski F-Score. This clear, single number instantly summarizes the financial health and operational strength of the company you are analyzing. The tool takes the complexity out of remembering and applying each of the nine individual criteria, providing you with an instant, reliable score. While a higher score generally indicates a more attractive investment from a fundamental standpoint, it’s important to remember that the F-Score is a quantitative tool and should be used as part of a broader investment strategy, complementing qualitative analysis and market conditions. Make the WorkToolz Piotroski F-Score Calculator an integral part of your financial analysis toolkit to uncover companies with strong fundamentals and enhance your investment decision-making process.
