今天自己寫了這樣的程式
DATA sac;
INFILE 'D:\SAS.txt';
INPUT code $ price high low date ;
if _n_=1 then delete;
code = upcase(code);
logprice = LOG10(price);
return=DIF(logprice);
volatility=return*return;
PROC PRINT DATA =sac;
RUN;
以上這樣處理後
會產生
code price high low date return vol
EWW 10 20 8 20050103 ln(10) {ln(10)}^2
EWW 12 20 7 20050103 ln(12) {ln(12)}^2
EWW 11 22 5 20050104 ln(11) {ln(11)}^2
*SORT THE DATA;
PROC SORT DATA = sac ;
BY date;
RUN;
PROC PRINT DATA = sac;
BY date;
SUM volatility;
VAR code volatility;
proc means data=sac noprint;
var volatility ;
by date;
output out=sacc sum=sum ;
run;
proc print data=sacc;
run;
最後會變成
date volatility
20050103 當天所有波動vol相加{78筆}
20050104 當天所有波動vol相加{79筆}
問題在於 每天如果是五分鐘的intraday資料
一天也只有79筆也就是說只能有78份return及vol{因為第一筆沒得減前一筆}
20050103 的確是如此
但是問題在於20050104卻不是如此
因為第一筆可以減20050103最後一筆資料所以產生了79個return及vol
請問這樣的問題可以用甚麼方式解決呢
--
▂▂▂ ▲ ◢ ◥ ◢◢◢ ▂▁▁▂
◥▼︶▼◤ ╳囧╳ . ▕●▏ ◢ @ ◣ ███ │
★ ╲╱ ★ ╳_ _╳ .. ∥∥∥∥ ◥ ▆ ◤ ▁●▁ ●│●
◥◤ ★╳ 皿 ╳ . . ║︿║ ◤| | |︿| │▁│
★ ■ XX . ▲  ̄ ◥ ■ ■
嗆辣紅椒 克里姆王 性感手槍 鋼鍊手指 白色相簿 白金之星 轟炸空門
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.224.82.44
> -------------------------------------------------------------------------- <
作者: alias (希望) 看板: Statistics
標題: Re: [問題] SAS每天算報酬的問題
時間: Fri Nov 23 09:49:30 2007
DATA sac 那一塊程式若改成以下:
DATA sac2;
INFILE 'C:\SAS.txt';
INPUT code $ price high low date ;
if _n_=1 then delete; RUN;
POOC SORT DATA=sac2; BY date; RUN;
DATA sac; SET sac2; BY date;
code = upcase(code);
logprice = LOG10(price);
return=DIF(logprice);
volatility=return*return;
IF FIRST.date THEN DO; volatility=0; return=0; END;
RUN;
PROC PRINT DATA =sac;
RUN;
黃色部分:因為你不需要每個日期的第一個 volatility 和 return
所以就令它們為0
試試看吧, 看是不是你想要的
※ 引述《cicatrix (SAS.VaR修行中...)》之銘言:
: 今天自己寫了這樣的程式
: DATA sac;
: INFILE 'D:\SAS.txt';
: INPUT code $ price high low date ;
: if _n_=1 then delete;
: code = upcase(code);
: logprice = LOG10(price);
: return=DIF(logprice);
: volatility=return*return;
: PROC PRINT DATA =sac;
: RUN;
: 以上這樣處理後
: 會產生
: code price high low date return vol
: EWW 10 20 8 20050103 ln(10) {ln(10)}^2
: EWW 12 20 7 20050103 ln(12) {ln(12)}^2
: EWW 11 22 5 20050104 ln(11) {ln(11)}^2
: *SORT THE DATA;
: PROC SORT DATA = sac ;
: BY date;
: RUN;
: PROC PRINT DATA = sac;
: BY date;
: SUM volatility;
: VAR code volatility;
: proc means data=sac noprint;
: var volatility ;
: by date;
: output out=sacc sum=sum ;
: run;
: proc print data=sacc;
: run;
: 最後會變成
: date volatility
: 20050103 當天所有波動vol相加{78筆}
: 20050104 當天所有波動vol相加{79筆}
: 問題在於 每天如果是五分鐘的intraday資料
: 一天也只有79筆也就是說只能有78份return及vol{因為第一筆沒得減前一筆}
: 20050103 的確是如此
: 但是問題在於20050104卻不是如此
: 因為第一筆可以減20050103最後一筆資料所以產生了79個return及vol
: 請問這樣的問題可以用甚麼方式解決呢