5. Our Objectives
Equal Contribution to
•Weight
- Gives the portfolio diversification
•Variance
- Allocates portfolio variance equally across the
portfolio components
•Risk
- Directly diversify downside risk among
components by using ETL contribution
6. Random Portfolio
• Random permutations of weights
• Selected criteria
• High frequency long/short
• Multi-strategy
• Model should be self sustained with decisions confined
by set of constraints
• Assign probabilities to strategies corresponding to
calculated risks in given scenario
8. Application Example
• Total value : $10m
• No. of selected assets for RP=50
• Constraints
Long-only
50 to 60 names
No asset may have more than 4% weight
Industry spread : 10
S&P 500, random portfolio, and previous portfolio will be
benchmark
Duration considered 12 months
Frequency 10
(Relatively low for us, but this is for testing model)
11. Industries Port wt
Consumer
Discretionary 29.56
Consumer Staples 11.26
Energy 7.01
Financials 4.43
Health Care 11.61
Industrials 9.63
Information
Technology 10.57
Materials 11.42
Telecommunications
Services 0
Utilities 4.51
Total 100
Weight Distribution
12. Industries Port ret Bench ret
Consumer
Discretionary 7.33 1.36
Consumer Staples -1.13 4.98
Energy 31.2 30.52
Financials 8.41 7.96
Health Care 27.33 7.8
Industrials 17.3 22.47
Information
Technology 14.26 19.65
Materials 84.71 48.53
Telecommunications
Services 0 0
Utilities 3.92 5.96
Total 20.79 13.64
Cumulative Returns
16. Measure of Portfolio Performance:
•Annualized return
•Annualized standard deviation
•VAR and ES (Expected shortfall)
•Sharp ratio, Omega Ratio, Sortino Ratio
Implementation of R –
Using package PerformanceAnalytics
17. Code to Create Artificial Stocks
• # create the antithetic pair of stocks and publish it into the environment
• # generate sequence of dates
• times <- seq(as.POSIXct(strptime('2011-01-1 16:00:00', '%Y-%m-%d %H:%M:%S')),
• as.POSIXct(strptime('2011-12-1 16:00:00', '%Y-%m-%d %H:%M:%S')),
• by="1 months")
•
• # generate and store dummy price series = 200,100,200,100,200 ...
• prices.xts <- xts(rep(c(200,100),length(times)/2), order.by=as.POSIXct(times))
• stk <- 'STK1'
• colnames(prices.xts) <- paste(stk,'.Adjusted',sep="")
• assign(x=stk, value=prices.xts, envir=global.env )
•
• # generate and store dummy price series = 100,200,100,200,100 ...
• prices.xts <- xts(rep(c(100,200),length(times)/2), order.by=as.POSIXct(times))
• stk <- 'STK2'
• colnames(prices.xts) <- paste(stk,'.Adjusted',sep="")
• assign(x=stk, value=prices.xts, envir=global.env )
•
• # run the strategy and create a plot
• strategy(portfolio= c("STK1","STK2"),threshold=.9,doplot=TRUE,title="Artificial Portfolio Example")
18. Download Option Data from Yahoo Finance
• # Goal: download adjusted price data for selected security, convert to returns, and write to output file
•
• library(tseries)
•
• # Load security data from Yahoo! Finance
• prices1 <- get.hist.quote("SPY", quote="Adj", start="2005-12-25", retclass="zoo")
•
• prices1 <- na.locf(prices1) # Copy last traded price when NA
•
• # To make week end prices:
• nextfri.Date <- function(x) 7 * ceiling(as.numeric(x - 1)/7) + as.Date(1)
• weekly.prices <- aggregate(prices, nextfri.Date,tail,1)
•
• # To convert month end prices:
• monthly.prices <- aggregate(prices1, as.yearmon, tail, 1)
•
• # Convert weekly prices into weekly returns
• r.weekly <- diff(log(weekly.prices)) # convert prices to log returns
• r1.weekly <- exp(r.weekly)-1 # back to simple returns
•
• # Convert monthly prices into monthly returns
• r.monthly <- diff(log(monthly.prices)) # convert prices to log returns
• r1.monthly <- exp(r.monthly)-1 # back to simple returns
•
• # Write output data to csv file
• write.zoo(r1.weekly, file="weekly.csv",sep=",",col.names=c("Dates","Percent Return"))
• write.zoo(r1.monthly, file="monthly.csv",sep=",",col.names=c("Dates","Percent Return"))
19. Code to Generate Random Portfolio
require(PortfolioProbe)
rp100w05 <- random.portfolio(1e4, prices=sp5.close[1,],
gross=1e6, long.only=TRUE, port.size=100,
max.weight=.05)
Then the returns are computed:
sret.rp100w05 <- valuation(rp100w05, prices=sp5.close[c language="(1,1511),"][/c],
returns="simple") lret.rp100w05 <- valuation(rp100w05, prices=sp5.close[c
language="(1,1511),"][/c], returns="log")
20. R code for Adjusting Weight
> pp.bootsim
function (retmat, weight, times=252)
{ dlar <- retmat[sample(nrow(retmat), times,
replace=TRUE),]
pp.porteval(dlar, weight) }
There are two methods of performance measurement in common use: benchmarks and peer groups. Using a benchmark requires a long time (as in decades) to get reasonable statistical power. Using peer groups looks superficially a lot like using random portfolios. Both use a single time period, both compare our fund of interest to a group of alternative portfolios. CVAR: Unlike Value-at-Risk (VaR), CVaR has all the properties a risk measure should have to be coherent and is a convex function of the portfolio weights