Fundsmith annual shareholder meeting 2020

I discovered this shareholders meeting last year and I was willing to review it in detail. Below some notes.

First 33 minutes is the formal presentation, after that Q&A.

The link to the letter to shareholders:—annual-letters/annual-letter-to-shareholders-2019.pdf?sfvrsn=6

Minute #10:

Why they sold 3M on the one hand, 3M sold its ceramic bulletproof business unit at a price of 1.1x sales and acquired Acelity, which was a private company, for 11x EBITDA. Acelitywas actually going public and according to the prospectus, the opening price was was going to be 15x EBITDA. When asked about the difference between 11 and 15, they claimed that they announced the multiple of 11 EBITDA for the expected synergies. Fundsmith interpreted this as a lie.

In the shareholder letter: “we were acting on growing doubts about the current management’s capital allocation decision”.

minute #37:

Sub-estimate the impact of Covid-19.

minute #48:

Replying about why they don’t buy Apple or Alphabet.

About Google : ROE in 2019 is about 17%, which is average. Capital allocation is poor: they acquire small potential companies that could become competence in some niche and they dissolve these projects.

About Apple: sales and cash flow are flat in the last 4 years and the stock price has tripled. They saw the same behavior in companies as Nokia.

Comment about Sortino Ratio Versus Sharpe Ratio

The Sortino ratio is an adaption of the Sharpe ratio, and in my view an improvement. Whereas the Sharpe ratio estimates risk by the variability of returns, the Sortino ratio takes into account only downside variability as it is not clear why we should be concerned about upside volatility (i.e. when our Fund goes up a lot) which mostly
seems to be a cause for celebration.

Market Opening checklist

This is a checklist of things to review once just before and after the market is opened.

Before market opens (9:15 ET)

  • Check S&P and Nasdaq futures indexes.
  • How is Europe going on? Check DAX.
  • Check DIX and GEX Index in squeeemeetrics.
  • EUR/USD trend of the day.
  • Market breadth check.
  • Any major news to take into account?

After market opens (9:35 ET)

  • Check S&P trend in comparison with the futures.
  • Check the swing portfolio.
  • Check the potential new longs I have in the list.

System: Carter MA 8 – 21


In his book “Mastering the trade”, John Carter proposes a simple system based on the moving averages of 8 and 21.

I have implemented the basis of this system and I have changed some behaviors:

I have build this system on Tradingview and I have done some back-testing in 3 periods to see how it works.

The system

The system code is this one:

// This source code is subject to the terms of the Mozilla Public License 2.0 at
// © joapen

strategy("Carter EMA(8/21)", overlay=true)

FromMonth = input(defval = 1, title = "From Month", minval = 1)
FromDay   = input(defval = 1, title = "From Day", minval = 1)
FromYear  = input(defval = 2020, title = "From Year", minval = 2000)
ToMonth   = input(defval = 12, title = "To Month", maxval = 12)
ToDay     = input(defval = 31, title = "To Day", maxval = 31)
ToYear    = input(defval = 2020, title = "To Year", maxval = 2020)

length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(20, title="KC Length")
multKC = input(1.5, title="KC MultFactor")

useTrueRange = input(true, title="Use TrueRange (KC)", type=input.bool)

// Calculate BB
source = close
basis = sma(source, length)
dev = multKC * stdev(source, length)
upperBB = basis + dev
lowerBB = basis - dev

// Calculate KC
ma = sma(source, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC

sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)

val = linreg(source  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)

