Install Libraries

library(quantmod)
library(tidyverse)
package 㤼㸱tibble㤼㸲 was built under R version 4.0.5package 㤼㸱tidyr㤼㸲 was built under R version 4.0.5package 㤼㸱dplyr㤼㸲 was built under R version 4.0.5
library(fBasics)
library(fPortfolio)
package 㤼㸱fPortfolio㤼㸲 was built under R version 4.0.5

Download Share Prices for Study

Today we are looking at a study of Share prices from a book entitled Top Stocks of 2011.

I randomly selected 30 stocks, and tracked their financial fundamentals from 2015 onwards.

Here I form a portfolio of the surviving 13 Shares which are either liquid enough or still trading, to back-fit a portfolio randomly to see how the shares performed over 10 Years on the Australian Stock Exchange.

The shares are:

CDD = Cardno Ltd. Civil & Industrial Engineers

COH = Cochlear Ear Implants Ltd BioTech

FWD = Fleetwood Ltd Motorhomes, portable accomodation.

JBH = JB Hi Fi Audio , Video and elecronics Retailer.

MND = Monadelphous Group Mining & Civil Engineering

MTS = Metcash Grocery and Household goods retailer and wholesaler.

QBE = Queensland Insurance Insurance and diversified finance and investments.

RIO = Rio Tinto Mining Mining

SHV = Select Harvest Limited Almond grower, Agriculture.

TAH = Tabcorp Holdings Wagering and Online Betting

TGR= Tassal Group Salmon Farming Tasmania

WOW = Woolworths Grocery, Liquor, Household goods Retailer, and a diversified investments into wagering, Hotels, and others.

WPL = Woodside Petroleum Oil and Gas, energy suppliers.

head(prices_monthly, 3)
             CDD.AX   COH.AX   FWD.AX   JBH.AX   MND.AX   MTS.AX   QBE.AX   RIO.AX
2010-01-31 0.514857 46.23840 5.404756 11.18267 6.612465 2.412533 14.28999 43.60241
2010-02-28 0.506151 47.80033 5.473531 10.98701 7.312307 2.338738 13.34230 45.52811
2010-03-31 0.550068 54.87433 6.259439 11.44950 8.072028 2.350091 13.40627 50.62983
             SHV.AX   TAH.AX   TGR.AX   WOW.AX   WPL.AX
2010-01-31 2.475197 1.441218 1.138732 16.64295 24.70865
2010-02-28 2.486180 1.518913 1.026110 17.27365 25.31572
2010-03-31 2.156959 1.548080 1.007025 18.36178 27.72786

We then estimate monthly returns.

asset_returns_xts <-
  Return.calculate(prices_monthly,
                   method = "log") %>%
  na.omit()
head(asset_returns_xts, 3)

Here we estimate the portfolio with fPortfolio library

to use fPortfolio Data must first be converted to timeSeries() command format.

Theportfolio is long only no short stocks allowed in the portfolio.

It is a mean variance portfolio, set to minimum variance.

asset_returns_tSeries <- as.timeSeries(asset_returns_xts)


survivors <-  portfolioFrontier(asset_returns_tSeries, constraints="longOnly")

plot(survivors)

Make a plot selection (or 0 to exit): 

1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets
5:   Add Equal Weights Portfolio
6:   Add Two Asset Frontiers [LongOnly Only]
7:   Add Monte Carlo Portfolios
8:   Add Sharpe Ratio [Markowitz PF Only]
1

Make a plot selection (or 0 to exit): 

1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets
5:   Add Equal Weights Portfolio
6:   Add Two Asset Frontiers [LongOnly Only]
7:   Add Monte Carlo Portfolios
8:   Add Sharpe Ratio [Markowitz PF Only]
2

Make a plot selection (or 0 to exit): 

1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets
5:   Add Equal Weights Portfolio
6:   Add Two Asset Frontiers [LongOnly Only]
7:   Add Monte Carlo Portfolios
8:   Add Sharpe Ratio [Markowitz PF Only]
3

Make a plot selection (or 0 to exit): 

1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets
5:   Add Equal Weights Portfolio
6:   Add Two Asset Frontiers [LongOnly Only]
7:   Add Monte Carlo Portfolios
8:   Add Sharpe Ratio [Markowitz PF Only]
4

Make a plot selection (or 0 to exit): 

1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets
5:   Add Equal Weights Portfolio
6:   Add Two Asset Frontiers [LongOnly Only]
7:   Add Monte Carlo Portfolios
8:   Add Sharpe Ratio [Markowitz PF Only]
8

