2014-05-06 57 views
0

我有收盤價的表格債券隨着時間的推移,與基本結構:計數數量/價格無天更換

 bond_id | tdate | price 
    ---------+------------+------- 
    EIX1923 | 2014-01-01 | 100.12 
    EIX1923 | 2014-01-02 | 100.10 
    EIX1923 | 2014-01-05 | 100.10 
    EIX1923 | 2014-01-10 | 100.15 

正如你所看到的,我沒有價格因爲債券不會每天交易。 我想指出在某一年發生這種情況的頻率,如果債券價格在連續幾天之間沒有變化,我將其視爲相同的結果。

也就是說,對於有N個交易日的一年(不包括週末,無視假日),我基本上想要生成一系列的日期並計算價格(1)與前一天相同的天數或(2)不記錄當天並將其劃分爲N.

我使用的是PostgreSQL,所以我從generate_series('2014-01-01'::timestamp, '2015-01-01'::timestamp, '1 day'::interval)開始;我可以從這個系列的選擇,做一個WHERE排除週末:

SELECT dd 
FROM generate_series(
    '2014-01-01'::timestamp, 
    '2015-01-01'::timestamp, 
    '1 day'::timestamp 
) dd 
WHERE EXTRACT(dow FROM dd) NOT IN (0, 6); 

現在,我想我想產生的bond_id「列」加入對trade表,但我不知道怎麼樣。從本質上講,我想最簡單的結構將是一個LEFT JOIN讓我得到的東西,如:

EIX1923 | 2014-01-01 | 100.12 
EIX1923 | 2014-01-02 | 100.10 
EIX1923 | 2014-01-03 | 
EIX1923 | 2014-01-04 | 
EIX1923 | 2014-01-05 | 100.10 
EIX1923 | 2014-01-06 | 
EIX1923 | 2014-01-07 | 
EIX1923 | 2014-01-08 | 
EIX1923 | 2014-01-09 | 
EIX1923 | 2014-01-10 | 100.15 

然後,我可以只需填寫與最近獲得的價格差距,並在應用程序代碼算ABS(∆P) == 0數量。但是,如果有解決方案完全在SQL中完成這將是很好的!我不知道上面的方法是否合適。

(我沒有打算檢查2014年1月的第一天是否是週末,因爲這只是爲了說明,但顯然它們會被排除在結果之外)。

編輯:似乎可能有一些類似的問題已經。希望它不是太重複!

編輯:所以,我打多一點與這個和這個解決方案「作品」(我不認識越早覺得很傻)在上述意義上:

SELECT 
    'EI653670', dd, t.price 
FROM 
    generate_series('2014-01-01'::timestamp, '2015-01-01'::timestamp, '1 day'::interval) dd 
LEFT JOIN 
    trade t ON dd = t.tdate AND t.id = 'EI653670' 
WHERE 
    EXTRACT(dow FROM dd) NOT IN (0, 6) ORDER BY dd; 

有沒有更好的辦法?

回答

0

我想你可以用lag()來做這個邏輯。下面顯示的總體思路 - 讓以前的日期和價格,並做一些邏輯:

select bond_id, 
     sum(case when prev_price = price 
       then date - prev_date + 1 
       when prev_date = date + interval '1 day' 
       then 0 
       else date - prev_date 
      end) 
from (select t.*, 
      lag(t.date) over (partition by t.bond_id order by t.date) as prev_date, 
      lag(t.price) over (partition by t.bond_id order by t.date) as prev_price 
     trade t 
    ) t 
group by bond_id; 

一個需要注意的是,這可能不會處理邊界條件,你所希望的方式。