JoKr Skrevet 24. januar 2008 Del Skrevet 24. januar 2008 (endret) 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 30. januar 2008 av JoKr Lenke til kommentar
blackbrrd Skrevet 28. januar 2008 Del Skrevet 28. januar 2008 I postgres har du en funksjon som heter extract, og en annen som heter date_part, se om du finner dem i oracle? Lenke til kommentar
JoKr Skrevet 29. januar 2008 Forfatter Del Skrevet 29. januar 2008 (endret) 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 29. januar 2008 av JoKr Lenke til kommentar
JoKr Skrevet 30. januar 2008 Forfatter Del Skrevet 30. januar 2008 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå