Læringsmål:
- Betingelser
- For-løkker
- Plot
Pensum:
- 3.5 Scripts to Produce and Customize Simple Plots
- 3.7 User-Defined Functions That Return a Single Value
- 4.1 The if statement
- 4.2 The if-else statement
- 5.1 The for loop
Denne oppgaven er ment som en øvelse i å løse et litt stort og abstrakt problem. Det som er viktig å tenke på da er hva som i oppgaveteksten som er relevant for akkurat den deloppgaven man skal løse. Man må også passe på å dele problemer opp i mindre og løsbare problemer, og løse kun ett og ett om gangen. Disse delproblemene tilsvarer veldig ofte enten funksjoner eller kontrollstrukturer som if-else, for- eller while-løkker.
Når man skal investere penger i aksjer finnes det mange forskjellige investeringsstrategier. I denne oppgaven skal det implementeres to forskjellige strategier.
Vi forenkler børsmarkedet og sier at en aksje har en fast pris per dag og kan enten kjøpes eller selges kl 12:00. Det tillates også å investere i brøkdeler av en aksje. Det vil si at om man har 53,17 kr kan man investere i 53,17 % av en aksje som koster 100 kr.
Aksjeprisene er gitt som en vektor av tall, hvor pris tilsvarer prisen kl 12.00 på dag n. For eksempel:
Dag | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
Pris | 100 | 101 | 102 | 100 | 102 | 104 | 103 | 98 | 96 | 101 |
Hvis det investeres 50 kr i denne aksjen på dag 1 og selger den på dag nummer 2 så tjenes 50 * (101 / 100) = 0.50 kr.
a)
Lag en vektor closingPrices
med prisene over.
b)
Plott aksjeprisene i en figur.
Resultatet skal se slik ut:
c)
Lag funksjonen dailyReturns(closingPrices)
hvor closingPrices
er aksjeprisene for et selskap i en gitt periode. Funksjonen skal returnere en vektor som viser dag for dag hvor mye en aksje har gått opp eller ned. Dvs.
dailyReturnsi = closingPricei - closingPricei-1
Daglig gevinst for dag nummer 1 skal være 0. Gitt prisene over skal funksjonen returnere følgende vektor: [0, 1, 1, -2, 2, 2, -1, -5, -2, 5]
d)
Plott daglige gevinster (daily returns) for aksjen over i en figur. Resultatet skal se slik ut:
For å lage den første strategien må det lages en funksjon som sjekker om prisen har gått opp de siste n dagene.
e)
lag funksjonen isGoingUp(dailyReturn, i, n)
som sjekker om alle elementene fra i
og ned til i-n+1
i dailyReturn
er positive eller lik null. Funksjonen skal returnere true om dette er tilfelle og false ellers.
isGoingUp([0, 1], 2, 2) % Returnerer 1 isGoingUp([0,-1], 2, 2) % Returnerer 0 isGoingUp([-1, 0, 1], 3, 2) % Returnerer 1
f)
Den første strategien som skal implementeres heter keepRising
. Den baserer seg på at hvis en aksje er i ferd med å gå opp, så vil den fortsette å gå oppover. Det vil si kjøp aksjer som har hatt positiv eller 0 daglig gevinst de siste n dagene og selg aksjer som ikke har det.
Funksjonshodet for denne funksjonen skal se slik ut:function returns = momentum( startAmount, n, closingPrices )
Implementer etter pseudokoden:
Kalkuler daglige gevinster cash = startAmount investert = 0 for dag fra n til lengde av closing_prices %Oppdater investerte penger. investert = investert * (dagen pris / gårsdagens pris) hvis prisen har steget de siste n dagene invester all cash i aksjen ellers ta ut alle pengene fra aksjen slutt hvis slutt for-løkke svar = cash + investert
% skal skrive ut 98.0579 momentum (100 , 2, [100 101 102 100 102 104 103 98 96 101])
g)
Den andre strategien heter contrarian og mener at "what goes up must come down". I denne strategien vil du selge aksjer som er på vei opp, og kjøpe aksjer som er på vei nedover.
Hvorfor kan vi ikke bruke negasjonen av isGoingUp(..)
her?
Tips: Lag en funksjon som sjekker om prisen er på vei nedover.
Testverdi:
% skal skrive ut 103.0612 contrarian (100 , 2, [100 101 102 100 102 104 103 98 96 101])