Gå til innhold

*LØST* Calculate stock return -> downscale daily to monthly


Anbefalte innlegg

Hei,

 

Jeg vil regne månedsavkast på en aksje som finnes i en database, hvor de daglige værdiene er plassert på handelsdag timestamp (Det er en Oracle 10g base)

Eksempel av tabell: "Aktiepris"

Date | Price

30-01 | 99

31-01 | 100

...

27-02 | 109

28-02 | 110

...

30-03 | 121

01-04 | 120

 

Finnes der en enkel måte å kun hente månedens siste tall (price?).

Videre, etterpå, må jeg transformere den siste handelsdag til end-of-month (hvis 30.mars er en fredag og 31. er en lørdag, skal den 30.03 -> 31.03.

Til slutt vil jeg ta å regne avkast på månedsbasis, ved å ta:

Return = Price(31.03)/Price(28.02) - 1

 

Jeg har utelatt år med vilje, hh:mm:ss er alltid 00:00:00.

 

Jeg ser for meg at jeg må først skal definere en overordnet datoavgrensning, f.eks 31.12.2006 til 30.06.2007 (jeg inkluderer ikke aktie ticker for gjøre det litt enklere).

Deretter må jeg få fatt i "månedssskift", og mht downscaling har jeg ingen ide om løsning.

 

Takker for evt forslag eller ideer?

 

edit: Heading -> *LØST*

Endret av JoKr
Lenke til kommentar
Videoannonse
Annonse

Takk for forslag. Isteden for extract, brugte jeg vare to_char.

Videre, ble der brukt en subquery for å finne datoene. Jeg måtte ha Where på ID='*' 2 ganger, fordi at queryen feilet når subqueryen inkluderte mer enn 1 kolonne.

 

Nå skal jeg bare ha en transform, så de siste handelsdager blir kalender ultimo. (hvis siste handelsdag er 28.april, blir datoen stående som 30.april).

 

Step 1 på min vei ble til:

 

Select ID, to_char(dato,'dd-mm-yyyy') as dato, Price 
From table, 
( 
Select to_char(max(dato),'dd-mm-yyyy') as DT 
from table 
where ID='matchstring' 
group by to_date(to_char(dato,'mmyyyy'),'mmyyyy')
) subquery 
WHERE to_char(table.dato,'dd-mm-yyyy') = subquery.DT and 
table.ID='matchstring'

 

edit: legger til step 2, for det var veldig lett (når jeg fant det)

Select ID, to_char(dato,'dd-mm-yyyy') as dato, Price

Gir siste handelsdag

 

Select ID, to_char(last_day(dato),'dd-mm-yyyy') as dato, Price

Gir siste kalenderdag

 

Noen som har forslag til hvordan jeg så regner avkast?

Endret av JoKr
Lenke til kommentar

Jeg fikk ikke laget noen elegang løsning på siste steg, så jeg har tatt avkast under første Select som:

 

(Price/ LAG(Price,1) OVER (ORDER BY dato)) -1 as Return og just in case, sat jeg en order by dato helt til sist. (Kjører og en lag på datoen i en egen kolonne, så jeg kan verificere at det faktisk er 1 måneds som bliver lagget).

 

Så jeg har fått en sammenhengende SQL query som beregner månedsavkast on the fly bare databasen inneholder aksje pris.

 

Date | Price

30-01 | 99

31-01 | 100

...

27-02 | 109

28-02 | 110

...

30-03 | 121

01-04 | 120

 

blir til

 

Date | Price | LagDate | LagPrice | Return

31-01 | 100 |

28-02 | 110 | 31-02 | 100 | 0.10

...

30-03 | 121 | 28-02 | 110 | 0.10

01-04 | 120 | 30-03 | 121 |-0.008

 

Samtidig som man via last_day kan bestemme om det er siste handelsdag eller siste kalenderdag som skal anvendes.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...