library(tidyverse)
## ── Attaching packages ─────────────────────────────────────── tidyverse 1.3.1 ──
## ✓ ggplot2 3.3.5     ✓ purrr   0.3.4
## ✓ tibble  3.1.6     ✓ dplyr   1.0.7
## ✓ tidyr   1.1.4     ✓ stringr 1.4.0
## ✓ readr   2.1.0     ✓ forcats 0.5.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(quadprog)
library(ggplot2)
#Computing Global minimum varience (GMV), We need:  

#1. Create a portfolio
asset.names  <- c("MSFT", "NORD", "SBUX")
mu.vec = c(0.0427 ,  0.0015 ,  0.0285)
names(mu.vec) = asset.names
sigma.mat = matrix(c(0.0100 ,  0.0018 ,  0.0011 ,0.0018 ,  0.0109 ,0.0026 ,0.0011 ,  0.0026 ,  0.0199) ,nrow=3, ncol =3)
dimnames(sigma.mat) = list(asset.names , asset.names)
mu.vec  
##   MSFT   NORD   SBUX 
## 0.0427 0.0015 0.0285
sigma.mat
##        MSFT   NORD   SBUX
## MSFT 0.0100 0.0018 0.0011
## NORD 0.0018 0.0109 0.0026
## SBUX 0.0011 0.0026 0.0199
#2. Calculate the return and varience of a given portfolio
x.vec = rep(1,3)/3
names(x.vec) = asset.names
mu.p.x = crossprod(x.vec ,mu.vec)
sig2.p.x = t(x.vec)%*%sigma.mat%*%x.vec
sig.p.x = sqrt(sig2.p.x)
mu.p.x      #return of the portfolio
##            [,1]
## [1,] 0.02423333
sig.p.x     #varience of the portfolio
##            [,1]
## [1,] 0.07586538

Lagrangian yield

#3. We need to calculate alpha-* through Lagrangian Yield
top.mat = cbind(2*sigma.mat , rep(1, 3))
bot.vec = c(rep(1, 3), 0)
Am.mat = rbind(top.mat , bot.vec)
b.vec = c(rep(0, 3), 1)
z.m.mat = solve(Am.mat)%*%b.vec
m.vec = z.m.mat [1:3 ,1]
m.vec     #this is alpha-*
##      MSFT      NORD      SBUX 
## 0.4411093 0.3656263 0.1932644
mu.gmin = as.numeric(crossprod(m.vec , mu.vec))
mu.gmin
## [1] 0.02489184
#4 Compute the global minimum varience (GMV - sig2.gmin)
sig2.gmin = as.numeric(t(m.vec)%*%sigma.mat%*%m.vec)
sig2.gmin
## [1] 0.005281811