Make a plot selection (or 0 to exit): 

1:   Plot Efficient Frontier
2:   Add Minimum Risk Portfolio
3:   Add Tangency Portfolio
4:   Add Risk/Return of Single Assets
5:   Add Equal Weights Portfolio
6:   Add Two Asset Frontiers [LongOnly Only]
7:   Add Monte Carlo Portfolios
8:   Add Sharpe Ratio [Markowitz PF Only]
0

survivors

Title:
 MV Portfolio Frontier 
 Estimator:         covEstimator 
 Solver:            solveRquadprog 
 Optimize:          minRisk 
 Constraints:       
 Portfolio Points:  5 of 49 

Portfolio Weights:
   CDD.AX COH.AX FWD.AX JBH.AX MND.AX MTS.AX QBE.AX RIO.AX SHV.AX TAH.AX TGR.AX WOW.AX WPL.AX
1  0.0000 0.0000 0.9230 0.0000 0.0000 0.0000 0.0770 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
13 0.0000 0.0000 0.2453 0.0000 0.0000 0.1701 0.3050 0.0000 0.0000 0.0000 0.0000 0.0000 0.2796
25 0.0000 0.0000 0.0770 0.0000 0.0000 0.1468 0.1403 0.1334 0.0000 0.0000 0.0589 0.3087 0.1348
37 0.0180 0.1381 0.0000 0.0631 0.0000 0.0780 0.0007 0.1601 0.0122 0.0042 0.1552 0.3704 0.0000
49 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000

Covariance Risk Budgets:
   CDD.AX COH.AX FWD.AX JBH.AX MND.AX MTS.AX QBE.AX RIO.AX SHV.AX TAH.AX TGR.AX WOW.AX WPL.AX
1  0.0000 0.0000 0.9893 0.0000 0.0000 0.0000 0.0107 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000
13 0.0000 0.0000 0.3811 0.0000 0.0000 0.0653 0.3051 0.0000 0.0000 0.0000 0.0000 0.0000 0.2485
25 0.0000 0.0000 0.1314 0.0000 0.0000 0.1366 0.1879 0.1073 0.0000 0.0000 0.0340 0.2324 0.1705
37 0.0180 0.1434 0.0000 0.0650 0.0000 0.0756 0.0006 0.1575 0.0123 0.0043 0.1566 0.3666 0.0000
49 0.0000 1.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000

Target Returns and Risks:
      mean     Cov    CVaR     VaR
1  -0.0053  0.1188  0.3166  0.1496
13 -0.0011  0.0587  0.1491  0.0907
25  0.0030  0.0386  0.0925  0.0639
37  0.0071  0.0327  0.0687  0.0484
49  0.0113  0.0746  0.1790  0.0997

Description:
 Thu Oct 28 12:05:30 2021 by user: JH 
weightsPlot(survivors)

weightedReturnsPlot(survivors)

weightedReturnsLinePlot(survivors)

Isolating Portfolio Weights

Here we isolate the portfolio weights by cluster analysis ‘k-means’ there is only 3 clusters first the two low performance stocks and the 3rd core investments are the 3rd cluster. The other 2 stocks could be left out of the portfolio.

  cluster[cluster == 5]
FWD.AX MND.AX 
     5      5 
