Friday, 12 May 2023

Clustering trading rule p&l

 I recently upgraded my live production system to include all the extra instruments I've added on recently. I also did a little consolidation of trading rules, simplifying things slightly by removing some rules that didn't really have much allocation, and adding a couple from my new book. As usual I set the instrument weights and forecast weights using my handcrafting methodology, which is basically a top down method that involves clustering things into groups in a hierarchical fasion.

In my backtests I do this clustering using the correlation matrix as a guide, but for production weights I use heurestics. So for instruments I say things like 'bonds are probably more correlated with each other than with other assets' and form the clusters initially as asset classes. And for forecast weights, which allocate across trading rules, I say things like 'momentum type trading rules are probably more correlated with each other', so I end up using a hierarchy like this:

  • Convergent (eg carry and mean reversion), Divergent (eg momentum)
  • Generic trading rule (eg EWMAC)
  • Specific trading rule variation (eg EWMAC2,8)

Now I recently tested this clustering method for instruments in this blog post. OK it was 17 months ago, but it felt recent to me. Basically I used a clustering methodology and threw in the actual correlation matrix to see how the grouping turned out. It was quite interesting. So I thought it would be quite interesting to do a similar thing with forecast weights. Effectively I am sense checking my heuristic guidelines to see if they are completely nuts, or vaguely okay.

Some code.


Getting the correlation matrix

Well you might think this is easy, but it's not. The correlation matrix here is the correlation of returns for a given set of trading rules and variations. But returns of what? A single instrument, like the S&P 500? That obviously may be unrepresentative of the sample generally, and we're not going to do this exercise for the 200+ instruments I have in my dataset now. What about the correlation of average returns taken across a bunch of instruments, or perhaps the average of the correlations taken across the same bunch - note these aren't quite the same thing. For example an average of correlations will give every instrument the same weight, wheras an average of returns will give a higher weighting to instruments with more data history.

And if we are doing averaging, do we just do a simple average - which will be biased since 37% of my futures are equities? Or do we use the instrument weights?

The good news is it probably won't make too much difference. Given enough history, the correlation of trading rule forecast returns is pretty similar across instruments. But we probably want to avoid overweighting certain asset classes, or equally weighting instruments without much history. So I'm going to go for taking the return correlation of portfolios for each trading rule. Each portfolio consists of the same trading rule being traded in all the instruments I trade, weighted by my actual instrument weights. 

Now I don't actually trade all rules in all instruments, because of trading costs, and sometimes because the instrument has certain flaws, but what we are trying to get here is as much information as possible to build a robust correlation matrix. I will also use pre-cost returns; not that it will make any difference, but the point here is to discover how similar rules are to each other, which doesn't depend on costs.

Finally note that I have 135 instruments with instrument weights, because some of my 208 are duplicates (eg micro and mini S&P 500), or I can't legally trade them, or for some other reason.


Results: N=2

Let's kick things off then:

Cluster 1 'convergent'
['mrinasset160', 'carry10', 'carry30', 'carry60', 'carry125', 'relcarry',
'skewabs365', 'skewabs180', 'skewrv365', 'skewrv180']
Cluster 2 'divergent'
['breakout10', 'breakout20', 'breakout40', 'breakout80', 'breakout160', 'breakout320',
'relmomentum10', 'relmomentum20', 'relmomentum40', 'relmomentum80', 
'assettrend2', 'assettrend4', 'assettrend8', 'assettrend16', 
'assettrend32', 'assettrend64', 
'normmom2', 'normmom4', 'normmom8', 'normmom16', 'normmom32', 'normmom64', 
'momentum4', 'momentum8', 'momentum16', 'momentum32', 'momentum64', 
'accel16', 'accel32', 'accel64']


An absolutely perfect convergent vs divergent split. The labels by the way are added by me, not the code.


Results: N=3


Cluster 1 'convergent' (Unchanged)
['mrinasset160', .... ]

Cluster 2 'fast divergent'
['breakout10', 'breakout20',
'relmomentum10', 'relmomentum20', 'relmomentum40', 'relmomentum80', 
'assettrend2', 'assettrend4', 
'normmom2', 'normmom4', 
'momentum4', 'accel16']

Cluster 3 'medium and slow divergent'
['breakout40', 'breakout80', 'breakout160', 'breakout320',
'assettrend8', 'assettrend16', 'assettrend32', 'assettrend64', 
'normmom8', 'normmom16', 'normmom32', 'normmom64', 
'momentum8', 'momentum16', 'momentum32', 'momentum64', 
'accel32', 'accel64']
This is why we are doing this exercise - we've just discovered something interesting: fast momentum like trading rules have more in common with other fast momentum trading rules, than they do with slow variations of themselves.

