Predavanje 21

FlipView[{Text[Style[" Branko Urošević, imqfbrankourosevic@gmail.com ",20,"Text",Italic]],Text[Style[" Faculty of Economics, University of Belgrade, NBS and CESIfo Munich",20,"Text", Italic]]}]

Portfolio optimizacija u WL

1. Pripremne radnje

Početna razmatranja

Ideja portfolio optimizacije je sledeća. Investitori žele da imaju što veću očekivanu zaradu po jedinici uloženog novca (to jest, što veći očekivani prinos) a da pri tome preuzmu što manji rizik. Rizik se najčešće meri kao stadardna devijacija prinosa.

Ako očekujemo veći prinos morati da preuzmemo i veći rizik. Cilj je da to radimo optimalno, to jest da za zadati nivo rizika ostvarimo što veći očekivani prinos ili, ekvivalentno, da za zadati očekivani prinos preuzmemo što manji rizik.

Prinos merimo kao kapitalnu dobit. Naime, ukoliko je vrednost naše početne investicije bila p0 evra a sada  vredi p1 evra, prinos bi bio (dividende su uključene u cene, radi jednostavnosti):

(((p1-p0))/p0)

Podaci o cenama akcija mogu se dobiti direktno u WL preko FinancialData funkcije. Evo kako možemo da dobijemo podatke o ceni akcije General Electric (tiker simbol “GE”) za period od 10. do 15. marta 2005.

proba=FinancialData["GE",{{2005,3,10},{2005,3,15}}]

Za svaki dan podatak se sastoji liste koja odgovara godini, mesecu i dan i, drugo, od cene GE akcije na kraju tog dana (to je po defoltu, a možemo dobiti puno raznih drugih podataka).

Konstrukcija vremenskih serija

U svim primerima u ovom predavanju radimo sa podacima o cenama 4 akcije sa američkog tržišta, indeksa SP500 koji služi kao proxy za tržišni portfolio i, u vežbama, sa prinosima na nerizičnu aktivu. Prva stvar koju želimo da naučimo jeste kako da osnovu podataka sadržanih u fajlu podaci20.xlsx, Sheet 1, konstruišemo vremensku seriju za svaku pojedinačnu akciju, kao i za SP500. Prvo učitajmo podatke

podaci=Import["C:\\Users\\Prof Branko Urosevic\\Dropbox\\Branko Urosevic\\operaciona2\\downloads\\podaci21.xlsx"][[1]];Take[podaci,10]//Grid

Vidimo, dakle, da je u prvoj koloni datum, u 2-6 koloni su cene na hartije čije vremenske serije želimo da konstruišemo. Naizad, u poslednjoj koloni su prinosi na nerizičnu aktivu. Pretpostavimo da želimo da konstruišemo vremensku seriju za akcije Amazona. U tom slučaju, potrebno je da uzmemo podatke iz kolona 1 i 2 (bez naslovnog reda), i iz njih napravimo parove.

Module[{beznaslova=Rest[podaci]},{beznaslova[[All,1]],beznaslova[[All,2]]}\[Transpose]]

U svakom paru, prvi element je datum a drugi je podatak o ceni. Iz parova lako pravimo TimeSeries objekat:

Module[{beznaslova=Rest[podaci]},TimeSeries[{beznaslova[[All,1]],beznaslova[[All,2]]}\[Transpose]]]

Najzad, možemo da napravimo više vremenskih serija odjednom

{amzn,msft,ibm, aapl,sp500}=Table[Module[{beznaslova=Rest[podaci]},TimeSeries[{beznaslova[[All,1]],beznaslova[[All,n]]}\[Transpose]]],{n,2,6}]

Pretpostavimo da nas zanimaju samo vrednosti cena akcije Amazona (bez datuma). Možemo ih dobiti iz vremenske serije amzn pomoću

amzn["Values"]

To važi, naravno, i za bilo koju drugu vremensku seriju.

Poređenje performanse pojedinačnih hartija i SP500 indeksa

Sa vremenskim serijama, dok god se odnose na iste datume, možemo da radimo sve aritmetičke operacije. Ukoliko želimo da uporedimo performansu pojedinačnih akcija u odnosu tržišni indeks, korisno je normalizovati svaku seriju u odnosu na vremensku seriju tog indeksa. Na primer, ukoliko želimo da uporedimo da je u relativnom smislu Apple rasta ili opadao u odnosu na tržišni portfolio, sve što treba da uradimo jeste da podelimo aapl/sp500. Tako dobijamo vremensku seriju relativnih cena Apple u odnosu na SP500. To možemo da predstavimo grafički tako što koristimo DateListPlot. Ta funkcije je veoma slična ListLinePlot, ali na x osi ima datume.

