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:

Dag12345678910
Pris1001011021001021041039896101

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])