A long time ago, when I was studying Management and Business Adminstration in Switzerland, I thought it would be cool to be able to calculate Financial KPIs in order to comprare different companies within one sector or to be able to identify sector specific differences.
Well, in Switzerland we still don't have any requirement to the file the Financial Reports electronically and unfortunatly this will not change anytime soon. Fortunatly there are countries which are more progressive, like e.g. the US which makes the information available via EDGAR or the UK with CompaniesHouse
This information can be used to drive investment decisions. So it was my goal to create a comprehensive set of KPIs across different dimensions. In this document we will use EDGAR to calculate KPIs to measure the following dimensions of a reporting company
It is the expectation that the stock price of companies with better KPIs will grow faster than their competitors. So in my next blog we will evaluate the KPIs against the stock prices.
Profitibility is the degree to which a business or activity yields profit or financial gain. A high profitibility is usually rewarded by increasing stock prices.
Measure left revenue after COGS or service delivered
See generated profit on each dollar of revenue
Track and optimize your operating expenses
Optimize the generated profit for your shareholders
Analyze your bottom line and increase your net profit
reveals a practice of paying for growth by accumulating debt.
Liquiditiy is a measure of the ability of a debtor to pay their debts. Companies which do not get this one right are bound for Chapter 11.
Measure the ability to pay your short-term obligations
The production of the desired effects or results with minimum waste of time, effort, or skill. Companies which are efficient tend to be more successful then their ineffienent competitors
See how much of your average inventory your company has sold in a period.
See how quickly you collect payments
Analyze your profitability in relation to your assets
Condition of business in terms of its available operating funds,
Innovation is building the basis for future growth and profiltibility
Growth is the increase in the market value of the goods and services. We prefer to invest our stocks into companies which are growing
We prefer to invest our stocks into those companies which dominate their sectors
Total Revenue all Companies of a Sector / Revenue of Company
We try to forecast the value based on the past. Then we calculate the difference as 'surprise'. We expect that positive surprises will increase the stock value.
We try now to map the parameters that are mentioned above the the ones used by EDGAR. In order to give a picture how reliable the parameter is we give the total count of the parameter in Edgar across all reported companies.
Parameter | EDGAR Parameters |
---|---|
Sales Revenue | SalesRevenueNet (554407) SalesRevenueGoodsNet(217158) |
Total Revenue | Revenues (828910) |
Net Income | NetIncomeLoss (962903) |
Operating Profit (EBIT) | OperatingIncomeLoss (816272) |
COGS | CostOfGoodsSold (141738) CostOfGoodsAndServicesSold (112826) |
Operating Expenses | OperatingExpenses (301161) |
Shareholder’s Equity | StockholdersEquity (1027481), StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest (634773) |
Profit | ProfitLoss (466493) GrossProfit(328136) OperatingIncomeLoss (816272) |
Operating Cash Flow | OtherOperatingActivitiesCashFlowStatement (17083) |
Total Capital Employed | Assets - LiabilitiesCurrent |
Long Term Depts | LongTermDebt (320306) |
Assets | Assets (686586) AssetsFairValueDisclosure(350896) |
Current Assets | AssetsCurrent (310573) OtherAssetsCurrent (108913) |
Inventory | InventoryNet (176869) |
Liabilities | Liabilities(319486) |
Current Liabilities | LiabilitiesCurrent (310262) |
Cash Flow (Operations | NetCashProvidedByUsedInOperatingActivities(331572) NetCashProvidedByUsedInOperatingActivitiesContinuingOperations (126724) |
Cash Equivalents | CashAndCashEquivalentsAtCarryingValue (52224) CashAndCashEquivalentsFairValueDisclosure(182829) |
Short-term Investments | AvailableForSaleSecurities (624083) |
Accounts Payable | AccountsPayableCurrent(215561) |
Accounts Receivable | AccountsReceivableNetCurrent(202819) |
Research & Development | ResearchAndDevelopmentExpense (138024) |
Number of Shares | CommonStockSharesIssued (305630) |
We install the necessary libraries with the help of maven
%classpath config resolver maven-public http://software.pschatzmann.ch/repository/maven-public/
%%classpath add mvn
ch.pschatzmann:smart-edgar:LATEST
ch.pschatzmann:jupyter-jdk-extensions:0.0.1-SNAPSHOT
Added new repo: maven-public
We import all relevant packages or classes. We also setup the custom BeakerX displayer so that tables are displayed as Components
import ch.pschatzmann.edgar.reporting.company._
import ch.pschatzmann.display.Displayers
Displayers.setup
true
Now that we have everything defined, we can start with the implementation of the formulas for KPIs
val values = new CompanyEdgarValuesDB(new CompanySelection().setTradingSymbol("AAPL"))
.setUseArrayList(true)
.setAddTime(true)
.setFilter(new FilterQuarterlyCumulated())
.setParameterNames("NetIncomeLoss","OperatingIncomeLoss","ResearchAndDevelopmentExpense","OperatingExpenses",
"CashAndCashEquivalentsAtCarryingValue","AvailableForSaleSecuritiesCurrent","AccountsReceivableNetCurrent",
"Revenues","SalesRevenueNet","SalesRevenueGoodsNet","InventoryNet","AssetsCurrent",
"LiabilitiesCurrent","Assets","EarningsPerShareBasic",
"StockholdersEquity", "Assets","Liabilities","ProfitLoss","GrossProfit", "AccountsReceivableNetCurrent",
"NetCashProvidedByUsedInOperatingActivities","NetCashProvidedByUsedInOperatingActivitiesContinuingOperations","CostOfGoodsSold",
"CostOfGoodsAndServicesSold", "SalesRevenueNet")
// Handling of alternatives / renames
.addFormula("SalesRevenue","Edgar.coalesce('SalesRevenueNet', 'SalesRevenueGoodsNet')")
.addFormula("TotalRevenue","Edgar.coalesce('Revenues', 'SalesRevenueNet')")
.addFormula("OperatingCashFlow","Edgar.coalesce('NetCashProvidedByUsedInOperatingActivities','NetCashProvidedByUsedInOperatingActivitiesContinuingOperations')")
.addFormula("COGS","Edgar.coalesce('CostOfGoodsSold', 'CostOfGoodsAndServicesSold')")
.addFormula("Profit","Edgar.coalesce('ProfitLoss', 'GrossProfit')")
// Profititbility
.addFormula("GrossProfitMargin","(TotalRevenue - COGS) / TotalRevenue")
.addFormula("OperatingProfitMargin", "OperatingIncomeLoss / SalesRevenue")
.addFormula("OperatingExpensesRatio","OperatingExpenses / TotalRevenue ")
.addFormula("ReturnonEquity","NetIncomeLoss / StockholdersEquity")
.addFormula("TotalCapitalEmployed","Assets - LiabilitiesCurrent")
.addFormula("OperatingCashFlowCapitalRatio","OperatingCashFlow / TotalCapitalEmployed")
.addFormula("NetProfitMargin","Profit / TotalRevenue")
.addFormula("DebtToEquityRatio","Liabilities / StockholdersEquity")
.addFormula("EarningsPerShare","Edgar.coalesce('EarningsPerShareBasic')")
// Liquidity
.addFormula("CurrentRatio","AssetsCurrent / LiabilitiesCurrent")
.addFormula("QuickRatio","(CashAndCashEquivalentsAtCarryingValue + AccountsReceivableNetCurrent + AvailableForSaleSecuritiesCurrent) / LiabilitiesCurrent")
.addFormula("WorkingCapital","Assets - Liabilities")
// Efficiency
.addFormula("InventoryTurnover","SalesRevenue / InventoryNet")
.addFormula("AccountsReceivableTurnoverRatio", "SalesRevenue / AccountsReceivableNetCurrent")
.addFormula("ReturnOnAssets", "NetIncomeLoss / Assets")
.addFormula("SalesWorkingCapitalRatio","SalesRevenue / WorkingCapital")
// Innovation
.addFormula("SalesResearchRatio%","ResearchAndDevelopmentExpense / SalesRevenue * 100")
.addFormula("NetIncomeResearchRatio%","ResearchAndDevelopmentExpense / NetIncomeLoss * 100")
// Growth
.addFormula("SalesRevenueChange%", "Edgar.percentChange('SalesRevenue')" )
.addFormula("NetIncomeChange%", "Edgar.percentChange('NetIncomeLoss')" )
.addFormula("EarningsPerShareChange%", "Edgar.percentChange('EarningsPerShare')" )
.addFormula("ResearchAndDevelopmentChange%","Edgar.percentChange('ResearchAndDevelopmentExpense')" )
// Surprises
.addFormula("NetIncomeSurprise%","Edgar.surprisePercent('NetIncomeLoss')")
.addFormula("RevenueSurprise%","Edgar.surprisePercent('SalesRevenue')")
// Leadereship
.addFormula("MarketShareOfYear","Edgar.marketShare()")
.addFormula("MarketShareChange%", "Edgar.percentChange('MarketShareOfYear')" )
// Cleanup
.removeParameterNames("Assets","AssetsCurrent","AccountsReceivableNetCurrent","AvailableForSaleSecuritiesCurrent",
"CashAndCashEquivalentsAtCarryingValue","Revenues","SalesRevenueNet",
"SalesRevenueGoodsNet","CostOfGoodsSold","InventoryNet","Liabilities","LiabilitiesCurrent",
"NetIncomeLoss", "OperatingExpenses", "OperatingIncomeLoss","ResearchAndDevelopmentExpense",
"Profit", "COGS" ,"TotalRevenue", "SalesRevenue", "StockholdersEquity",
"WorkingCapital", "TotalCapitalEmployed", "OperatingCashFlow",
"NetCashProvidedByUsedInOperatingActivities","NetCashProvidedByUsedInOperatingActivitiesContinuingOperations",
"CostOfGoodsAndServicesSold","ProfitLoss","GrossProfit","EarningsPerShareBasic")
values.getTable