DateListPlot[{amzn,msft,ibm, aapl}/sp500,PlotTheme->"Detailed",PlotLegends->{"amzn/sp500","msft/sp500","ibm/sp500","aapl/sp500"}]

Vidimo sa slike da su, u odnosu na tržište, cene Microsoftove akcije i Apple prošle nešto bolje u periodu 2013-2014, dok su cene IBM i Amazona imale performansu goru nego tržište u celini.

Drugi način za poređenje performansi: serija kumulativnih prinosa

Drugi način da upoređujemo performanu bio bi da napravimo vremensku seriju relativnih cena u odnosu na početnu cenu za svaku hartiju. To bi imalo efekat da svaka serija počinje od 1. Ta serija naziva se serija kumulativnih prinosa i kasnije ćemo videti još jedan način da je izračunamo. Na primer, u slučaju sp500

sp500/sp500["Values"][[1]]

Izračujmo to sada za svih 5 vremenski serija istovremeno

kumulativno=((#)/(#["Values"][[1]]))&/@{amzn,msft,ibm, aapl,sp500}

Sve ove serije sada možemo direktno uporediti

DateListPlot[kumulativno,PlotTheme->"Detailed",PlotLegends->{"amzn","msft","ibm","aapl","sp500"}]

Dnevni prinosi i njihova raspodela

Pretpostavimo da imamo neku vremensku seriju cena akcija

{p1,p2,p3,p4,p5}

Kako da izračunamo proste prinose?

((Differences[{p1,p2,p3,p4,p5}])/(Most[{p1,p2,p3,p4,p5}]))

Na osnovu toga možemo da napišemo funkciju koja računa prinose:

prostprinos[serija_]:=((Differences[serija])/(Most[serija]))

Dnevni prinosi i njihova raspodela

Razmotrimo sada dnevne prinose na četiri akcije i tržišni portfolio. Prvo napravimo varijable za dnevne prinose

ToExpression[StringJoin["dnevniprinos",#]&/@{"amzn","msft","ibm","aapl","sp500"}]

a onda svakoj uparimo odgovarajuće prinose

{dnevniprinosamzn,dnevniprinosmsft,dnevniprinosibm,dnevniprinosaapl,dnevniprinossp500}=prostprinos[#["Values"]]&/@{amzn,msft,ibm, aapl,sp500};

Pogledajmo sada histograme

GraphicsGrid[{{Histogram[dnevniprinosamzn,PlotLabel->"AMZN dnevni prinosi"],Histogram[dnevniprinosmsft,PlotLabel->"MSFT dnevni prinosi"],Histogram[dnevniprinosibm,PlotLabel->"IBM dnevni prinosi"]},{Histogram[dnevniprinosaapl,PlotLabel->"AAPL dnevni prinosi"],Histogram[dnevniprinossp500,PlotLabel->"SP500 dnevni prinosi"],}},ImageSize->600]

Vidimo da se raspodele dosta vizualno razliku. Prinose na svih 5 hartija ćemo sačuvati na Sheetu 2 u podaci20.xlsx, zajedno sa odgovarajućim datumima i prinosima na nerizičnu aktivu.

Dnevni prinosi na prve tri akcije

Pošto na ispitu nećete imati pristup internetu, podatke o akcijama i prinosima imaćemo u download formi (najčešće Excel). Unesimo, stoga, podatke o prinosima na akcije koje smo prethodno razmatrali. One se nalaze u podaci21.xlsx, Sheet 2.

podaciOprinosima=Import["C:\\Users\\Prof Branko Urosevic\\Dropbox\\Branko Urosevic\\operaciona2\\downloads\\podaci21.xlsx"][[2]];Take[podaciOprinosima,10]//Grid

Iz pedagoških razloga, razmotrimo za početak samo prinose na prve 3 akcije, AMZN, MSFT, i IBM.

prinosi3=Rest[podaciOprinosima][[All,2;;4]];

Podatke ćemo podeliti na podatke za modelovanje (prinos3model) i podatke za testiranje performansi različitih portfolija (prinosi3test). Podatke za modelovanje ćemo koristiti za optimizaciju portfolija. Oni će se sastojati od privh 300 prinosa. Ostatak će biti prinositest.

prinosi3model=Take[prinosi3,300];

Očekivani prinos i standardna devijacija na dnevnom novu je

Mean[prinosi3model]

StandardDeviation[prinosi3model]

Na dnevnom nivou možemo izračunati, takođe, i matricu kovarijansi i matricu korelacija

Covariance[prinosi3model]

Correlation[prinosi3model]//MatrixForm

Investitori tipično ne rade portfolio analizu za jedan dan unapred, nego na godinu dana unapred

Stoga, njih zanimaju anualizovane (to jest prevedene na godinu dana) očekivani prinos i matrica kovarijanse. To se dobija tako što se dnevni očekivani prinosi i dnevna matrica kovarijanse pomnoži sa brojem dana trgovanja a to je, u proseku, 252.

ocekivaniPrinosAkcija=252Mean[prinosi3model]

matricaKovarijanse=252Covariance[prinosi3model];

Vidimo da je anualizovani prinos na AMZN  veći nego na ostale hartije. Da li je veći i rizik na godišnjem nivou?

stdevGodisnja=(Sqrt[252])StandardDeviation[prinosi3model]

Zaista, rizik je takođe veći za Amazon u odnosu ostale dve akcije.

2. Pripremna portfolio analiza sa tri akcije

Od očekivanog prinosa na pojedinačne hartije do očekivanog prinosa na portfolio

Pretpostavimo da smo u svaku od 3 hartije uložili neki procenat svog novca. Ponderi su w1, w2, i w3, respektivno. Pošto su prinosi slučajne promenljive, r1, r2, i r3, prinos na portfolio je slučajna veličina - ponderisana suma prinosa:

rp =w1 r1 + w2 r2 + w3 r3

Na osnovu linearnosti očekivane vrednosti, očekivani prinos portfolia sa 3 akcije je:

E[rp] = w1 E[r1] + w2 E[r2] + w3 E[r3] =Dot[ {w1, w2, w3},{E[r1] , E[r2] , E[r3] }]

Evo kako bi za naše akcije izgledali neki mogući vektori pondera. Prvi odgovara tome da sav novac stavimo u AMZN, drugi da sav novac stavimo u IBM a treći da ravnomerno podelimo pare na 3 akcije.

wsveuAMZN={1,0,0};wsveuMSFT={0,1,0};wpodjednako={1/3,1/3,1/3};

Sada izračunajmo očekivane prinose za ta tri portfolia. Za to treba samo da pomnožimo skalarno vektor pondera sa vektorom ocekivanih prinosa (setimo se da je x.y isto što i Dot[x,y]):

Dot[ocekivaniPrinosAkcija,#]&/@{wsveuAMZN,wsveuMSFT,wpodjednako}

Kako od matrice kovarijanse dobiti portfolio varijansu odnosno rizik portfolia?

Od ova tri portfolia, najveći očekivani prinos ostvarili ako investiramo sav novac u MSFT (bar u tom periodu vremena). Ali, imamo osećaj da bi možda takav portfolio bio i najrizičniji. Da bismo to proverili to, treba da naučimo kako da odredimo varijansu portfolia za zadati ponder ulaganja.

Po definiciji, varijansa portfolia je E[(rp - ((E(rp)))^2)]. Ona zavisi SAMO od matrice kovarijanse i od pondera našeg ulaganja. Ako je matrica kovarijanse Σ a vektor pondera w, onda imamo da je varijansa portfolia

varijansaPortfolia= w.Σ.w

Primetimo da je w.Σ.w isto što i Dot[w,Σ,w]. Varijansa portfolia je kvadratna forma po w, čija je matrica-matrica kovarijansi Σ. Sada možemo da proverimo kolike su varijanse naša tri portfolia:

Dot[#,matricaKovarijanse,#]&/@{wsveuAMZN,wsveuMSFT,wpodjednako}

Odgovarajuće standardne devijacije ovih portfolia bi bile

Sqrt[%]

Dakle, ulaganje isključivo u akcije AMZN je potencijalno najprofitabilnije, ali je, istovremeno, i najrizičnije. Pitanje: u koji portfolio bi bilo najpametnije uložiti? Odgovor zavisi od toga koliki prinos očekujemo, odnosno kakav rizik smo spremni da prihvatimo. Ono što je dobro jeste da postoji metod kako da optimalno biramo portfolio. Naime, cilj će nam biti da za svaki zadati očekivani prinos na portfolio nađemo takav njegov sastav koji će imati minimalni rizik. To je čuveni Markowitz-ev problem portfolio izbora.

3. Portfolio optimizacija sa 3 hartije

Optimizacioni problem ukoliko želimo da dobijemo portfolio sa najmanjim mogućim rizikom

U tom slučaju minimiziramo varijansu. Pretpostavimo da je vektor pondera W3 definisan ovako:

W3={w1,w2,w3};

Očekivani prinos i varijansa portfolia zavise od izbora pondera W3:

ocekivaniPrinosPortfolia=W3.ocekivaniPrinosAkcija

varijansaPortfolia=W3.matricaKovarijanse.W3//Expand

Primetimo da ova kvadratna forma ima dijagonalne i nedijagonalne članove. Ona je pozitivno definitna. Da proverimo:

PositiveDefiniteMatrixQ[matricaKovarijanse]

Prilikom investiranja, mora biti zadovoljen uslov da je suma svih pondera jednaka 1. To je stoga što moramo negde da parkiramo lovu!

w1+w2+w3==1

Nastavak

Ovaj problem je konveksan problem minimizacije za koji postoji globalni minimum. Rešenje možemo dobiti na sledeći način (u našem udžbeniku za Operaciona istraživanja, glava 9, imate detaljno analizično razmatranje obog rešenja):

MVPportfolio=NMinimize[{varijansaPortfolia,w1+w2+w3==1},W3]

Prvi broj je vrednost minimuma varijanse. Da bismo takav minimalan (ex-ante) rizik ostvarili treba da stavimo najmanje novca u AMZN a najviše u IBM.  Ovo je Minimum Variance Portfolio ili MVP. Od njega nema portfolia sa manjim ex-ante rizikom dok god investiramo samo u te 3 akcije. Njegov оčekivani prinos (na godišnjem nivou je:

ocekivaniMVP=ocekivaniPrinosPortfolia/.Last[MVPportfolio]

Optimizacioni problem ukoliko imamo određeni cilj u vezi očekivanog prinosa

U prethodnom slučaju smo ignorisali informaciju o očekivanom prinosu portfolija prilikom optimizacije pošto nas je zanimao samo rizik. Hajde da sad vidimo kako da napravimo portoflio koji bi minimizovao rizik (varijansu) ali pod uslovom da ostvarimo prinos od, recimo 10 posto godišnje. Kako bismo tada investirali? Da bismo postavili problem moramo da dodamo uslov da je očekivani prinos portfolia jednak 10 posto.

ocekivaniPrinosPortfolia==0.1

Stoga imamo da je koji treba da rešimo sledeći:

NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==0.1},W3]

Vidimo da bi u ovom slučaju rizik bio nešto veći nego kada ignorišemo prinos potpuno.  Razmotrimo sada portfolio u kome bismo očekivali da ostvarimo 20 posto godišnje:

NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==0.20},W3]

A šta bi bilo da imamo cilj od 40 posto prinosa godišnje?

NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==0.4},W3]

U tom slučaju, morali bismo IBM da prodamo bez pokrića (short sale) da bismo imali više para da kupimo druge dve, ex ante unosnije, akcije.

Ograničenje na prodaju bez pokrića

Neki regulatori (kao u Srbiji na primer), ne dozvoljavaju prodaju bez pokrića. Kako bi se izmenio optimalni portfolio ukoliko dodamo tako ograničenje. Ono glasi:

pozitivni=And@@Through[0≤ W3≤1];

NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==0.4,pozitivni},W3]

U tom slučaju ne bi postojalo rešenje problema! Međutim, ukoliko bi se ograničili na 32 posto prinosa, to bi bilo izvodljivo

NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==0.32,pozitivni},W3]

U tom slučaju, međutim, investirali bismo samo u prve dve hartije. U poslednju ne bismo stavili ništa pošto bismo zapravo nju voleli da prodamo bez pokrića (ali ne smemo). Vidimo da je zabrana prodaja bez pokrića, uvedena od strane regulatora kako bi se štitili investitori, potencijalno opasna upravo za investitore jer vodi ka manje diverzifikovanim to jest rizičnijim portfolijima.

Efikasna granica portfolio investiranja u 3 akcije

Efikasna granica jeste zavisnost optimalnog očekivanog prinosa od optimalnog rizika (standardne devijacije) portfolio (to jest μ(σ)). Da bismo je konstruisali, moramo da razmotrimo opšti slučaj kada investitor zadaje prinos μ, i da onda probleem rešimo za veliki broj μ, kako bismo dobili parametarsku zavisnost optimalnog očekivanog prinosa μ, od optimalnog rizika σ(μ).

ocekivaniPrinosPortfolia==μ

NMinimize ne može da reši problem u opštim brojevima za proizvoljno μ, ali može za seriju različitih vrednosti μ koju dobijamo tabelarno. Ovde rešavamo problem za očekivane prinose od 1,2,3, ..., 40 posto. Sve ostalo je isto kao ranije.

rezultatioptimizacije3=Table[NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==μ},W3],{μ,0.01,0.4,0.01}]

Primetimo da su optimalne vrednosti varijanse date u prvoj koloni ovog izraza:

rezultatioptimizacije3[[All,1]]

Sada ćemo sastaviti listu parova gde je prvi broj optimalna vrednost standardne devijacije (koren iz optimalne varijanse) a drugi broj je odgovarajući zahtevani prinos koji odgovara toj standardnoj devijaciji. To se dobijamo ovako

efikasnaGranica3={(Sqrt[rezultatioptimizacije3[[All,1]]]),Range[0.01,0.4,0.01]}\[Transpose];

Ova informacija nam daje mogućnost da odredimo koju kombinaciju rizika i prinosa imamo i šta možemo da prihvatimo. Grafički

Efikasna granica-nastavak

ListLinePlot[efikasnaGranica3,AspectRatio->1/1.5,AxesOrigin->{0.1,0},AxesLabel->{"StDev","OcekPrinos"}]

Ovo što tu vidimo je skoro to što nam treba. Naime, sada možemo i grafički da vidimo zavisnost standardne devijacije prinos na portfolio od njegove očekivane vrednosti. Važno je tu staviti i gde je tu MVP.

Show[ListLinePlot[efikasnaGranica3,AspectRatio->1/1.5,AxesOrigin->{0.1,0},AxesLabel->{"StDev","OcekPrinos"},PlotLabel-> "Efikasna granica"],Graphics[{Red,PointSize[0.015],Point[{(Sqrt[MVPportfolio[[1]]]),ocekivaniMVP}]}]]

Naravno, i sa grafika se vidi da crvena tačka, MVP portfolio, ima najmanji mogući rizik.

Sa druge strane, postoji puno portfolia koji imaju manji prinos od MVP. To su portfoliji koji leže ispod crvene tačke na grafiku. U njih svakako nema smisla ulagati (zašto?).

Optimalni ponderi za različite očekivane prinose

Umesto da predstavimo grafički efikasnu granicu možemo da to uradimo i tabelarno, slično onome što smo radili na prethodnom predavanju. Naime, ako koristimo Manipulate

Manipulate[NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==μ},W3],{μ,0.01,0.4,Appearance-> "Labeled"}]

Ovako možemo da vidimo očekivani prinos μ, standardnu devijaciju σ i odgovarajuće pondere za svako od rešenja problema portfolio optimizacije.

Manipulate[Module[{minimum},minimum=NMinimize[{varijansaPortfolia,w1+w2+w3==1,ocekivaniPrinosPortfolia==μ},W3];Flatten[{"σ"->(Sqrt[minimum[[1]]]),minimum[[2]]}]],{μ,0.01,0.4,Appearance-> "Labeled"}]

4. Portfolio optimizacija kada proširimo investicioni skup za još jednu akciju (ATT)

Kreirajmo sada podatke o prinosima na sve četiri akcije, to jest proširimo skup potencijalnih investicija i na akciju kompanije Apple.

prinosi4=Rest[podaciOprinosima][[All,2;;5]];

Kao i ranaije, podatke ćemo podeliti na podatke za modelovanje (prinos4model) i podatke za testiranje performansi različitih portfolija (prinosi4test). Podatke za modelovanje ćemo koristiti za optimizaciju portfolija. Oni će se sastojati od privh 300 prinosa.

prinosi4model=Take[prinosi4,300];

Sada izračunamo očekivane prinose i matricu kovarijansi, na godišnjem nivou, za prinosi4model

ocekivaniPrinosAkcija4=252Mean[prinosi4model]

matricaKovarijanse4=252Covariance[prinosi4model];

Pošto imamo sada četiri promenljive umesto 3, uvodimo još jednu komponentu u vektor w.

W4={w1,w2,w3,w4};

Nova varijansa portfolia je kvadratna forma koja sada ima 4 promenljive.

varijansaPortfolia4=W4.matricaKovarijanse4.W4//Expand;

Rešenje za novi MVP

Nađimo prvo rešenje za novi portfolio minimalne varijanse (novi MVP)

MVPportfolio4=NMinimize[{varijansaPortfolia4,w1+w2+w3+w4==1},W4]

Očekivani prinos portfolia u opštem slučaju je:

ocekivaniPrinosPortfolia4=W4.ocekivaniPrinosAkcija4;

Izračunajmo za kasnije očekivani prinos novog MVP portfolia.

ocekivaniMVP4=ocekivaniPrinosPortfolia4/.Last[MVPportfolio4]

Nova efikasna granica i poređenje sa starom

Sada smo spremni da ponovimo izračunamo optimalne portfolija za zadati nivo očekivanog prinosa, ali sa proširenim skupom hartija u koje možemo da investiramo.

rezultatioptimizacije4=Table[NMinimize[{varijansaPortfolia4,w1+w2+w3+w4==1,ocekivaniPrinosPortfolia4==μ},W4],{μ,0.01,0.4,0.01}];

Kao i ranije, ovako pravimo parove optimalnih vrednosti rizika za zadati očekivani prinos portfolia

efikasnaGranica4={(Sqrt[rezultatioptimizacije4\[Transpose][[1]]]),Range[0.01,0.4,0.01]}\[Transpose];

Show[ListLinePlot[{efikasnaGranica3,efikasnaGranica4},AspectRatio->1/1.5,AxesOrigin->{0.05,0},AxesLabel->{"StDev","OcekPrinos"},PlotLabel-> "Efikasna granica",PlotLegends->{"Sa 3 akcije","Sa 4 akcije"}],Graphics[{Red,PointSize[0.015],Point[{{(Sqrt[MVPportfolio[[1]]]),ocekivaniMVP},{(Sqrt[MVPportfolio4[[1]]]),ocekivaniMVP4}}]}]]

Vidimo da kada se poveća investicioni skup, efikasna granica omogućava investicije koje će za isti očekivani prinos imati manji rizik.

Razlog za to je što se time povećava mogućnost diverzifikacije. Dakle, širi dijapazon investicionih mogućnosti daje bolje mogućnosti za investitora.

Napravimo sada Manipulate koji pokazuje kako konstruisati optimalni portfolio

Ovde ćemo prikazati to na  2 različita načina. Prvi je generalizacija onoga od ranije:

Manipulate[Module[{minimum},minimum=NMinimize[{varijansaPortfolia4,w1+w2+w3+w4==1,ocekivaniPrinosPortfolia4==μ},W4];Flatten[{"σ"->(Sqrt[minimum[[1]]]),minimum[[2]]}]],{μ,0.01,0.4,Appearance-> "Labeled"}]

Drugi  način bi bio da napravimo dinamičku tabelu:

Manipulate[Module[{minimum},minimum=NMinimize[{varijansaPortfolia4,w1+w2+w3+w4==1,ocekivaniPrinosPortfolia4==μ},W4];Grid[{{"σ","μ","w1","w2","w3","w4"},Flatten[{(Sqrt[minimum[[1]]]),μ,minimum[[2,#,2]]&/@Range[4]}]},Frame->All]],{μ,0.01,0.4,Appearance-> "Labeled"}]

U prvom redu tabele imamo oznake promenljivih koje pratimo. Njih je najzgodnije uvek pisati kao stringove. U drugom redu imamo vrednosti. One se menjaju kako menjamo vrednost μ. Njih smo izvukli kao delove izraza minimum, odnosno kao delove rešenja problema optimizacije.

5. Statičke strategije: investiramo neku količinu novca na početku i posle više ne trgujemo

Počnimo ponovo od toga da unesemo podatke o cenama.

podaci=Import["C:\\Users\\Prof Branko Urosevic\\Dropbox\\Branko Urosevic\\operaciona2\\downloads\\podaci21.xlsx"][[1]];Take[podaci,10]//Grid

Vidimo, dakle, da je u prvoj koloni datum, u 2-6 koloni su cene na hartije čije vremenske serije želimo da konstruišemo. Pretpostavimo da želimo da konstuišemo vremenske serije cena koje odgovaraju poslednja 203 dana trgovanja. To će nam služiti za testiranje raznih investicionih strategija. Istovremeno implicitno pretpostavljamo da, kao i ranije, smo koristili prvih 301 dan podataka (pošto sad imamo i naslove moramo da izbacimo zapravo 302 reda na početku) da donesemo odluku o tome kako da raspodelimo pare koje imamo za investicije. Investiciona odluka se donosi, dakle, 14. marta 2014. i više ne trgujemo akcijama.

podacitest=Drop[podaci,302];Take[podacitest,10]

{amzntest,msfttest,ibmtest, aapltest}=Table[Module[{beznaslova=podacitest},TimeSeries[{beznaslova[[All,1]],beznaslova[[All,n]]}\[Transpose]]],{n,2,5}]

Statička strategija trgovanja

Statička strategija jeste ona kada na početku (u ovom slučaju prvog dana trgovanja u 2007.) kupimo ili prodamo bez pokrića određeni broj akcija i tako formiramo portfolio čiji sastav (broj akcija) držimo konstantnim do kraja investicionog perioda (to jest do kraja 2007.). Koraci prilikom definisanja statičke strategije su:

Grid[{{Style["Koraci",Bold],Style["Opis",Bold]},{"Korak 1",Style["Odredimo sumu s koju želimo
da uložimo u trenutku 0",20]},{"Korak 2",Style["Odredimo pondere (Subscript[w, i]) za svaku od
akcija u trenutku 0",20]},{"Korak 3",Style["Sumu (Subscript[s, i])= s (Subscript[w, i]) ulažemo u akciju i
u trenutku 0",20]},{"Korak 4",Style["(Subscript[s, i]) podeljeno sa cenom akcije (Subscript[p, i]) 
daje broj akcija (Subscript[n, i]) u trenutku 0",20]},{"Korak 5",Style["U statičkoj strategiji broj
akcija (Subscript[n, i]) se ne menja sa vremenom",20]}},Frame-> All]

Primer statičke strategije trgovanja: investiramo na početku podjednaku količinu novca u sve četiri akcije i posle više ne trgujemo

Statičke strategije razlikuju se samo prema tome kako uradimo Korak 2. Ovde ćemo prvo da razmotrimo statičku strategiju gde u trenutku 0 (početak 2007.) ulažemo s=100 000 dolara podjednako u svaku od 4 akcije (korak 1).

U ovom slučaju, ponderi su jednaki {0.25, 0.25, 0.25, 0.25} (to je korak 2). Stoga, 14. marta 2014. investiramo po 25000 dolara u svaku od 4 akcije (to su sume (Subscript[s, i]) u koraku 3).

Primetimo da nam u tom slučaju ne treba nikakva optimizacija. Posle početne kupovine akcije više ne trgujemo i samo posmatramo šta se događa sa našim portfoliom. Iz toga razloga to i jeste statička strategija.

Odredimo koliko bismo akcija svake od četiri akcije morali da kupimo, kako bismo u svaku uložili po 25000 dolara (to je korak 4). Ideja je prosta. Za svaku od 4 akcije, nađimo cenu akcije na dan 14. mart 2014. i podelimo 25000 sa cenom jedne akcije. To će nam dati broj akcija za tu hartiju. Verovatno nećemo dobiti ceo broj ali hajde da se ne brinemo o tome.

Nastavak

Uvedimo, radi kompaknosti, listu vremenskih serija za koje testiramo performanse, testSerije. Takođe uvedimo listu brojakcijaIstiPonderi koja se sastoji od akcija koje investiramo u svaku od akcija u strategiji sa istim ponderima. Tu, na primer, First[msfttest["Values"]] nalazi prvu vrednost cene akcija Microsofta za 2007.

testSerije={amzntest,msfttest,ibmtest, aapltest};

brojakcijaIstiPonderi=(25000/First[#["Values"]])&/@testSerije

To su inicijalni količine akcija koje treba da kupimo 14. marta 2014. Posle toga više njima ne trgujemo (zato to zovemo statička strategija).

Da bi našli performansu takvog portfolia treba da izračunamo ukupnu vrednost portfolia kao sumu vrednosti broja akcija pomnoženih na odgovarajuću cenu za svaki dan trgovanja. Skalarni proizvod vektora koji sadrži količine akcija i vektora koji sadrži 4 vremenske serije daje vrednost portfolija u svakom trenutku vremena:

portfolioPodjednakoUsve=Dot[brojakcijaIstiPonderi,testSerije]

DateListPlot[portfolioPodjednakoUsve]

Koliko bi se promenili ponderi za 203 dana trgovanja?

Na početku smo fiksirali pondere da budu isti. Koliko su se promenili posle godinu dana ovakvog statičkog ulaganja? Da bismo to odredili, nađimo prvo vrednost portfolia poslednjeg dana trgovanja.

Last[portfolioPodjednakoUsve["Values"]]

Cena svake od hartija tog poslednjeg dana trgovanja data je izrazom:

Last[#["Values"]]&/@testSerije

pa su odgovarajuće vrednosti naše investicije za svaku od akcija, u dolarima, jednake:

brojakcijaIstiPonderi (Last[#["Values"]]&/@testSerije)

U ovom izrazu koristimo pokomponentno množenje dva vektora. Na primer:

{a,b}{c,d}

Najzad, ponderi su, poslednjeg dana trgovanja, jednaki

brojakcijaIstiPonderi (Last[#["Values"]]&/@testSerije)/Last[portfolioPodjednakoUsve["Values"]]

Dakle, ako fiksiramo pondere na početku i više ne trgujemo, ponderi neće ostati fiksni zato što se menjaju vrednosti akcija.

Drugi primer statičke strategije: Statičko ulaganje u MVP portfolio

Na osnovu podataka za prvih 301 dan trgovanja (do 14. marta 2014) mi smo ranije odredili kakvi bi bile optimalne vrednosti pondera ukoliko želimo portfolio sa najmanjim mogućim rizikom (MVPportfolio4 portfolio). Pretpostavimo da 14. marta a2014, umesto da investiramo podjednake količine novca u svaku od hartija, uložimo onako kako to nalaže MVPportfolio4 kalkulacija (to je sada novi korak 2). Dobili bismo sledeće pondere:

ponderiMVP4=W4/.MVPportfolio4[[2]]

Izračunajmo sada broj akcija koji treba da kupimo kako bismo upravo na taj način podelili 100 000 dolara. Pre toga moramo da nađemo koliko para treba da uložimo u svaku od akcija (korak 3). To dobijamo tako što sumu od 100 000 pomnožimo sa odgovarajućim ponderima.

iznosiMPV=100000ponderiMVP4

Nastavak

Dobili smo listu sa količinama novca (u dolarima) koju sada moramo da uložimo u svaku od akcija. Evo vektora cena svake od akcija na dan 14. marta 2014.:

First[#["Values"]]&/@testSerije

Broj akcija onda dobijemo tako što iznos koji treba da uložimo u neku akciju podelimo sa vrednošću akcije:

brojakcijaMVP=iznosiMPV/(First[#["Values"]]&/@testSerije)

Tu koristimo pokomponentno deljenje lista u WL

{a,b}/{c,d}

Uporedimo ex-post performance dve statičke strategije: podjednako u sve i MVP

Pretpostavimo da investiramo ponovo samo jednom, 14. marta 2014, ali sa tim drugim ponderima. Vremenska serija za test portfolio u tom slučaju bi bila

portfolioMVP=Dot[brojakcijaMVP,testSerije]

Uporedimo performanse ova dva portfolia, jednog koji koristi optimizaciju i drugog koji je ne koristi.

DateListPlot[{portfolioPodjednakoUsve,portfolioMVP},PlotLegends->{"Isti ponderi","MVP"}]

Vidimo da bi u ovom slučaju investiranje u najmanje rizičan portfolio doneo nešto malo manji prinos na kraju nego da smo stavili podjednaku količinu novca u svaku hartiju na početku. Ali, naravno, moglo je i sasvim drugačije da se završi.

6. Dinamička strategija: podjednaki ponderi konstantni u vremenu

Prethodne dve portfolio strategije koje smo primenili su bile statičke. Drugim rečima, posle početne kupovine akcije više nismo njima trgovali. Broj akcija je bio konstantan u svakom trenutku, samo su se cene akcije menjale svaki dan. U principu mi možemo da menjamo naš portfolio čak i više puta dnevno (to se zove high frequency trading).

Jedna interesantna strategija jeste da uvek držimo konstantni udeo od 25 posto naših para svaki dan uložen u one četiri akcije. Pošto se cene menjaju, to bi značilo da bismo morali da stalno menjamo naš portfolio, to jest da trgujemo. Pri tome, mada ćemo uvek stavljati jednu četvrtinu para u svaku od četiri akcije, količina para koju ćemo imati na raspolaganju će svakoga dana biti drugačija.

Nastavak

Jedan prost način da vidimo kakav bi se prinos ostvario na takav portfolio (ako ne računamo transakcione troškove koji mogu biti značajni), jeste da izračunamo prinose na sve četiri akcije u test periodu, i da nađemo njihovu ponderisanu sumu sa ponderima od po 25 posto. Na taj način bismo dobili prinose na takav portfolio svakog dana u test periodu. Na osnovu prinosa na portfolio možemo da rekonstruišemo šta će se dogoditi sa vrednošću portfolia koristeći takozvani kumulativni prinos ukoliko bismo počneli, kao i ranije, od 100000 dolara.

Prvi izračunajmo prinose na svaku od 4 akcije u test periodu za sve četiri akcije odjednom.

prinositest=prostprinos[#["Values"]]&/@testSerije;

Svaka kolona u matrici prinositest sastoji se od prinosa u jednom danu trgovanja za sve četiri akcije.

Pretpostavimo da se naša strategija sastoji u investiranju podjednakih udela u sve četiri akcije u svakom trenutku vremena. Pošto je vektor pondera

wpodjednaki={0.25,0.25,0.25,0.25};

Nastavak

Prinos portfolia je, u svakom trenutku, jednak ponderisanoj sumi prinosa ove četiri akcije. To se može izračunati ovako:

prinosPodjednakiDinamicki=wpodjednaki.prinositest;

Sledeći korak jeste da nađemo formulu za kumulativni prinos. Ako bismo počeli od 100 000 evra i imali četiri dnevna prinosa, r1 do r4, kumulativni prinosi bi bili:

FoldList[#1(1+#2)&,100000,{r1,r2,r3,r4}]

U našem slučaju prinosi su dati pomoću liste prinosPodjednakiDinamicki, a početna vrednost portfolia je 100 000. Stoga:

vrednostPodjednakiDinamicki=FoldList[#1(1+#2)&,100000,prinosPodjednakiDinamicki]

Nastavak

ListLinePlot[vrednostPodjednakiDinamicki,PlotTheme->"Detailed",PlotLabel->Style["Fiksni u vremenu
 podjednaki ponderi",Blue,14]]

Na sličan način možemo konstruisati dinamiku vrednosti bilo kog portfolia koji ima pondere koji se ne menjaju sa vremenom (naravno, oni ne moraju biti jednaki 0.25, 0.25, 0.25, 0.25). Sve se razlikuje samo u jednom koraku, naime umesto pondera wpodjednaki bio bi neki drugi vektor pondera.

Najzad, ukoliko se i ponderi menjaju sa vremenom ili ukoliko želimo da uzmemo u obzir transakcione troškove, onda izračunavanja zahtevaju malo ozbiljnije stvari. Ali, o tome nekom drugom prilikom. Ovo je dovoljno za početak da neko od vas ko se zaintersuje može malo da se igra i vidi kako bi to radilo.

Money

https://www.youtube.com/watch?v=-0kcet4aPpQ