Reklama
|
Statystyka, prognozowanie, ekonometria, data mining
Forum miłośników statystyki - Portal Statystyczny
|
Ogłoszenie |
FORUM STATYSTYCZNE MA JUŻ 10 LAT
Znasz statystykę lub ekonometrię, metody prognozowania, data mining i chcesz pomóc w rozwoju forum statystycznego ?
Pisz na: administrator(małpa)statystycy.pl
Rozpoczął swoją działalność portal statystyczny - masz pomysł na jego rozwój ?
Drogi forumowiczu! Zanim napiszesz posta zapoznaj się z regulaminem forum i
przedstaw się
|
[R] fPortfolio, lpSolve Optymalizacja portfela inwestycyjneg |
Autor |
Wiadomość |
qni
Szeregowy

Posty: 1 Skąd: Kraków
|
Wysłany: 2018-02-22, 22:18 [R] fPortfolio, lpSolve Optymalizacja portfela inwestycyjneg
|
|
|
Witam serdecznie.
Ze statystyką mam mało wspólnego tym bardziej z R, ale rzuciłem się z motyką na słońce i postawiłem sobie cel wyliczenie optymalnego portfela TFI.
Mój plan na rozwiązanie tego problemu jest prosty:
a) Pobrać notowanie TFI - zrobione
b) Wykres portfeli - zrobione
c) Portfel z minimalnym ryzykiem - zrobione
d) Portfel na podstawie Sharpae - zrobione
e) Portfel o danym poziomie ryzyka, max zwrocie
f) Portfel o max zwrocie
Portfel o danym poziomie ryzyka nie wydawał się czym trudnym i udało się nawet go wyliczyć. Problem polega na tym, że wagi aktywów są ujemne, opcja sprzedaży krótka, której ja się posiadam.
Bardzo proszę o pomoc w zbudowanie portfela o danym poziomie ryzyka. Ja już nie mam pomysłu co trzeba zrobić.
Poniżej wklejam skrypt, bardzo proszę o wszelkie uwagi.
Dzięki z góry
Skrypt pobierający dane:
Kod: |
library(RCurl)
library(dplyr)
library(xts)
library(quantmod)
library(timeSeries)
getStooqData <- function(asset_code,static_cookie=TRUE) {
data_tmp <- tempfile() # "data.csv"
cookie_tmp <- "cookie.txt"
u1 <- paste("https://stooq.pl/q/d/?s=",asset_code,"&i=d",sep="")
u2 <- paste("https://stooq.pl/q/d/l/?s=",asset_code,"&i=d&",sep="")
if (!static_cookie) {
h <- c(paste("GET ",u1," HTTP/1.0",sep=""),
Accept="image/gif",
Accept="image/x-xbitmap",
Accept="image/jpeg",
Accept="mage/pjpeg",
Accept="application/x-shockwave-flash",
Accept="application/vnd.ms-excel",
Accept="application/msword",
Accept="*/*",
'Accept-Language'="pl, en-us;q=0.7",
'User-Agent'="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)",
'Proxy-Connection'="Keep-Alive"
)
u1Opts <- curlOptions(header=TRUE,
httpheader=h,
cookiejar=cookie_tmp
)
curlPerform(url=u1,.opts=u1Opts,verbose=TRUE)
h <- c(paste("GET",u2,"HTTP/1.0"),
Accept="image/gif",
Accept="image/x-xbitmap",
Accept="image/jpeg",
Accept="mage/pjpeg",
Accept="application/x-shockwave-flash",
Accept="application/vnd.ms-excel",
Accept="application/msword",
Accept="*/*",
'Accept-Language'="pl, en-us;q=0.7",
'User-Agent'="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)",
'Proxy-Connection'="Keep-Alive"
)
u2Opts <- curlOptions(header=TRUE,
httpheader=h,
cookiefile=cookie_tmp
)
}
else {
h <- c(paste("GET",u2,"HTTP/1.0"),
Accept="image/gif",
Accept="image/x-xbitmap",
Accept="image/jpeg",
Accept="mage/pjpeg",
Accept="application/x-shockwave-flash",
Accept="application/vnd.ms-excel",
Accept="application/msword",
Accept="*/*",
'Accept-Language'="pl, en-us;q=0.7",
'User-Agent'="Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)",
'Proxy-Connection'="Keep-Alive",
Cookie=paste("cookie_uu=p;cookie_user=%3F0001dllg000011500d1300%7C",asset_code,sep="")
)
u2Opts <- curlOptions(header=TRUE,
httpheader=h
)
}
reader <- basicTextGatherer()
w <- getURLContent(url=u2,.opts=u2Opts)
write(w,file=data_tmp)
stooq_data <- read.csv(data_tmp)
stooq_data
}
# Pobranie notowan TFI w formie csv
N_2781 <- select(getStooqData("2781.N", static_cookie=TRUE), Data, Zamkniecie)
N_2802 <- select(getStooqData("2802.N", static_cookie=TRUE), Data, Zamkniecie)
N_2833 <- select(getStooqData("2833.N", static_cookie=TRUE), Data, Zamkniecie)
N_2842 <- select(getStooqData("2842.N", static_cookie=TRUE), Data, Zamkniecie)
N_2790 <- select(getStooqData("2790.N", static_cookie=TRUE), Data, Zamkniecie)
N_2808 <- select(getStooqData("2808.N", static_cookie=TRUE), Data, Zamkniecie)
N_2812 <- select(getStooqData("2812.N", static_cookie=TRUE), Data, Zamkniecie)
N_2816 <- select(getStooqData("2816.N", static_cookie=TRUE), Data, Zamkniecie)
N_2820 <- select(getStooqData("2820.N", static_cookie=TRUE), Data, Zamkniecie)
N_2824 <- select(getStooqData("2824.N", static_cookie=TRUE), Data, Zamkniecie)
N_2828 <- select(getStooqData("2828.N", static_cookie=TRUE), Data, Zamkniecie)
N_2785 <- select(getStooqData("2785.N", static_cookie=TRUE), Data, Zamkniecie)
N_2743 <- select(getStooqData("2743.N", static_cookie=TRUE), Data, Zamkniecie)
N_2747 <- select(getStooqData("2747.N", static_cookie=TRUE), Data, Zamkniecie)
N_2752 <- select(getStooqData("2752.N", static_cookie=TRUE), Data, Zamkniecie)
N_2757 <- select(getStooqData("2757.N", static_cookie=TRUE), Data, Zamkniecie)
N_2764 <- select(getStooqData("2764.N", static_cookie=TRUE), Data, Zamkniecie)
N_2768 <- select(getStooqData("2768.N", static_cookie=TRUE), Data, Zamkniecie)
N_2772 <- select(getStooqData("2772.N", static_cookie=TRUE), Data, Zamkniecie)
N_2776 <- select(getStooqData("2776.N", static_cookie=TRUE), Data, Zamkniecie)
N_2795 <- select(getStooqData("2795.N", static_cookie=TRUE), Data, Zamkniecie)
NN_2781 = xts(N_2781$Zamkniecie, order.by=as.Date(N_2781$Data, format="%Y-%m-%d"))
NN_2802 = xts(N_2802$Zamkniecie, order.by=as.Date(N_2802$Data, format="%Y-%m-%d"))
NN_2833 = xts(N_2833$Zamkniecie, order.by=as.Date(N_2833$Data, format="%Y-%m-%d"))
NN_2842 = xts(N_2842$Zamkniecie, order.by=as.Date(N_2842$Data, format="%Y-%m-%d"))
NN_2790 = xts(N_2790$Zamkniecie, order.by=as.Date(N_2790$Data, format="%Y-%m-%d"))
NN_2808 = xts(N_2808$Zamkniecie, order.by=as.Date(N_2808$Data, format="%Y-%m-%d"))
NN_2812 = xts(N_2812$Zamkniecie, order.by=as.Date(N_2812$Data, format="%Y-%m-%d"))
NN_2816 = xts(N_2816$Zamkniecie, order.by=as.Date(N_2816$Data, format="%Y-%m-%d"))
NN_2820 = xts(N_2820$Zamkniecie, order.by=as.Date(N_2820$Data, format="%Y-%m-%d"))
NN_2824 = xts(N_2824$Zamkniecie, order.by=as.Date(N_2824$Data, format="%Y-%m-%d"))
NN_2828 = xts(N_2828$Zamkniecie, order.by=as.Date(N_2828$Data, format="%Y-%m-%d"))
NN_2785 = xts(N_2785$Zamkniecie, order.by=as.Date(N_2785$Data, format="%Y-%m-%d"))
NN_2743 = xts(N_2743$Zamkniecie, order.by=as.Date(N_2743$Data, format="%Y-%m-%d"))
NN_2747 = xts(N_2747$Zamkniecie, order.by=as.Date(N_2747$Data, format="%Y-%m-%d"))
NN_2752 = xts(N_2752$Zamkniecie, order.by=as.Date(N_2752$Data, format="%Y-%m-%d"))
NN_2757 = xts(N_2757$Zamkniecie, order.by=as.Date(N_2757$Data, format="%Y-%m-%d"))
NN_2764 = xts(N_2764$Zamkniecie, order.by=as.Date(N_2764$Data, format="%Y-%m-%d"))
NN_2768 = xts(N_2768$Zamkniecie, order.by=as.Date(N_2768$Data, format="%Y-%m-%d"))
NN_2772 = xts(N_2772$Zamkniecie, order.by=as.Date(N_2772$Data, format="%Y-%m-%d"))
NN_2776 = xts(N_2776$Zamkniecie, order.by=as.Date(N_2776$Data, format="%Y-%m-%d"))
NN_2795 = xts(N_2795$Zamkniecie, order.by=as.Date(N_2795$Data, format="%Y-%m-%d"))
#połacznie wszytskich plików w jeden
portfolioPrices <- merge(NN_2781,
NN_2802,
NN_2833,
NN_2842,
NN_2790,
NN_2808,
NN_2812,
NN_2816,
NN_2820,
NN_2824,
NN_2828,
NN_2785,
NN_2743,
NN_2747,
NN_2752,
NN_2757,
NN_2764,
NN_2768,
NN_2772,
NN_2776,
NN_2795
)
names(portfolioPrices) <- c("Akcji",
"Obligacji",
"Stabil_Wzrostu",
"Zrownowazony",
"Gotowkowy",
"Perspek_20",
"Perspek_25",
"Perspek_30",
"Perspek_35",
"Perspek_40",
"Perspek_45",
"Akcji_Srod",
"Eu_Spol_Dywid",
"Glob_Korp",
"Glob_Spol_Dywid",
"Japonia",
"Obli_Ryn_Wsch_Walu",
"Spol_Dywid_Ryn_Wsch",
"Spol_Dywid_USA",
"Stab_Glob_Aloka",
"Lokacyjny_Plus"
)
#Dzeinny zwrot
portfolioPrices <- portfolioPrices[apply(portfolioPrices,1,function(x) all(!is.na(x))),]
portfolioReturns <- na.omit(ROC(portfolioPrices, type="discrete"))
tfi_Ret <- as.timeSeries(portfolioReturns)
write.table(tfi_Ret, file = "tfi_Ret.csv",row.names=TRUE, na="",col.names=TRUE, sep=";", dec=",")
dim(portfolioPrices)
|
Skrypt liczący optymalny portfel TFI
Kod: |
library(fPortfolio)
library(lpSolve)
tfiReturn <- read.csv(file = "tfi_Ret.csv", sep=";", dec=",")
tfiReturn <- as.timeSeries(tfiReturn)
tfiReturn <- portfolioData(tfiReturn, spec = portfolioSpec())
# specyfikacja
Spec = portfolioSpec()
setNFrontierPoints(Spec) = 100
Constraints <- "LongOnly";
#portfolio Frontier: Funkcja portfolioFrontieroblicza całą efektywną granicę.
granica <- portfolioFrontier(tfiReturn, Spec, Constraints)
tailoredFrontierPlot(object = granica,
return = c("mean", "mu"),
risk = c("Cov", "Sigma", "CVaR", "VaR"),
xlim=c(-0.0,0.012),
ylim=c(0,0.0004),
twoAssets = FALSE,
sharpeRatio = TRUE,
title = FALSE
)
title("Granica portfela TFI")
#Minimalny portfel wariancji: funkcja minvariancePortfolio zwraca portfel z minimalnym ryzykiem efektywnej granicy.
#Aby znaleźć minimalny punkt ryzyka, ryzyko docelowe zwrócone przez funkcję efficientPortfolio jest zminimalizowana.
miniRisk <-minvariancePortfolio(tfiReturn, Spec, Constraints)
weightsPie(miniRisk, title = FALSE)
title("Portfel z najmniejszym ryzykiem inwestycyjnym")
miniRiska <-getTargetRisk(miniRisk)
miniRiska
miniRiskP <- frontierPoints(miniRisk) # get risk and return values for points on the efficient frontier
miniRiskPoints <- data.frame(targetRisk=miniRiskP[, "targetRisk"] * sqrt(252), targetReturn=miniRiskP[,"targetReturn"] * 252)
#Funkcja tangencyPortfolio zwraca portfel z najwyższym współczynnikiem zwrotu / ryzyka na efektywnej granicy.
#Dla portfela Markowitza jest to to samo co stosunek Sharpae.
Sharpae <-tangencyPortfolio(tfiReturn, Spec, Constraints)
weightsPie(Sharpae)
title("Portfel zbudowany na podstawie Sharpae")
sharpaeRisk <-getTargetRisk(Sharpae)
sharpaeRisk
sharpaeRiskP <- frontierPoints(Sharpae) # get risk and return values for points on the efficient frontier
sharpaeRiskPoints <- data.frame(targetRisk=sharpaeRiskP[, "targetRisk"] * sqrt(252), targetReturn=sharpaeRiskP[,"targetReturn"] * 252)
# Portfel o minimalnym ryzyku o danej oczekiwanej stopie zwrotu
SpecReturn = portfolioSpec()
setTargetRisk(SpecReturn) = 0.05
setSolver(SpecReturn)= "solveRshortExact"
Constraints = "minW[1:21]=0.01"
portfolioReturn<-efficientPortfolio(tfiReturn, SpecReturn, Constraints )
portfolioReturn
portfolioReturnP <- frontierPoints(portfolioReturn) # get risk and return values for points on the efficient frontier
portfolioReturnPPoints <- data.frame(targetRisk=portfolioReturnP[, "targetRisk"] * sqrt(252), targetReturn=portfolioReturnP[,"targetReturn"] * 252)
miniRiskPoints *100
sharpaeRiskPoints *100
portfolioReturnPPoints *100
|
|
|
|
|
 |
Google
|
Wysłany: Reklama google.
|
|
|
|
|
|
|
|
Nie możesz pisać nowych tematów Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach Nie możesz załączać plików na tym forum Możesz ściągać załączniki na tym forum
|
Dodaj temat do Ulubionych zakładek(IE) Wersja do druku
|
| Strona wygenerowana w 0,14 sekundy. Zapytań do SQL: 12 |
|
|