LS0tDQp0aXRsZTogIkFTWCBQb3J0Zm9saW8iDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQojIyBJbnN0YWxsIExpYnJhcmllcw0KDQpgYGB7ciwgbWVzc2FnZT1GQUxTRSxlcnJvcj1GQUxTRX0NCmxpYnJhcnkocXVhbnRtb2QpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkoUGVyZm9ybWFuY2VBbmFseXRpY3MpDQpsaWJyYXJ5KGZCYXNpY3MpDQpsaWJyYXJ5KGZQb3J0Zm9saW8pDQoNCmBgYA0KDQojIyBEb3dubG9hZCBTaGFyZSBQcmljZXMgZm9yIFN0dWR5DQoNClRvZGF5IHdlIGFyZSBsb29raW5nIGF0IGEgc3R1ZHkgb2YgU2hhcmUgcHJpY2VzIGZyb20gYSBib29rIGVudGl0bGVkIFRvcCBTdG9ja3Mgb2YgMjAxMS4NCg0KSSByYW5kb21seSBzZWxlY3RlZCAzMCBzdG9ja3MsIGFuZCB0cmFja2VkIHRoZWlyIGZpbmFuY2lhbCBmdW5kYW1lbnRhbHMgZnJvbSAyMDE1IG9ud2FyZHMuDQoNCkhlcmUgSSBmb3JtIGEgcG9ydGZvbGlvIG9mIHRoZSBzdXJ2aXZpbmcgMTMgU2hhcmVzIHdoaWNoIGFyZSBlaXRoZXIgbGlxdWlkIGVub3VnaCBvciBzdGlsbCB0cmFkaW5nLCB0byBiYWNrLWZpdCBhIHBvcnRmb2xpbyByYW5kb21seSB0byBzZWUgaG93IHRoZSBzaGFyZXMgcGVyZm9ybWVkIG92ZXIgMTAgWWVhcnMgb24gdGhlIEF1c3RyYWxpYW4gU3RvY2sgRXhjaGFuZ2UuDQoNClRoZSBzaGFyZXMgYXJlOg0KDQpDREQgPSBDYXJkbm8gTHRkLiBDaXZpbCAmIEluZHVzdHJpYWwgRW5naW5lZXJzDQoNCkNPSCA9IENvY2hsZWFyIEVhciBJbXBsYW50cyBMdGQgQmlvVGVjaA0KDQpGV0QgPSBGbGVldHdvb2QgTHRkIE1vdG9yaG9tZXMsIHBvcnRhYmxlIGFjY29tb2RhdGlvbi4NCg0KSkJIID0gSkIgSGkgRmkgQXVkaW8gLCBWaWRlbyBhbmQgZWxlY3JvbmljcyBSZXRhaWxlci4NCg0KTU5EID0gTW9uYWRlbHBob3VzIEdyb3VwIE1pbmluZyAmIENpdmlsIEVuZ2luZWVyaW5nDQoNCk1UUyA9IE1ldGNhc2ggR3JvY2VyeSBhbmQgSG91c2Vob2xkIGdvb2RzIHJldGFpbGVyIGFuZCB3aG9sZXNhbGVyLg0KDQpRQkUgPSBRdWVlbnNsYW5kIEluc3VyYW5jZSBJbnN1cmFuY2UgYW5kIGRpdmVyc2lmaWVkIGZpbmFuY2UgYW5kIGludmVzdG1lbnRzLg0KDQpSSU8gPSBSaW8gVGludG8gTWluaW5nIE1pbmluZw0KDQpTSFYgPSBTZWxlY3QgSGFydmVzdCBMaW1pdGVkIEFsbW9uZCBncm93ZXIsIEFncmljdWx0dXJlLg0KDQpUQUggPSBUYWJjb3JwIEhvbGRpbmdzIFdhZ2VyaW5nIGFuZCBPbmxpbmUgQmV0dGluZw0KDQpUR1I9IFRhc3NhbCBHcm91cCBTYWxtb24gRmFybWluZyBUYXNtYW5pYQ0KDQpXT1cgPSBXb29sd29ydGhzIEdyb2NlcnksIExpcXVvciwgSG91c2Vob2xkIGdvb2RzIFJldGFpbGVyLCBhbmQgYSBkaXZlcnNpZmllZCBpbnZlc3RtZW50cyBpbnRvIHdhZ2VyaW5nLCBIb3RlbHMsIGFuZCBvdGhlcnMuDQoNCldQTCA9IFdvb2RzaWRlIFBldHJvbGV1bSBPaWwgYW5kIEdhcywgZW5lcmd5IHN1cHBsaWVycy4NCg0KYGBge3J9DQpzeW1ib2xzIDwtIGMoIkNERC5BWCIsIkNPSC5BWCIsIkZXRC5BWCIsIkpCSC5BWCIsIk1ORC5BWCIsIk1UUy5BWCIsIlFCRS5BWCIsIlJJTy5BWCIsIlNIVi5BWCIsIlRBSC5BWCIsIlRHUi5BWCIsIldPVy5BWCIsIldQTC5BWCIpDQoNCg0KcHJpY2VzIDwtDQogIGdldFN5bWJvbHMoc3ltYm9scywNCiAgICAgICAgICAgICBzcmMgPSAneWFob28nLA0KICAgICAgICAgICAgIGZyb20gPSAiMjAxMC0wMS0wMSIsDQogICAgICAgICAgICAgYXV0by5hc3NpZ24gPSBUUlVFLA0KICAgICAgICAgICAgIHdhcm5pbmdzID0gRkFMU0UpICU+JQ0KICBtYXAofkFkKGdldCguKSkpICU+JQ0KICByZWR1Y2UobWVyZ2UpICU+JQ0KICBgY29sbmFtZXM8LWAoc3ltYm9scykNCg0KDQpwcmljZXNfbW9udGhseSA8LSB0by5tb250aGx5KHByaWNlcywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEF0ID0gImxhc3RvZiIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgT0hMQyA9IEZBTFNFKQ0KaGVhZChwcmljZXNfbW9udGhseSwgMykNCmBgYA0KDQojIyBXZSB0aGVuIGVzdGltYXRlIG1vbnRobHkgcmV0dXJucy4NCg0KYGBge3J9DQphc3NldF9yZXR1cm5zX3h0cyA8LQ0KICBSZXR1cm4uY2FsY3VsYXRlKHByaWNlc19tb250aGx5LA0KICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJsb2ciKSAlPiUNCiAgbmEub21pdCgpDQpoZWFkKGFzc2V0X3JldHVybnNfeHRzLCAzKQ0KDQoNCmBgYA0KDQojIyBIZXJlIHdlIGVzdGltYXRlIHRoZSBwb3J0Zm9saW8gd2l0aCBmUG9ydGZvbGlvIGxpYnJhcnkNCg0KdG8gdXNlIGZQb3J0Zm9saW8gRGF0YSBtdXN0IGZpcnN0IGJlIGNvbnZlcnRlZCB0byB0aW1lU2VyaWVzKCkgY29tbWFuZCBmb3JtYXQuDQoNClRoZXBvcnRmb2xpbyBpcyBsb25nIG9ubHkgbm8gc2hvcnQgc3RvY2tzIGFsbG93ZWQgaW4gdGhlIHBvcnRmb2xpby4NCg0KSXQgaXMgYSBtZWFuIHZhcmlhbmNlIHBvcnRmb2xpbywgc2V0IHRvIG1pbmltdW0gdmFyaWFuY2UuDQoNCmBgYHtyfQ0KYXNzZXRfcmV0dXJuc190U2VyaWVzIDwtIGFzLnRpbWVTZXJpZXMoYXNzZXRfcmV0dXJuc194dHMpDQoNCg0Kc3Vydml2b3JzIDwtICBwb3J0Zm9saW9Gcm9udGllcihhc3NldF9yZXR1cm5zX3RTZXJpZXMsIGNvbnN0cmFpbnRzPSJsb25nT25seSIpDQoNCnBsb3Qoc3Vydml2b3JzKQ0Kc3Vydml2b3JzDQoNCg0Kd2VpZ2h0c1Bsb3Qoc3Vydml2b3JzKQ0Kd2VpZ2h0ZWRSZXR1cm5zUGxvdChzdXJ2aXZvcnMpDQp3ZWlnaHRlZFJldHVybnNMaW5lUGxvdChzdXJ2aXZvcnMpDQoNCmBgYA0KDQojIyBJc29sYXRpbmcgUG9ydGZvbGlvIFdlaWdodHMNCg0KSGVyZSB3ZSBpc29sYXRlIHRoZSBwb3J0Zm9saW8gd2VpZ2h0cyBieSBjbHVzdGVyIGFuYWx5c2lzICdrLW1lYW5zJyB0aGVyZSBpcyBvbmx5IDMgY2x1c3RlcnMgZmlyc3QgdGhlIHR3byBsb3cgcGVyZm9ybWFuY2Ugc3RvY2tzIGFuZCB0aGUgM3JkIGNvcmUgaW52ZXN0bWVudHMgYXJlIHRoZSAzcmQgY2x1c3Rlci4gVGhlIG90aGVyIDIgc3RvY2tzIGNvdWxkIGJlIGxlZnQgb3V0IG9mIHRoZSBwb3J0Zm9saW8uDQoNCmBgYHtyfQ0KIHNlbGVjdGlvbiA8LSBhc3NldHNTZWxlY3QoYXNzZXRfcmV0dXJuc190U2VyaWVzLCBtZXRob2QgPSAia21lYW5zIikNCiBjbHVzdGVyIDwtIHNlbGVjdGlvbiRjbHVzdGVyDQogY2x1c3RlcltjbHVzdGVyID09IDFdDQoNCg0KIGNsdXN0ZXJbY2x1c3RlciA9PSAyXQ0KDQogY2x1c3RlcltjbHVzdGVyID09IDNdDQogIGNsdXN0ZXJbY2x1c3RlciA9PSA0XQ0KICBjbHVzdGVyW2NsdXN0ZXIgPT0gNV0NCmBgYA0KDQpgYGB7cn0NCnRhYmxlLkFubnVhbGl6ZWRSZXR1cm5zKGFzc2V0X3JldHVybnNfeHRzKQ0KdGFibGUuQ2FsZW5kYXJSZXR1cm5zKGFzc2V0X3JldHVybnNfeHRzKQ0KYGBgDQo=