Results: N=4

Cluster 1 'convergent mean reversion'
['mrinasset160']
Cluster
2 'convergent skew and carry'
['carry10', 'carry30', 'carry60', 'carry125', 'relcarry', 'skewabs365', 'skewabs180', 'skewrv365', 'skewrv180']
Cluster
3 'fast divergent - unchanged'
['breakout10', 'breakout20', ....]
Cluster
4 'medium and slow divergent - unchanged'
['breakout40', 'breakout80', ....]


Results: N=5

Now it's the turn of the (relatively) slow divergent to be split up:

Cluster 1 'convergent mean reversion (unchanged)'
['mrinasset160', 'mrwrings4']
Cluster
2 'convergent skew and carry (unchanged)'
['carry10', 'carry30', 'carry60', ....]
Cluster
3 'fast divergent - unchanged'
['breakout10', 'breakout20', ....]
Cluster 4 'slow divergent'
['breakout160', 'breakout320',
'assettrend32', 'assettrend64', 
'normmom32', 'normmom64', 
'momentum32', 'momentum64']
Cluster 5 'medium speed divergent'
['breakout40', 'breakout80',
'assettrend8', 'assettrend16', 
'normmom8', 'normmom16', 
'momentum8', 'momentum16', 
'accel32', 'accel64']
Again it's the speed of trading that is the differentiator here, not the trading rule.


Results: N=6

We break relative momentum off from it's counterparts in what was previously cluster 3:

Cluster 1 'convergent mean reversion (unchanged)
['mrinasset160']
Cluster
2 'convergent skew and carry' (unchanged)
['carry10', 'carry30', 'carry60', ...]
Cluster
3 'fast divergent - unchanged'
['breakout10', 'breakout20', ....]
Cluster 3
['relmomentum10', 'relmomentum20', 'relmomentum40', 'relmomentum80']
Cluster 4
['breakout10', 'breakout20',
'assettrend2', 'assettrend4', 
'normmom2', 'normmom4', 
'momentum4', 'accel16']
Cluster 5 'slow divergent' (unchanged - was cluster 4)
['breakout160', 'breakout320',...
]
Cluster 6 'medium speed divergent' (unchanged - was cluster 5)
['breakout40', 'breakout80',...
]

Results: N=7

And now acceleration comes away from the other slow rules:

Cluster 1 'convergent mean reversion (unchanged)
['mrinasset160']
Cluster
2 'convergent skew and carry' (unchanged)
['carry10', 'carry30', 'carry60', ...]
Cluster 3 'relative momentum' (unchanged)
['relmomentum10', 'relmomentum20', 'relmomentum40', 'relmomentum80']
Cluster 4 'fast divergent' (unchanged)
['breakout10', 'breakout20'...
]
Cluster 5 'slow divergent ex. accel'
['breakout160', 'breakout320', 'assettrend32', 'assettrend64', 'normmom32', 'normmom64', 'momentum32', 'momentum64']
Cluster 6 'slow acceleration'
['accel32', 'accel64']
Cluster 7 'medium speed divergent' (unchanged - was cluster 6)
['breakout40', 'breakout80',...
]

Results: N=8

Skew and carry seperate:


