取出上一筆交易日, 或上一筆交易日的時間差. 的DELTA 時間, 假日不算. 這是有趣的問題. 不是太容易.
這一題有點麻煩, 通常是週休二日, 所以只要每週跳掉週六, 週日,
且週休二日是從某一年才開始的, 如果資料有橫跨二種算法, 還要多有一個規則.
但如果跨數週計算的判定也是麻煩的. 如果再加上例外,
如國訂假日, 又有國曆農曆不同假期, 如何準確的取到每年的國訂假日. 也是困難的.
還有颱風假及補假的問題. 看似簡單的題目, 但要做到準確是有困難的.
想法:
如果可以知道那些日期才是交易日, 這樣問題就會簡單多了.
方法步驟:
1. 收集交易日資料: 可以有二種方法
a. 人工: 從交易所公佈的DATA,
b. 從交易資料檔: 假設每個交易日至少有一筆成交, 將所有交易資料取唯一的日期,這樣就可以收集到日期
2. 從收集到的交易日, 做排序, 再 assign 給流水號.
3. 將流水號依成交 DATA merge 回成交資料.
4. 後流水號的diff 就可以算出delta 日期及時間.
使用SQL:
假設交易檔為 trade, 欄位, DATE, time, price, ID 交易者
* collect date ;
proc sql;
create table A1 as
select distinct a.date
from trade as a
order by date;
* assign series number;
proc sql;
create table trDates as
select a.date, monotonic() as sernum;
from A1 as a
order by date;
* merge by sernum
proc sql;
create table tr_merge as
select distinct a.date
from trade as a left join trdates as b
on a.date=b.date;
*取出上一筆做相減;
data tr_diff; /* by data step */
set tr_merge;
retain pser;
if (first.ID) then pser=.;
diff=sernum-pser;
pser=sernum;
by ID;
run;
*by SQL, as Nser in oder to ident the preious record;
proc sql;
create table tr_merge2 as
select a.*, montonic() as Nser
from tr_merge as a
order by id, date;
*by SQL;
proc sql;
create table tr_diff as
select a.*, a.sernum=b.sernum
from tr_merge2 as a left join tr_merge2 as b
on a.id=b.id & a.Nser=b.Nser+1;
order by id, date;
相關文: