Opdracht 2. Deadline maandag 28 september 2015, 24:00 uur. Deze opdracht bestaat uit vier onderdelen; in elk onderdeel wordt gevraagd een Matlabprogramma te schrijven. De vier bijbehore bestanden stuur je naar a.a.n.ridder@vu.nl. Er komt eerst wat uitleg over random number generators, en schatters met bijbehore Matlab tips; daarna komt de beschrijving van de opdracht. 1 Random Number Generator Een random number generator (RNG) is een deterministisch algoritme dat een rij getallen U 1, U 2,... produceert die beschouwd mogen worden als onafhankelijke trekkingen uit de U(0, 1) verdeling (de uniforme, ook wel homogene, kansverdeling op (0, 1)). Een goede RNG is de basis van simulatiestudies. Wat betekent goed? 1. U 1, U 2,... passeert succesvol statistische toetsen. 2. Het gaat razsnel, bv 10M getallen in één seconde. 3. Je moet de rij getallen kunnen herhalen! 4. Je laptop en de VU-computer moeten dezelfde getallen produceren. 5. Omdat computers eindige machines zijn, zijn er maar eindig veel machinegetallen (zie college 2). Dus zal elke RNG die door een computerprogramma wordt uitgevoerd een rij U 1, U 2,... produceren die zich op den duur herhaalt. Bij een goede RNG duurt het heel lang voordat deze herhaling optreedt (de zogeheten herhalingsperiode). Matlab heeft een aantal goede RNG algoritmes beschikbaar die aan al deze eisen voldoen. De standaard RNG in Matlab is de Mersenne Twister met herhalingsperiode van 2 19937 1 (zie eis 5). Het eerste getal dat geproduceerd wordt door een RNG, is afhankelijk van hoe het RNG algoritme wordt gestart. Dat gebeurt door een zogeheten seed, wat niets anders is dan een getal (of soms een vector van getallen). Telkens als je Matlab opstart staat die seed op hetzelfde getal, en dan krijg je dezelfde rij U 1, U 2,... als bij je vorige Matlabsessie. Je kunt je simulatie-experimenten ook telkens laten beginnen met dezelfde seed, namelijk door die steeds op hetzelfde getal te zetten (zie eis 3). 1.1 Matlabtip 1 De aanroep rand genereert een trekking uit de U(0, 1) verdeling. Wil je veel random getallen, bv n = 10 6, dan gaat het veel sneller om die gevectorizeerd te genereren dan een voor een. Experimenteer zelf: 1
n = 10^6; tic; u=rand(1,n); toc tic; for :n u = rand; toc De seed van de RNG in Matlab kun je zetten op een natuurlijk getal, bv 127528, door rng(127528). Je kunt de seed ophalen door de aanroep sd = rng, zie de volge Matlabsessies in het commandoscherm uitgevoerd vanuit de default waarde van de seed. >> rand(1,5) 0.8147 0.9058 0.1270 0.9134 0.6324 >> rand(1,5) 0.0975 0.2785 0.5469 0.9575 0.9649 >> s = rng; rand(1,5) 0.8147 0.9058 0.1270 0.9134 0.6324 >> rng(s); rand(1,5) 0.8147 0.9058 0.1270 0.9134 0.6324 >> rng(127528); rand(1,5) 0.2328 0.2870 0.3777 0.0060 0.4808 2 Schatten van Momenten van Stochasten Laat X een stochastische variabele zijn met cumulatieve kansverdelingsfunctie F (x) = P(X x), met verwachting µ = E[X], en variantie σ 2 = Var(X). In de vakken Probability Theory en Statistics heb je geleerd hoe je µ en σ 2 kunt schatten: 2
Als X 1, X 2,..., X n gelijkverdeelde, onafhankelijke trekkingen zijn uit de kansverdeling van X, dan is µ = 1 n X i (1) n een zuivere schatter van µ [dwz E [ µ ] = µ]. En S 2 = 1 n ( Xi µ ) 2 n 1 is een zuiver schatter van σ 2. Een speciaal geval is de Bernoulli stochast: B = 1 met kans p en B = 0 met kans 1 p. Omdat E[B] = p, kun je p schatten uit de 0/1 waarnemingen B 1,..., B n door p = 1 n n B i. Een toepassing hiervan is een stochastische variabele X op R waarvan je de kans P(X c) wilt schatten voor een gegeven c. Als X 1,..., X n realisaties van X zijn, dan is een schatting van P(X c): 1 n 1{X i c}. n 2.1 Matlabtip 2 Computersimulatie (bv in Matlab of Ox) is een methode om onafhankelijke gelijkverdeelde waarnemingen X 1,..., X n te genereren van een stochastische variabele X. In het tweede deel van Numerical Methods (periode 2) wordt nader uitgelegd hoe dat gaat. Voor deze opdracht is voldoe dit te doen voor een 0/1 stochast. Dat wil zeggen, laat A een gebeurtenis zijn die optreedt met kans p, of niet optreedt met kans q = 1 p. De bijbehore stochastische variabele is de Bernoulli (p), X = 1{A} met P(X = 1) = p, P(X = 0) = 1 p. Laat U = U(0, 1) de uniforme (0, 1) stochast zijn waarvan we trekkingen krijgen door Matlab s rand (zie tip 1). Omdat p = P(U < p) krijgen we een waarneming X = 1 met kans p door (rand<p). Dit kun je vectorizeren door (rand(1,n)<p) wat een rijvector van onafhankelijke gelijkverdeelde 1/0 waarnemingen geeft volgens de kansen p op waarneming 1 en 1 p op waarneming 0. Bv 1 miljoen zuivere muntworpen: 2.2 Matlabtip 3 n = 10^6; p = 0.5; (rand(1,n)<p); Zoals je weet kun je de variantieschatter (2) herschrijven tot S 2 = n 1 n Xi n 1( 2 µ 2). (3) n Dat geeft dat er twee manieren zijn om de schatters µ en S 2 te implementeren. (2) 3
(i). Genereer eerst alle data X 1,..., X n ; sla op in een vector; en bereken dan formules (1) en (2). Als je in Matlab deze vector x hebt genoemd, volstaan de Matlabfuncties mean(x) en var(x). (ii). Na elk volg datapunt X k, bereken je direct via recursie k k 1 X i = X i + X k, en k k 1 Xi 2 = Xi 2 + Xk 2. Bereken na de laatste x n pas de formules (1) en (3). Voorbeeld van de muntworp om verwachting en variantie te schatten. function methode_i start; function start n = 10^6; p = 0.5; (rand(1,n)<p); estp = mean(x) estvar = var(x) function methode_ii start; function start n = 10^6; p = 0.5; xsom = 0; x2som = 0; for :n (rand<p); xsom = xsom + x; x2som = x2som + x*x; estp = xsom/n estvar = (x2som/n - estp^2)*(n/(n-1)) Wiskundig zijn de twee uitdrukkingen voor S 2 hetzelfde, numeriek treden er verschillen op. Vooral als X i grote waarden aannemen, en Xi 2 groot wordt. De eerste methode is numeriek stabieler, maar heeft meer geheugenruimte nodig. 4
Opdracht 2: How To Gamble If You Must. Veronderstel dat je deelneemt aan een investeringsplan. Het plan heeft een looptijd van n = 60 maanden; aan het begin van elke maand leg je een bedrag in, zeg x k in maand k. De beheerder van dit investeringsplan is een gewiekste belegger die het lukt om aan het eind van de maand (voordat je de volge inleg doet) jou met kans p = 0.36 het ingelegde bedrag in drievoud terug uit te keren, maar met kans q = 1 p = 0.64 ben je helaas je inleg kwijt. De p en q kansen zijn in elke maand hetzelfde, en daarnaast zijn de maandelijkse handelingen van de beheerder onafhankelijk van van eerdere uitkomsten. Dit plan is inderdaad gunstig want bij een inleg van één euro in een maand is het verwachte nettoresultaat 1 + 0.36 3 = 0.08. Dat is, je verwacht een rement van 8% per maand. Veronderstel dat je instapt in dit plan met een vermogen van V 0 = 1000 euro. De vraag is, hoeveel ga je per maand inleggen om aan het eind van het plan aan een bepaalde criterium te voldoen. Noteer V k voor je vermogen aan het eind van maand k, vlak na een eventuele uitkering en nog voor je de volge inleg doet. Dus bij inleg x k in maand k is (natuurlijk kun je hoogstens inleggen wat je vermogen is: x k V k 1 ) { V k 1 + 2x k, met kans p; V k = (4) V k 1 x k, met kans q. Definieer de groeifactors G 1, G 2,... door G k = 1 k ln ( V k /V 0 ) V k = V 0 e kg k. Criteria kunnen zijn: (a.) max E[V n ]: maximaal verwacht vermogen aan het eind van de looptijd. (b.) min Var[V k ]: minimale volatiliteit van het vermogen gedure de looptijd. (c.) max P(V n > γ): maximale kans om een streefbedrag te bereiken, bv γ = 5000 euro. (d.) min P(V k < δ): minimaal risico (te weinig vermogen) gedure de looptijd, bv δ = 100 euro. (e.) max E[G n ]: maximale groeifactor. In de volge onderdelen ga je door middel van simulatie een aantal van deze criteria onderzoeken, onder de volge aanname De inleg x k is een constante fractie α van het huidige vermogen V k 1. Opdracht (a) Simuleer een realisatie van het vermogen V k, k = 0, 1,..., n volgens de recursie (4). Doe dit achtereenvolgens voor α = 0.05, 0.2, 0.5, gebruik mak van common random numbers; dat wil zeggen, voor alle α s gebruik je dezelfde seed van de RNG. Schrijf een Matlabprogramma 5
om in één figuur de grafieken van deze drie realisaties te plotten. Geef de drie realisaties verschille kleuren en voeg lega toe. Schrijf je Matlabprogramma in een scriptfile genaamd opdr2a_achternaam.m (vervang Opdracht (b) Simuleer 100000 realisaties van het vermogen V k, k = 0, 1,..., n volgens de recursie (4), en sla alle 100000 eindvermogens V n (i), i = 1,..., 100000 op in een kolomvector. Doe dit achtereenvolgens voor α = 0.05 en α = 0.2. Zet de twee kolomvectoren in een matrix V. Schrijf een Matlabprogramma om in één figuur de twee histogrammen van deze twee datavectoren weer te geven [gebruik weer histc en bar toegepast op de matrix V ]. Gebruik als domein van de histogrammen het interval [0, 4000] en neem de binbreedte 500. Schrijf je Matlabprogramma in een scriptfile genaamd opdr2b_achternaam.m (vervang Onderdeel (c) Voor α [0.01, 0.1], schat het verwachte eindvermogen E[V n ], en de standaardafwijking Var(V n ) gebaseerd op 10000 gesimuleerde eindvermogens. Noem de twee schattingen µ(α) en σ(α). Schrijf een Matlabprogramma om in één figuur de grafieken van deze µ(α) en σ(α) te plotten als functie van α. Geef de grafieken verschille kleuren en voeg lega toe. Schrijf je Matlabprogramma in een scriptfile genaamd opdr2c_achternaam.m (vervang Onderdeel (d) Voor α [0.01, 0.1], schat de kans dat minstens één keer V k < 100 wordt bereikt, ook weer gebaseerd op 10000 gesimuleerde realisaties. Tevens, schat de verwachte groeifactor E[G n ]. Noem de schattingen π(α) en γ(α). Schrijf een Matlabprogramma om de grafieken van µ(α) en γ(α) te plotten als functie van α. Elke grafiek komt in een afzonderlijk figuur [zet figure voorafgaand aan elke plot opdracht]. Schrijf je Matlabprogramma in een scriptfile genaamd opdr2d_achternaam.m (vervang Conclusie Probeer nu voor jezelf te beredeneren wat een goede fractie α van je vermogen is om elke maand te beleggen. 6