Cluster 1 'convergent mean reversion (unchanged)
['mrinasset160']
Cluster 2 ('skew)
['skewabs365', 'skewabs180', 'skewrv365', 'skewrv180']
Cluster 3 ('carry')
['carry10', 'carry30', 'carry60', 'carry125', 'relcarry']
Cluster 4 'relative momentum' (unchanged)
['relmomentum10', 'relmomentum20', 'relmomentum40', 'relmomentum80']
Cluster 5 'fast divergent' (unchanged)
['breakout10', 'breakout20'...
]
Cluster 6 'slow divergent ex. accel'
['breakout160', 'breakout320',...]
Cluster 7 'slow acceleration' (unchanged)
['accel32', 'accel64']
Cluster 8 'medium speed divergent' (unchanged)
['breakout40', 'breakout80',...
]

Results: N=11

Let's skip ahead a bit, and also show all the instruments in each group for this final iteration:

Cluster 1 'slow asset mean reversion'
['mrinasset160']
Cluster 2 'skew'
['skewabs365', 'skewabs180', 'skewrv365', 'skewrv180']
Cluster 3 'carry'
['carry10', 'carry30', 'carry60', 'carry125', 'relcarry']
Cluster 4 'slow relative momentum'
['relmomentum10', 'relmomentum20']
Cluster 5 'fast relative momentum'
['relmomentum40', 'relmomentum80']
Cluster 6 'divergent speed 2'
['breakout20', 'assettrend4', 'normmom4', 'momentum4']
Cluster 7 'divergent speed 1 (fastest)'
['breakout10', 'assettrend2', 'normmom2', 'accel16']
Cluster 8 'divergent speed 5 (slowest)'
['breakout160', 'breakout320', 'assettrend32', 'assettrend64', 'normmom32', 'normmom64', 'momentum32', 'momentum64']
Cluster 9 'slow acceleration'
['accel32', 'accel64']
Cluster 10 'divergent speed 4'
['breakout80', 'assettrend16', 'normmom16', 'momentum16']
Cluster 11 'divergent speed 3'
['breakout40', 'assettrend8', 'normmom8', 'momentum8']

A new heirarchy for handcrafting trading rules

With that all in mind, a better heirarchy would be something a bit like this:

  • Convergent
    • Mean reversion
    • Skew
      • Equal split between 4 skew rules
    • Carry
      • Outright carry
      • Relative carry
  • Divergent
    • Speed 1 (fastest: turnover > 45)
      • acceleration - nothing fast enough
      • relmomentum10
      • other trend
        • breakout10
        • assettrend2
        • normmom2
        • momentum4
    • Speed 2 (22 < turnover <45)
      • acceleration16
      • relmomentum20
      • other trend
        • breakout20
        • assettrend4
        • normmom4
        • momentum8
    • Speed 3 (12 < turnover < 22)
      • acceleration32
      • relmomentum40
      • other trend
        • breakout40
        • assettrend8
        • normmom8
        • momentum16
    • Speed 4 (7 < turnover < 12)
      • acceleration64
      • relmomentum80
      • other trend
        • breakout80
        • assettrend16
        • normmom16
        • momentum32
    • Speed 5 (4 < turnover < 7)
      • other trend
        • breakout160
        • assettrend32
        • normmom32
        • momentum64
    • Speed 6 (turnover > 4)
      • other trend
        • breakout320
        • assettrend64
        • normmom64
As you can see I (roughly) used turnovers to group the divergent rules, although these groupings aren't quite right I thought it better to go for some nice neat sequences. And this also doesn't exactly follow how the clustering above works eithier. But this would certainly be a better way of doing things than the grouping entirely by trading rule, which as we've seen doesn't make sense for divergent rules where speed is more important.

Now of course there are a lot of caveats with this; first of all it's entirely in sample, but given how stable and persistent correlation of trading rules returns are over time, we'd probably get very similar results with a purely backward looking approach. Secondly we're ignoring things like costs, and the possibility that some rules may do better than others, but we can deal with that when we actually use the above structure to set instrument weights.


Friday, 5 May 2023

Trading and investing performance year nine - part 2: Futures trading


 Here is part two of my annual review. Part one looked at my overall portfolio, including long only, but there was only a cursory look at my futures. Here in this second part I will be looking a my futures trading account in a lot more detail.

It's important to say why I'm doing this. I'm certainly not doing it so I can upweight good strategies, and delete badly performing ones. A year of data on top of a 50 year backtest is meaningless. But it's interesting to know what did well or badly, whether my trading costs were higher than expected, how closely my live performance matches simulation, and whether my new dynamic optimisation is adding value compared to the simpler static system I was trading until late 2021 (as requested by Christina). 



A reminder of my overall futures performance

As I noted at the start of the post, I'll just put a very cursory look at my futures trading in here, with a subsequent follow up post to look at more details. All figures are as a % of my notional capital, which will usually be more than I have in my account. 

MTM: -9.7%
Interest: 1.3%
Fees: -0.06%
Commissions: -0.21%

Net futures trading: -8.7%

'Interest' includes dividends on 'cash like' short bond ETFs I hold to make a slightly more efficient use of my cash; I've recently (in this financial year) added a bit more to this sub portfolio. It's quite interesting how interest has gone from being irrelevant to actually adding something to performance.

As I've done in previous years I compare this to two benchmarks, 'Bench2' the SGA CTA index, and a 'Bench1' a fund run by AHL, my ex employers. My loss was worse than both; on a vol corrected basis bench1 made 5% (admittedly on the back of a loss last year), and bench2 only dropped 1.3%

It might be interesting to look at the performance of me versus those benchmarks since I started trading my own money:

        Me Bench1 Bench2

2014 – 2015 58.2% 70.2% 50.7%

2015 – 2016 23.2% -8.7% -1.6%

2016 – 2017 -14.0% -6.2% -25.5%

2017 – 2018 -3.7% 7.5% -4.4%

2018 – 2019 5.2% 8.1% 0.8%

2019 – 2020 39.7% 22.6% 9.3%

2020 – 2021 0.4% 0.8% 12.7%

2021 – 2022 27.0% -5.2% 38.3%

2022 - 2023 -8.71% 5.0% -1.30%

Mean         14.1% 10.4% 8.8%

Std dev         24.3% 24.3% 23.1%

SR         0.58 0.43 0.38

Geom mean 11.9% 8.5% 6.7%

Correlation 0.71 0.80

alpha         6.7% 6.8%

beta         0.71 0.84


Monthly performance, returns vol normalised to 'me' in sample

Still looks pretty healthy. I seem to have been hurt less badly by the sell off that occured in March, possibly due to a lower trend following component (more discussion of that later).


Market by market

Here are the numbers by asset class

  OilGas  -3.19

     Ags  -2.78

      FX  -2.00

  Equity  -2.14

  Sector  -1.64

  Metals  -0.94

     Vol   1.52

    Bond   1.56

A big turnaround for energy and ags markets, the darlings of the 2021/22 accounting period. And here are some worst and best:

0    GAS_US_mini   -2.0

1            SMI   -1.7

2          WHEAT   -1.5

3            AUD   -1.4

4          US10U   -1.4

5       EU-BASIC   -1.2

6           IRON   -1.2

7   CRUDE_W_mini   -1.2

8         SOYOIL   -1.0

9         GBPEUR   -1.0

....

47          US20    1.0

48       SOYMEAL    1.1

49           VIX    1.4

50           EUR    1.7

51           JPY    2.0

52          BUND    2.0


Interesting that I had profits in 53 instruments last year; about half the number I was actually trading. Again this is the work of the dynamic optimiser; before that I was trading only ~30 markets and it's unlikely I would have positions in all of them during the year.

Trading rules

Presented initially without comment, a bunch of plots showing p&l for each trading rule group:










The most obvious thing is how depressingly bad all of these graphs are. Pretty much every group of trading rules had a small net loss over the year. Even the diversifying carry and skew strategies weren't much help, although they did make money back in the sell off that caught out all the trend following style rules, narrowing my underperformance against the benchmark for the year. Only mean reversion (within asset classes - basically a value strategy), and relative carry were decently profitable. 

It's this lack of signal diversification that brought me to my second worst loss when I started trading: -8.7%. Of course, most equity long only managers would murder half their family for that to be their second worst annual loss, so let's get some perspective here.



Live vs sim

Now let's turn to see how well my live performance matches what my backtest thinks I got. The dynamic optimisation introduces some new jeopardy here, since it results in some path dependence; if the starting positions are different at the start of the time period it's more likely that things will diverge thereafter (I could deal with this by populating my actual starting positions into the backtest on the first of April, but that's a lot of hassle).




'dynamic' here is the backtest, 'live' is live.

Well there are certiainly some differences here; you can see when I went on holiday, but interestingly we end up in exactly the same place. There are so many reasons why these will end up different, none of which I am that bothered about exploring.


Costs and slippage

I already noted above that my commission came in at 21bp (basis points = 0.21%) of account value, but how about slippage?

The cost I would have paid had I crossed the spread every time I traded (market orders) would have been 91bp. However my execution algo by sometimes executing passively saved me 22bp, i.e. around a quarter of the total. So my net slippage was 69bp, for total costs of 90bp.

This is a lot less than last years 3% (due to a one off strategy change), and a little less than my backtest which comes in at around 1% a year. It looks like my new dynamic optimisation algo is doing it's thing.


Dynamic vs static optimisation

Finally let's compare the performance of what I currently trade (dynamic optimisation with over 100 instruments) versus what I was trading before (static optimisation with less than 30). I'm going to compare backtest vs backtest here - I no longer trade static optimisation with real money so there is no other way of doing it; and it seems fairest to compare like with like. Plus we've already seen the difference between the dynamic optimisation backtest and it's live production returns.

Naturally one year doesn't prove anything, and it's also true that the results of a static backtest can be unusually flattered by getting lucky with your choice of instruments (something I discuss at length in my new book). 

An important point here is that it's generally a good thing to store the code and config you use for past trading systems so you can do this exercise. It might also be worth noting down the hash number of the repo version you used with the code; firstly in case you fix bugs in the backtest that change the results (or introduce new bugs!) - although arguably if you run the same code with both backtests that is fairer; secondly in case you make changes that are backwardly incompatible and the old code just doesn't run.

First the long view (well since 2000, which is when my stored backtest begins):



Again this is a case of the static backtest getting lucky. What about last year:
There is a bit of dynamic outperformance, and it's certainly a smoother ride. 


What next

I'm not as interested in some of these statistics as other people are; with the exception of costs, and as long as my live p&l is in the same ball park as my backtest. But hopefully your curiosity has been sated.

My short term plan is to add another bunch of instruments to my strategy, since I've added a bunch more to my database. Then I'm going to have a look at implementing some of the novel strategies in my book, albeit with some fun twists.


 













Friday, 28 April 2023

Trading and investing performance: year nine, part one

 A bit late this year, due to a confluence of holidays, book launches, university exam writing and various other things. Here lies within my performance for the UK tax year 2022-23. Previous years can be found here

TLDR: Not great, absolute or relative. It was indeed a complete anus - horrible!.

This will be a two parter this year. In this post I will look at my overall performance, with only a cursory look at my futures trading. In the second post I will focus on my futures trading.


Overview 

Investing:

  • 1 UK stocks
  • 2 Various stock ETFs
  • 3 Various bond ETFs
  • 4 A small amount of uninvested cash
Trading:
  • 5 Futures contracts traded by my fully automated trading strategy
  • 6 Cash as trading capital for the above, of which usually around a third is required for initial margin

Excluded from this analysis is:

  • My house
  • A cash buffer I keep to cover living expenses

I benchmark my investments in the following way:

  • A: UK single stocks 
    • Benchmarked against ISF, a cheap FTSE 100 ETF (FTSE 350 is probably a better benchmark but these ETFs tend to be more expensive).
  • B: Long only stocks investments: All stock ETFs and UK stocks
    • Benchmarked against a cheap global equity fund (VEVE)
  • C: Long only bond investments: All bond ETFs
    • Benchmarked against a cheap global bond fund (AGGG)
  • D: Long only investments: All UK stocks, bond ETFs and stock ETFs
    • Benchmarked against a cheap 80:20 fund. 
  • E: Futures trading: Return from the futures contracts traded by my fully automated system. The denominator of performance here is the notional capital at risk in my account (usually less than the account value).
    • Benchmarks are a similar fund run by my ex employers AHL, and the SG CTA index, adjusted for volatility.
  • F: Everything: Long only investments, plus futures hedge, plus futures trading. I include the value of any cash included in my trading or investment accounts, since if I wasn't trading I could invest this. 
    • For the benchmark I use a cheap 60:40 fund.


If you prefer maths, then the relationship to the first set of categories is:

A = 1
B = 1 + 2 
C = 3
D = B + C = 1 + 2  + 3
E = 5 + 6
F = D + 4 + E = 1 + 2 + 3 + 4  +5 + 6


Performance contribution


The figures shown are the contribution of each category to my total investment performance:



1) UK equities -1.7%

2) Stock ETFs -1.8%