// lime green  red marron
sqzLong = iff( val > 0, iff( val > nz(val[1]), true, false), iff( val < nz(val[1]), false, true))
// Plots
plot(upperBB, title="BB",
plot(ema(close,8), title="EMA(8)",
plot(ema(close,21), title="EMA(21)",

longCondition = (ema(close, 8)> sma(close, 21)) and (close < ema(close, 8) and sqzLong) and time > timestamp(FromYear, FromMonth, FromDay, 00, 00) and time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
alertcondition(longCondition, title='Long', message='long!!!')
if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)

shortCondition = (close > upperBB ) or (ema(close, 8)< sma(close, 21) or val<0) and time < timestamp(ToYear, ToMonth, ToDay, 23, 59)
alertcondition(shortCondition, title='Short', message='short!!!')
if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)

Back-testing conditions

  • Amount = 100.000$
  • Commission = 0$
  • List of companies: fix list of companies I know with different behaviors, volatility and industries: BEN, TROW, CTVA, AEMD, GMRE, WBA, CVS, MO, DT, GE.

Quality of the samples:

  • Minimum around 200 trades to consider a good amount of cases.
  • Share Ratio > 1
  • Profit Factor > 2

Back-testing results for first date range

  • Date range = 1/1/2020 – 13/05/2020
  • Time frame = 5 minutes

Volatility during this period have been so high:

Back-testing results for second date range

  • Date range = 1/1/2019 – 13/05/2019
  • Time frame = 15 minutes (Tradingview does not enable me to do it in 5 minutes)

Back-testing results for bio companies in 2020

  • Date range = 1/1/2020 – 13/05/2020
  • Time frame = 5 minutes



  • I have to improve or discard this system.
  • Check when the market trend is better.
  • Check when volatility is lower.

Backtesting tips

I do this list of tips so I review before I do some back-testing analysis.

main questions (from John Bogle)

  • What is the rationale or hypothesis?
  • What is the empirical evidence?
  • What are the implementation results?

Tips to remind

  1. Do a test of your system with 2008.
  2. If you look for correlation, you probably will find it, it does not mean that it will work in future.
  3. Test in not the best conditions and compare with other systems of
  4. Check volatility, tests on periods with low and high volatility is useful to get conclusions.
  5. Track the results in a word document with screenshots of the work done, the variables you touched and the specific results.
  6. Prepare set of 5 to 10 stocks for the back-test, track the results of all these stocks.

Typical pitfalls

  1. Survivor bias: you are not adding the companies that have not survived.
  2. Look-ahead Bias: you have all the data in front of your eyes and can make trades according to that data, this provokes you get a false understanding about the behavior of your system.
  3. In sample bias: you use a sample data that is always the same or similar, so then your system adjust to this sample and lose effective.

Cboe SKEW Index (“SKEW”)

Introduction to SKEW Index

The Cboe SKEW Index (“SKEW”) is an index derived from the price of S&P 500 tail risk. It’s similar to Volatility Index (VIX).

The primary difference between the VIX and the SKEW is that the VIX is based upon implied volatility round the at-the-money (ATM) strike price while the SKEW considers implied volatility of out-of-the-money (OTM) strikes.

SKEW typically ranges from 100 to 150.

  • The higher the rating, the higher the perceived tail risk and chance of a black swan event.
  • A SKEW rating of 100 means the perceived distribution of S&P 500 returns is normal and, therefore, the probability of an outlier return is small.

Other concepts (for my poor memory)

Out of the Money (OTM) is an expression used to describe an option contract that only contains intrinsic value. These options will have a delta of less than 50.0.

At the money (ATM) is a situation where an option’s strike price is identical to the price of the underlying security.

SPX Vs DIX 2020 follow-up

I have started to follow-up the Dark Index Vs SPX, as one of the indicators I follow during the decisions. Right now it’s in test mode, as I have to learn about what happens and see if I can build some type of correlation that contributes in a positive way to my trading actions.

So, let’s start.

First chart (January 1st – April 30st)

When DIX is up, it’s assumed the whales are buying in a silent way. Some trends:

  • February 27th
  • March 24th


I have been trying to find correlations in terms of what have been happening during last 4 months in the US market and I found something that I need to see in deep.

I added Volatility Index (^VIX) to a chart, but the figure was so bad. I did “1 minus VIX” and added to the chart, so you can see what happened:

I have to find if this type of correlation is repeated from time to time or if it is something that just happened this time.

Let’s see other years

I checked the same period but in 2015. This was the result:

I checked the same period but in 2016. This was the result:


No relevant conclusion

Tradingview, using quandl data

I just discovered that you can use quandl data (from on Pine in tradingview.

I have done an basic exercise with avocado.

The code

study("Producer Price Index by Commodity for Farm Products: Avocados", shorttitle="Avocado", precision=2)
quandl_ticker = "QUANDL:FRED/WPU01110205"
data = security(quandl_ticker, "D", close)
plot(data, color=green, style=line)

Using the quandl() function

study("Producer Price Index by Commodity for Farm Products: Avocados", shorttitle="Avocado", precision=2)
dff = quandl("FRED/WPU01110205", barmerge.gaps_off, 0)

The result

You just want to see the data without comparing

you can add the ticker directly in tradingview and it will show up. In this example is: “QUANDL:FRED/WPU01110205”.


Average True Value (ATR) on pine (tradingview)

I have created this code to help me with the trades, independently of the long term trades or swing trades.

The code

// @author = , how I use it
// If you use this code in its orignal/modified form, do drop me a note. I would like to learn about better improvements of it 
//1.- Define Stop Loss
//2.- Check if the goal makes sense or not,
//3.- Compare with Bollinger bands.
//4.- Refine the trade...
study(title="joapen-ATR-analysis", overlay = true)

nATRPeriod = input(defval = 10, title="# periodos", type=integer)
nATRMultip = input(defval = 1.8, title="factor multiplicador", type=float)

xATR = atr(nATRPeriod)
nLoss = nATRMultip * xATR
// the "goal reference" must be at least twice the stop loss
nObjetivo = nATRMultip * xATR *2

xATRStop = close - nLoss
xATRObjetivo = close + nObjetivo

plot(xATRStop, color=red, title="ATR Stop")
plot(xATRObjetivo, color=blue, title="ATR Objetivo")

Any additional support is welcomed

This platform, competes with, and it comes with different features and levels of analysis of data that are interesting.

I have to go a little bit deeper on the analysis of the tool and try to learn if it’s worthy than tradingview.

There is a programatic way to filter companies, which is something really valuable, the standard screeners are not so much good.

I have not found a backtest solution to enable the analysis of a strategy written in code (as tradingview offers).

I need to stop here again and check it.