Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
braverock
GitHub Repository: braverock/portfolioanalytics
Path: blob/master/sandbox/leverage_example.R
1433 views
1
2
# Examples demonstrating the difference of specifying a leverage constraint
3
# using max_sum compared to leverage_exposure.
4
5
library(PortfolioAnalytics)
6
7
data(edhec)
8
R <- edhec
9
funds <- colnames(R)
10
11
# Set up an initial portfolio object with basic constraints
12
init.portf <- portfolio.spec(assets=funds)
13
14
# Add an objective to maximize mean return per unit expected shortfall
15
init.portf <- add.objective(portfolio=init.portf, type="return", name="mean")
16
17
# dollar neutral portfolio
18
dollar.neutral.portf <- init.portf
19
dollar.neutral.portf <- add.constraint(portfolio=dollar.neutral.portf,
20
type="weight_sum",
21
min_sum=-0.01, max_sum=0.01)
22
dollar.neutral.portf <- add.constraint(portfolio=dollar.neutral.portf,
23
type="box", min=-0.5, max=0.5)
24
25
# Here is a dollar neutral portfolio with no constraint on leverage
26
opt1 <- optimize.portfolio(R=R, portfolio=dollar.neutral.portf,
27
optimize_method="DEoptim", search_size=2000,
28
trace=TRUE)
29
sum(opt1$weights)
30
31
# Total portfolio leverage is actually greater than 4
32
sum(abs(opt1$weights))
33
34
# now add the leverage exposure constraint for 2:1 leverage
35
dollar.neutral.portf <- add.constraint(portfolio=dollar.neutral.portf,
36
type="leverage_exposure", leverage=2)
37
# Run optimization
38
opt2 <- optimize.portfolio(R=R, portfolio=dollar.neutral.portf,
39
optimize_method="DEoptim",
40
search_size=2000)
41
sum(opt2$weights)
42
sum(abs(opt2$weights))
43
44
# Leveraged portfolio
45
leveraged.portf <- init.portf
46
47
# Add a "leverage" constraint using max_sum
48
leveraged.portf <- add.constraint(portfolio=leveraged.portf,
49
type="leverage",
50
min_sum=1.29, max_sum=1.31)
51
leveraged.portf <- add.constraint(portfolio=leveraged.portf,
52
type="box", min=-0.3, max=0.6)
53
54
opt3 <- optimize.portfolio(R=R, portfolio=leveraged.portf,
55
optimize_method="DEoptim",
56
search_size=2000)
57
sum(opt3$weights)
58
59
# total portfolio leverage is approximately 3.9
60
sum(abs(opt3$weights))
61
62
# add a leverage exposure constraint
63
leveraged.portf <- add.constraint(portfolio=leveraged.portf,
64
type="leverage_exposure", leverage=1.5)
65
66
# change min_sum and max_sum such that the weights sum to 1
67
leveraged.portf$constraints[[1]]$min_sum <- 0.99
68
leveraged.portf$constraints[[1]]$max_sum <- 1.01
69
70
# Run optimization
71
opt4 <- optimize.portfolio(R=R, portfolio=leveraged.portf,
72
optimize_method="DEoptim",
73
search_size=2000)
74
sum(opt4$weights)
75
# total portfolio leverage is less than 1.5
76
sum(abs(opt4$weights))
77
78
79