Back to Community
Beneish Model: Probability of Accounting Manipulation

I'm implemented a a reserarch notebook for the Beneish M-Score.
As of today, August 17th 2015, these companies are on the top 10 of the list:

ARGS ARGOS THERAPEUTICS INC 2042.79
UPIP UNWIRED PLANET INC 402.91
AGEN AGENUS INC 351.89
CMRX CHIMERIX INC 317.88
IMMY IMPRIMIS PHARMACEUTICALS INC 316.06
ADMS ADAMAS PHARMACEUTICALS INC 283.25
YOD YOU ON DEMAND HOLDINGS INC 195.50
MYOS MYOS CORP 182.36
AEGR AEGERION PHARMACEUTICALS INC 169.36
NLNK NEWLINK GENETICS CORP 163.21

Loading notebook preview...
Notebook previews are currently unavailable.
11 responses

@Constantino how came I didnt see herbalife in the -2.22 zone... Bill Ackman openly say... that the accounting were manipulated and can your model print more than -4.00M-score.. since base on my computation herbalife belongs to M-score of negative -2.98 which is not included on your print.thanks

HelLo John,

I don't why, but the data for HLF are missing. Try the following code in the Research Notebook:

# M-Score of choosed companies, i.e. Herbalife Ltd (HLF)  
print "M-Score AAPL:", m_score[symbols('AAPL')]  
print "M-Score HLF:", m_score[symbols('HLF')]  
f[symbols('HLF')]  

The result will be:

M-Score AAPL: -3.02954938777  
M-Score HLF: nan

enterprise_value                            NaN  
free_cash_flow                              NaN  
operating_cash_flow                         NaN  
net_income                                  NaN  
market_cap                                  NaN  
shares_outstanding                          NaN  
financing_cash_flow                         NaN  
operating_income                            NaN  
invested_capital                            NaN  
cash_and_cash_equivalents                   NaN  
days_in_sales                               NaN  
gross_margin                                NaN  
current_assets                              NaN  
long_term_debt                              NaN  
current_liabilities                         NaN  
net_ppe                                     NaN  
total_assets                                NaN  
total_revenue                               NaN  
depreciation_amortization_depletion         NaN  
selling_general_and_administration          NaN  
total_debt                                  NaN  
total_liabilities                           NaN  
non_operating_income                        NaN  
dsri                                        NaN  
gmi                                         NaN  
aqi                                         NaN  
sgi                                    0.528547  
depi                                   0.189489  
sgai                                   1.222203  
lvgi                                        NaN  
tata                                        NaN  
Name: Equity(26892 [HLF]), dtype: float64  

Today I've no time anymore to investigate further, maybe can you try to understand the reason?

Greetings
Costantino

can it print more than -2.22 M score?

yes, of course! look at the code and change the following line, if you need another threshold:

manipulators = m_score[m_score > -2.22].order(ascending=False)  

thanks Constantino.
Are these stocks manipulated to the upside.. or to the downside? Does manipulation implies that the stock price are keep artificially high?and is good to short?

nice work!

@John: Typically, this test is used to look for inflated / upside manipulation. But it might be better used as a filter to remove high m_score stocks from an algo universe than as an actual signal to short the high m_score stock.

Robby base on history... were Beneish Model able to accurately predict enron... or mbia.... as very high... m score...? Maybe e can use... Beneish Model to predict the next accouting scandal... or the next enron.... If Beneish Model were able to flag those stocks base... on history as very high... on the list of M-score.... skeptical...

Is it just coincidence that almost all the companies identified are either pharma or patent heavy companies (don't know about You on Demand though)? Wondering if should incorporate some sort of varying weight allocations based on operating industry? FI's for instance should definitely be excluded

I learned a lot from reading your code. I had been having nothing but trouble trying to define fundamental ratios for the LTM and TTM. Thanks for posting.

I have one suggestion. Beneish points out (citing himself) in his paper: "Following Beneish (1997, 1999), we winsorize the predictive variables in the probability of manipulation model at the 1 percent and 99 percent levels each year in our sample period to deal with problems caused by small denominators and to control for the effect of potential outliers." If I understand the Python implementation of winsorization correctly, you should add a cell that contains a line like

f.loc['dsri'] = scipy.stats.mstats.winsorize(f.loc['dsri'], limits=[.01,.01])

for each of your variables. For the time period you used, winsorization changes only a few scores, and those only a little.

If you're interested in working with someone with strong finance and accounting but beginner's Python to take a long-short Beneish algorithm to backtesting, please let me know. Either way, thanks again for posting instructive code using multi-period fundamental data.

Hi Tom,

You are welcome! Let me know, how may I help!

Greetings
Costantino

I've added the winsorize for each variable, fixed the date ('today') to be the same as the original notebook (Aug 15, 2015) to be able to compare them, and, with some variation, the results are the same.

This M-score casts a wide net, and a lot of companies get wrapped up in this screening, including YHOO, TLSA, FB, SSYS, GPRO, VALU, AAL, AMBA, IRBT, SFLY, to name a few I recognize and would be surprised they are cooking the books.

The logical next step is to actually reproduce the results of the paper and confirm that this is a mis-priced factor.

Loading notebook preview...
Notebook previews are currently unavailable.