3) Long only bonds 0.12%

5 & 6) Futures trading -1.3%



F) Total -4.7%



Here is another way of putting it:

Long only MTM (mark to market): -7.9%

Stock and ETF dividends, less fees: 4.6%

Futures: -1.3%

Now for the same figures as 'internal rates of return', which are effectively for the 'capital' employed in each area. I use the Excel function XIRR. You can't add these up, but they are comparable and account for flows between categories. Benchmarks are also shown.


A) UK equities -7.0% Benchmark +4.3%

B) Long only stocks -4.7%   Benchmark -2.4%

C) Long only bonds +1.34%  Benchmark -1.10%

D) Long only investments -4.1% Benchmark -2.1%

E) Systematic futures trading  -8.7% Benchmarks +5.0% -1.3% (vol matched)

F) Everything -4.7% Benchmark -1.9%

Well, that's a pretty dark picture. We know that 2022 wasn't great for 60:40 (my benchmark for 'everything') but things picked up in early 2023. Indeed my only outperformance came in long only bonds; maybe I should become a long only fixed income manager? (Wait, what?)


UK equities

This portfolio is traded using a system which I've explained before (value bias, with trailing stop of 30%), but which is not automated. Instead I have the stocks set up in a spreadsheet, with alerts reminding me when stop losses occur. If I sell then I download some data to pick the best value share.


