Vanskelig oppgave

Gj?r denne oppgaven hvis du f?r til de enkle repetisjonsoppgavene.

I denne oppgaven er det en stor fordel ? ha matplotlib installert.

Denne opgaven er en litt modifisert versjon av en oppgave som ble gitt p? fredagspython i 2018.

Introduksjon

I denne oppgaven skal vi ved hjelp av Python-kode finne ut om det er mulig ? tjene penger p? ? selge og kj?pe en aksje. Vi skal gj?re dette ved ? lage et Python-program som fors?ker ? kj?pe og selge aksjen til Apple gjennom de siste 3 ?rene, og se om programmet ender opp med ? tape eller tjene penger dersom det f?lger ulike regler for n?r det l?nner seg ? kj?pe og selge. M?let er ? teste ut ulike strategier og fors?ke ? "tjene" mest mulig penger.

Vi vil utvikle programmet ved ? teste p? Apple sin aksjekurs for de siste 3 ?rene, men etter at vi har funnet en god algoritme vil vi til slutt teste strategien p? et annet selskap, for ? se om det vi har funnet ogs? fungerer bra generelt (og har potensiale for ? fungere fram i tid, ikke bare tilbake i tid).

Start med ? laste ned denne filen, som inneholder ett tall for hver dag, som sier hva prisen til Apple sin aksje ble kj?pt/solgt for den dagen. Lagre filen i samme mappe som du skriver Python-programmet.

Oppgave 1

Lag en funksjon les_inn_aksjekurser som tar et filnavn som parameter.

Funksjonen skal ?pne filen og lese inn aksjekursene fra den filen og legge dem i en liste. Hver linje i filen inneholder et tall (et flyttall) som er kursen for den dagen.

Kall funksjonen din og print listen. Sjekk at den starter slik:

[66.715714, 66.928574, 67.048569, ...

Det er nyttig ? visualisere aksjekursene. Det gj?r det enklere ? se m?nstre som vi kan utnytte i trading-algoritmen v?r. Dette gj?res enkelt med python ved ? bruke biblioteket matplotliib.

import matplotlib.pyplot as plt
priser = les_inn_aksjekurser(“apple.txt”)
plt.plot(priser)
plt.show()

Du vil se noe slikt som dette:

plott

F?r du g?r videre b?r programmet ditt se omtrent slik ut:

import matplotlib.pyplot as plt

def les_inn_akjekurser(filnavn):
   priser = []
   fil = open(filnavn)
   for linje in fil:
       priser.append(float(linje.strip()))

   return priser

priser = les_inn_akjekurser("apple.txt")
plt.plot(priser)
plt.show()

Oppgave 2

Vi har en teori om at det kan l?nne seg ? kj?pe aksjen n?r prisen er lavere enn det den har pleid ? v?re i det siste, og selge n?r prisen er h?yere enn det den har pleid ? v?re i det siste (dette er en enkel men ganske vanlig strategi blant aksjetradere).

For ? se om dette kan fungere, vil vi for hver dag (hver pris i listen) regne ut gjennomsnittet av prisen de siste 10 dagene.

Lag en funksjon som heter hent_gjennomsnitt_siste_n_dager og som tar to parametere priser og antall_dager. Priser er en liste som inneholder alle aksjekursene dag for dag og antall_dager er et tall som sier hvor mange dager tilbake vi ?nsker ? regne ut gjennomsnittet.

Funksjonen skal g? gjennom listen av priser, og for hver pris regne ut gjennomsnittet av prisene som har v?rt de siste antall_dager dagene og lagre alle disse gjennomsnittene i en ny liste.

Obs: For de f?rste dagene vil det ikke g? ? hente prisen mange dager tilbake. I den innerste for-l?kken b?r du ta h?yde for dette. Hvis i er st?rre enn dagnummer, s? vil jo dagnummer - i bli negativt. I de tilfellene trenger du bare ? regne gjennomsnittet av dagene fram til n?.

N?r du har skrevet ferdig denne funksjonen, b?r du kunne kj?re dette og f? et plott som det under (plottet er zoomet inn litt):

priser = les_inn_akjekurser("apple.txt")
gjennomsnittspriser = hent_gjennomsnitt_siste_n_dager(priser, 10)
plt.plot(priser)
plt.plot(gjennomsnittspriser)
plt.show()

plott

Oppgave 3

Vi er n? klare til ? pr?ve ? kj?pe og selge aksjen ved ? f?lge en regel, og se om vi tjener penger p? det.

Planen v?r er:

Bildet viser eksempler p? to sett med kj?p og salg:

plott

Lag en funksjon kjop_og_selg(priser, gjennomsnittspriser) som tar inn de to listene som inneholder prisene for hver dag og gjennomsnittsprisene for de siste 10 dagene.

I funksjonene g?r du gjennom dag for dag med en for-l?kke, og sjekker om du skal kj?pe eller selge (vi starter for-l?kken p? dag nr. 10 for enkelhetsskyld, det har ikke s? mye ? si):

for i in range(10, len(priser)):
	# Sjekk om vi skal kj?pe eller selge

Vi ?nsker alltid ? kj?pe og selge annenhver gang. Du kan alts? ikke ha kj?pt og s? kj?pe igjen noen dager senere uten ? ha solgt i mellomtiden. Derfor m? du ha en variabel p? utsiden av for-l?kken som holder orden p? om du n? har noe som kan selges eller ikke. En m?te ? gj?re dette p? er slik:

har_kjopt =  False
for i in range(10, len(priser):
	if … sjekk om vi skal kj?pe … and not har_kjopt:
		# Kj?p
	elif … sjekk om vi skal selge her …:
		# Selg

Hver gang vi kj?per ?nsker vi ? lagre prisen vi kj?pte for i en variabel. N?r vi selger, s? ?nsker vi ? regne ut forskjellen p? prisen n? og det prisen var sist gang vi kj?pte. Denne differansen legger plusser vi p? en variabel som holder p? fortjenesten v?r (vi antar her at vi selger og kj?per én aksje hver gang). Til slutt ?nsker vi ? printe ut den totale fortjenesten.

Print gjerne ut noe tekst hver gang du kj?per og selger og hva prisen er p? da. Det gj?r det enklere ? se om det skjer noen feil.

Om alt fungerer som det skal b?r du f? ut noe slikt som dette (viser bare slutten av mulig output):

Kjoper til prisen 188.770
Solgte til prisen 191.550
Tjent paa denne handelen: 2.780 
Kjoper til prisen 186.290
Solgte til prisen 183.820
Tjent paa denne handelen: -2.470 
Kjoper til prisen 187.790
Solgte til prisen 189.690
Tjent paa denne handelen: 1.900 
Kjoper til prisen 191.780
Solgte til prisen 191.900
Tjent paa denne handelen: 0.120 
Kjoper til prisen 199.130
Solgte til prisen 221.850
Tjent paa denne handelen: 22.720 
Tjent totalt: 111.036

Forbedre algoritmen din

Regelen vi bruker n? er veldig enkel. Test gjerne ut andre strategier. Du kan for eksempel pr?ve ? se p? mer eller mindre enn de 10 siste dagene n?r du regner gjennomsnittet.

En annen ting som ofte gir bedre resultater er ? bruke et vektet gjennomsnitt der du f. eks tar gjennomsnittet av de 3 siste dagene og de 10 siste dagene og sl?r sammen, men vekter de siste 3 mer (for eksempel 0.7 * gjennomsnitt for 3 siste dagene + 0.3 * gjennomsnitt for 10 siste dagene).

Det er som sagt mange mulige strategier. V?r kreativ, s? finner du kanskje noe som fungerer bra!

PS: