Funds From operations (FFO)
This is a specialized metric reported only by Real Estate Investment Trusts, also referred to as REITs. It is the functional equivalent of earnings, except that it has been adjusted in ways that in real estate professionals judge to be better indicative of financial performance.
This figure is NOT part of GAAP (Generally Accepted Accounting Principles). Data providers do not calculate this and reproduce the figures supplied by REITs. So it is possible that FFO may not be comparable from one REIT to another. However as a practical matter, REITs tend to follow or stay very close to the definition articulated by NAREIT (National Association of Real Estate Investment Trusts), which defines Funds from Operations as net income (as per generally accepted accounting principles), excluding gains or losses from sales of property, plus depreciation and amortization, and after adjustments for unconsolidated joint ventures.
As you use FFO in models, be aware of the fact that the data item will return an NA value for all non-REITs. So if you choose to make use of FFO, you will need to confine it to REIT-only models or use the EVAL function to pass non-REIT stocks with the rule.
Source and Availability
The data points come from SEC filings or earnings announcements of a company (click here for the line-item reference spreadsheet). Since the data is "standardized" by the data provider the exact number may not exist in the original source. The data is usually a single line-item (see the link at the end for an excel spreadsheet with details). There are two access methods: prebuilt factors and using a function syntax.
When using the function syntax you specify the historical period using parameters in parenthesis as follows:
function(offset,type[,NAHandling])
offset: 0-20 (for interim) 0-10 (for annual)
type: QTR (for interim), ANN (for annual), TTM (for trailing twelve months)
NAHandling: [FALLBACK],KEEPNA,ZERONA
For types QTR & ANN the value is taken straight out of the filing with the corresponding offset, ex: 0 is most recent, 1 is previous, etc. TTM types are computed in two ways: for income and cash flow statement values are calculated by adding four quarterly values. For balance sheet items, TTM is the average of the trailing four quarters.
The NAHandling parameter is optional and is used to control what happens in preliminary reports where many items could be missing. Preliminary reports are press releases by the company and only affect the most recent ("0") offset period. They can last several weeks and can cause false signals due to incomplete data (see "CompleteStmt" for a way to identify companies with preliminary data).
Three options are available when an NA is found in a preliminary report:
FALLBACK | this is the default. When an NA is encountered the value is pulled from the offset "1" period. |
KEEPNA | do nothing. NAs will be preserved, which can cause the entire expression to fail. |
ZERONA | NAs are converted to 0 |
Pre-built factors are available for convenience and correspond to the following formula syntax:
Period | Description | Corresponding Parameters |
Q | Recent Quarter | (0, QTR) |
PQ | Prior Quarter | (1, QTR) |
PYQ | Prior Year quarter | (4, QTR) |
TTM | Trailing Twelve Months | (0, TTM) |
PTM | Prior Trailing Twelve Months | (4, TTM) |
A | Recent Annual | (0, ANN) |
PY | Prior Year | (1, ANN) |
Gr%PQ | Growth % PQ | (0, QTR) / (1, QTR) |
Gr%PYQ | Growth % PYQ | (0, QTR) / (4, QTR) |
Gr%TTM | Growth % TTM | (0, TTM) / (4, TTM) |
Gr%PQTTM | Growth % TTM 1Q Ago | (0, TTM) / (1, TTM) |
Gr%A | Growth % Annual | (0, ANN) / (1, ANN) |
Gr%3Y | Growth % 3 year | (0, ANN) / (3, ANN) annualized |
Gr%5Y | Growth % 5 year | (0, ANN) / (5, ANN) annualized |
Gr%10Y | Growth % 10 year | (0, ANN) / (10, ANN) annualized |
RSD%ANN | RSD % 10Y of annuals |
LoopRelStdDev |
RSD%TTM | RSD % 5Y of TTM | LoopRelStdDev ("function(CTR*2,TTM)",10,0,1,1)) |
RegEstTTM | Regression Est 5Y | Eval(LinReg("function(CTR * 2, TTM)", 10) , EstimateY(0), NA) |
RegGr%TTM | Regression Gr% 5Y | Eval(LinReg("function(CTR * 2, TTM)", 10) ,RegGr%(2), NA) |
RegEstANN | Regression Est 10Y | Eval(LinReg("function(CTR, ANN)", 10) , EstimateY(0), NA) |
RegGr%ANN | Regression Gr% 10Y | Eval(LinReg("function(CTR, ANN)", 10) ,RegGr%(1), NA) |
%SalesQ | % of Q Sales | function(0, QTR) / Sales(0, QRT) |
%SalesA | % of A Sales | function(0, ANN) / Sales(0, ANN) |
%AssetQ | % of Q Assets | function(0, QTR) / AstTot(0, QRT) |
%AssetA | % of A Assets | function(0, ANN) / AstTot(0, ANN) |
PSQ | Per Share Q | function(0, QTR) / Shares(0, QRT) |
PSA | Per Share A | function(0, ANN) / Shares(0, ANN) |
3YAvg | 3 Year Average | LoopAvg("function(CTR, ANN)", 3) |
5YAvg | 5 Year Average | LoopAvg("function(CTR, ANN)", 5) |
NOTE: PTM offset is 4 , not 1, since it uses interim periods
Click Here for the Line-Item Reference Spreadsheet.