Current portfolio:

Vistry Group                 9.67%
Centrica PLC                 7.93%
3i Group                 7.23%
Jupiter Fund Management         6.52%
Barratt Developments         5.77%
Bluefield Solar Income Fund 5.21%
Sequoia Economic Infrastructure 5.02%
NextEnergy Solar         4.98%
GCP Infrastructure Investment 4.82%
HICL Infrastructure         4.60%
OSB Group                 4.41%
Castings                 4.39%
Renewables Infrastructure 4.30%
Lloyds Banking Group         4.26%
Legal & General Group         4.23%
Phoenix Group                 3.46%
Johnson Matthey         3.46%
Aviva PLC                 3.45%
Persimmon PLC                 3.41%
Greencoat UK Wind         2.89%


Here is the performance of every share I held over the year. Percentages are taken from the start of year price, or from when I bought it during the year:


Name         MTM % Divi % TR %
3i Group Ord (L 54.1% 2.1% 56.3% HELD BOUGHT
Centrica PLC (L 39.5% 1.3% 40.7% HELD LEGACY
Castings PLC (L 16.9% 10.6% 27.5% HELD LEGACY
Central Asia Me 17.2% 9.1% 26.3% SOLD LEGACY
Imperial Brands 17.9% 5.5% 23.5% SOLD LEGACY
Centamin PLC (L 14.9% 6.7% 21.6% SOLD LEGACY
Barratt Develop 10.1% 2.1% 12.3% HELD LEGACY
Vistry Group PL 8.6% 3.3% 11.9% HELD BOUGHT
Jupiter Fund Ma 7.7% 4.1% 11.8% HELD BOUGHT
Lloyds Banking 6.0% 4.6% 10.6% HELD LEGACY
Greencoat UK Wi 3.7% 0.0% 3.7% HELD LEGACY
Johnson Matthey -0.4% 4.0% 3.6% HELD LEGACY
Rathbones Group 1.6% 0.0% 1.6% SOLD LEGACY
Aviva PLC (LSE: -27.9% 28.3% 0.3% HELD LEGACY
Renewables Infr -5.4% 5.0% -0.4% HELD LEGACY
HICL Infrastruc -3.3% 2.6% -0.7% HELD BOUGHT
NextEnergy Sola -4.0% 3.2% -0.8% HELD BOUGHT
Bluefield Solar -1.7% 0.0% -1.7% HELD BOUGHT
Legal & General -4.6% 2.1% -2.4% HELD BOUGHT
Phoenix Group H -11.3% 7.9% -3.4% HELD LEGACY
Tullow         -4.4% 0.0% -4.4% SOLD BOUGHT
Greencore Group -4.6% 0.0% -4.6% SOLD LEGACY
Sequoia Economi -5.2% 0.0% -5.2% HELD BOUGHT
Babcock Interna -5.8% 0.0% -5.8% SOLD LEGACY
GCP Infrastruct -9.1% 2.6% -6.5% HELD BOUGHT
Morgan Advanced -9.6% 1.9% -7.7% SOLD LEGACY
Hammerson PLC ( -12.2% 0.6% -11.6% SOLD LEGACY
Persimmon PLC ( -13.9% 0.0% -13.9% HELD BOUGHT
Currys         -18.2% 3.1% -15.1% SOLD BOUGHT
OSB Group PLC ( -17.2% 0.0% -17.2% HELD BOUGHT
Morgan Sindall -23.5% 2.6% -20.9% SOLD LEGACY
TP ICAP GROUP P -25.5% 3.7% -21.7% SOLD LEGACY
Investec PLC (L -26.7% 2.8% -23.9% SOLD LEGACY
Direct Line Ins -31.2% 5.5% -25.7% SOLD LEGACY
Aberdeen -31.9% 3.6% -28.3% SOLD BOUGHT
Redde Northgate -31.9% 3.5% -28.4% SOLD LEGACY
BT Group PLC (L -33.8% 2.9% -30.9% SOLD LEGACY
Taylor Woodrow -33.2% 0.0% -33.2% SOLD BOUGHT
Synthomer -54.2% 0.0% -54.2% SOLD BOUGHT



Note I generally use a 30% stop, but because the stops aren't placed I sometimes get gapped through (badly in the case of the final share). 

MTM is mark to market (the % price change since I bought it, or the start of the year), Divi(dend)% is self explanatory, TR is total return - the sum of the first two columns. The next column describes the current state of this position: do I still HOLD or have I SOLD. The final column shows when I obtained the position: at the start of the year (LEGACY) or it's something I subsequently BOUGHT.

Turnover was 167%, eg holding period just over 7 months. This is slightly down from last year. Average dividend was 6.2%. My XIRR was -7.0%; you might think that sounds okay given all the bad things you've heard about stocks, but actually the UK was a standour market in the general horror of the last 12 months and my benchmark (FTSE 100 ETF) earned 4.7%.

        XIRR bench
2016 – 2017 29.2% 25.1%
2017 – 2018 18.3% 2.2%
2018 – 2019 -2.3% 7.9%
2019 – 2020 -23.1% -24.2%
2020 – 2021 64.3% 29.0%
2021 – 2022 9.8% 16.5%
2022 – 2023 -7.0% 4.3%
Mean         12.74% 8.68%
Stdev         0.28 0.18
SR         0.45 0.49
Geo. Mean 9.8% 7.3%
Alpha 1.1%
Beta 1.34
Corr 0.84


So this has been my worst year in relative, and secondly only to COVID in absolute terms. After two straight years of underperformance, the benchmark is now a little ahead on SR, but I'm still winning on geometric mean.



Long only Stocks

As already noted this is consists of all my stock ETFs, plus my UK shares. With the recovery of value being one of the stories of last year, and the US/RoW spread narrowing with my permanent underweight to the overvalued US I had hoped for good things here. Some hope!

Here are the risk exposures by region within this sub-portfolio:

              Start of year      End      Long term   Target

Asia             14%             17%         15%       18%

EM               20%             26%         25%       23%

Europe           17%             18%         20%       14%

UK               29%             31%         25%       32%

US               20%             8%          15%       13%


Start of year and End are self explanatory, whilst Long term is the strategic allocation (see my spreadsheet). After I have snapshotted the year I rebalance the portfolio to the target level shown, taking account of tax and transfers between accounts. 

The rather wild differences between end of year and target are because I'm partially through switching m portfolio to ESG ETFs. This also meant that turnover was much higher than normal, but this will be a temporary situation.

The XIRR for my stocks was -4.7%, which isn't great the benchmark ETF I've chosen (IWRD) was only down -2.4% TR. Dividends were much healthier at 5.2%.

No stats as I only started breaking out performance like this last year, but you can see I'm underperforming for the second year in a row:

2021 - 2022 XIRR +6.1%,  benchmark +14.5%

2022 - 2023 XIRR -4.7%,  benchmark -2.4%

Benchmarking note: If you check back you may see slightly different numbers for the benchmarks. This is because I was using a mixture of random ETFs for stocks/bonds, and Vanguard preblended 60:40 and 80:20. This meant there was no consistency; eg the 60:40 fund actually did worse than a 60/40 blend of my stock and bond benchmarks. I was also unsure about some of the historic marks for my benchmarks, as some of them weren't done very precisely. So I repopulated my benchmark history with total return history in GBP terms, ex fees for:

  • Bonds SUAG (US dollar only) until April 2018, then AGGG (all currencies, but not available until late 2017)
  • Equities IWRD 
  • 60:40 benchmark - a 60/40 blend of the above; so effectively annually rebalanced
  • 80:20 benchmark - an 80/20 blend of the above

My FTSE 100 ISF benchmark for UK equities is unchanged.

As with what I did last year, if anything this makes my performance look a little worse on a relative basis so I think my hands are clean.


Long only Bonds

This is just ETFs. Here are the risk exposures:

              Start of year     End      Long term   Target

Asia             3%              5%         4%        2%

EM               40%             41%       24%        34%

Europe           35%             39%       24%        19%

UK               8%              2%        24%        25%

US               13%             13%       24%        22%


Last year I started treating my 'cash like' bond ETFs as cash, and I stick to that here. These are held in my IB trading account to make more efficient use of my margin; more below.

Again, there are some big deltas here due to my rebalancing into ESG which I couldn't complete in the tax year without incurring.... tax. Note that the tax allowance for capital gains in the UK is now just £2k, so this might take a while longer!

I was a big buyer of bonds during the year, more than doubling my allocation. This is because the strongly negative relative momentum in bonds abated, and I tilted back to something closer to my strategic allocation.

This also means the XIRR figures might be a bit weird, but what the hell, I made 1.34% versus the index (AGGG) losing 1.1%. My only green figure relative and absolute for the year, and I will take it. 

2021 - 2022 XIRR +1.53%,  benchmark -2.97%

2022 - 2023 XIRR +1.34%,  benchmark -1.10%

Based on two years of performance, I am the bond king now - sorry Bill


Long only investments



All of the above, in one easy to find place. You already know what is currently in this portfolio, and the regional risk exposures, so that just leaves the macro asset class level exposure. Here it is in cash terms:

              Start of year      End      Long term   Target

Bonds            5%             10%          22%        12%

Stock            95%            90%          78%        88%


And here's risk terms:

              Start of year      End      Long term   Target

Bonds            3%              6%          10%        7%

Stock            97%             94%         90%        93%


Given I did badly in stocks, and I mostly own stocks at a higher level than the 80:20 benchmark I use as of last year, it's no surprise that my XIRR here of -4.1% was below par compared to the benchmark of -2.1%.

        XIRR bench

2015 – 2016 6.1% 0.4%

2016 – 2017 22.3% 28.4%

2017 – 2018 1.3% -0.5%

2018 – 2019 4.0% 11.7%

2019 – 2020 -17.5% -6.4%

2020 – 2021 34.8% 33.4%

2021 – 2022 5.9% 11.0%

2022 – 2023 -4.11% -2.1%

Mean         6.60% 9.48%

Stdev         15.9% 14.7%

SR         0.41 0.65

Geo. Mean       5.6% 8.7%

Alpha        -3.0%

Beta         1.02

Corr         0.93



Futures trading (brief)


As I noted at the start of the post, I'll just put a very cursory look at my futures trading in here, with a subsequent follow up post to look at more details. All figures are as a % of my notional capital, which will usually be more than I have in my account. 

MTM: -9.7%
Interest: 1.3%
Fees: -0.06%
Commissions: -0.21%

Net futures trading: -8.7%

'Interest' includes dividends on 'cash like' short bond ETFs I hold to make a slightly more efficient use of my cash; I've recently (in this financial year) added a bit more to this sub portfolio. It's quite interesting how interest has gone from being irrelevant to actually adding something to performance.

As I've done in previous years I compare this to two benchmarks, 'Bench2' the SGA CTA index, and a 'Bench1' a fund run by AHL, my ex employers. My loss was worse than both; on a vol corrected basis bench1 made 5% (admittedly on the back of a loss last year), and bench2 only dropped 1.3%

        Me Bench1 Bench2
2014 – 2015 58.2% 70.2% 50.7%
2015 – 2016 23.2% -8.7% -1.6%
2016 – 2017 -14.0% -6.2% -25.5%
2017 – 2018 -3.7% 7.5% -4.4%
2018 – 2019 5.2% 8.1% 0.8%
2019 – 2020 39.7% 22.6% 9.3%
2020 – 2021 0.4% 0.8% 12.7%
2021 – 2022 27.0% -5.2% 38.3%
2022 - 2023 -8.71% 5.0% -1.30%
Mean         14.1% 10.4% 8.8%
Std dev         24.3% 24.3% 23.1%
SR         0.58 0.43 0.38
Geom mean 11.9% 8.5% 6.7%
Correlation 0.71 0.80
alpha         6.7% 6.8%
beta         0.71 0.84


So on a longer term basis, I'm still doing well here. The relatively low correlation with AHL is kind of interesting as well. 


Everything


Let's see what the final score is. The denominator here will be the total value of all the securities and investable cash I have, including both cash for futures margin and any temporarily univested cash in other accounts. I do exclude some cash I hold as a buffer, since that can't be invested. 

The bottom line is a loss of 4.7% vs the 60:40 benchmark down just 1.9%. Dividends were 4.6%; without those there would obviously have been a near double digit loss. Here's the history:

        XIRR bench
2014 – 2015 14.40% 2.0%
2016 – 2017 18.20% 24.8%
2017 – 2018 0.60% -3.0%
2018 – 2019 4.40% 10.4%
2019 – 2020 -6.60% -2.3%
2020 – 2021 27.90% 23.4%
2021 – 2022 8.25% 7.5%
2022 – 2023 -4.66% -1.9%
Mean         7.81% 7.61%
Stdev         11.8% 11.2%
SR         0.66 0.68
Geo. Mean 6.8% 7.1%
Alpha 1.1%
Beta 0.89
Corr 0.93


Summary and future plans


With writing a book and all, last year didn't see me do very much to my portfolio. I did some tidying up; now all my UK stocks are in a single account which makes attribution easier, and I started the move to ESG

I hoped to introduce some new futures strategies but didn't; my first act of the new year once I've written up my futures performance is going to be to add a bunch of new markets to my strategy, and then subsequently think about other strategies some more (principally RV and faster MR, although not quite in the way described in my new book - watch this space). I'm also painfully aware that I have a heap of work to do on pysystemtrade.

One other thing is that it seems to take longer and longer to write this post every year. It's a huge hacked together spreadsheet, full of checks and balances in case I miss something (I acidentally put a decimal point in the wrong place, and 'lost' 150k!). I really ought to automate the process somehow; which would involve keeping better records and writing some code. Hopefully I will have time this year.