2014-10-30 53 views
0

我有以下的代碼來計算收益的滾動窗口上的偏度:計算滾動偏度和峯度在SAS迅速爲一個非常大的數據集

libname backup 'C:\Users\Anwender\Desktop\backup sas data'; 

data crsp_daily; 
set backup.crsp_daily; 
run; 

proc sort data=crsp_daily; 
by permno date; 
run; 

data crsp_daily1a; 
set crsp_daily; 
lastofmonth = last.month; 
by permno year month; 
run; 

proc sql; 
create table roll_ret as 
select h2.permno, h2.Date, h1.retadj as lagret 
from crsp_daily1a as h1, 
crsp_daily1a as h2 
where h1.permno = h2.permno 
and intck("MONTH",h1.date,h2.date) between 0 and 11 
group by h2.permno, h2.date 
having count(h2.permno)>250 and h2.lastofmonth = 1 
; 

quit; 

proc means data = roll_ret noprint; 
by permno date; 
var lagret; 
output out=crsp_daily_final skew=skewRet kurt=KurtRet; 
run; 

輸入數據集提供每日日期變量,從中我已經構建了一個年份和月份變量。它還具有股票(permno)和日收益率(retadj)的ID。我想從上一年的所有觀察值計算滾動偏度,但前提是該窗口中至少有250個觀測值。我只對這個月最後的結果感興趣。

輸入數據集有60多萬!觀察,上面的代碼太簡單了。我已經嘗試使用視圖而不是roll_view的數據集而沒有改進。

如何快速計算在上述意義上滾動的偏度爲這個非常大的數據集?

在我的代碼一般評論將十分讚賞。

非常感謝!

+0

您是否嘗試過配置代碼? – Kostya 2014-10-30 12:25:43

+0

這將如何工作?這可以提供一個解決方案如何加快速度?主要的挑戰來自proc sql,它創建了一個龐大的數據集,有沒有辦法繞過這一步?在SAS – InfiniteVariance 2014-10-30 12:59:04

+0

簡單的分析可以使用期權fullstimer和檢查日誌來完成(SAS還提供了腳本提取這些信息http://support.sas.com/rnd/scalability/tools/fullstim/)。我明白了,你已經知道瓶頸了:),會在答案中發佈一些關於優化的建議。 – Kostya 2014-10-30 13:52:32

回答

1

PROC SQL執行潛在的啓發式分析的聯合策略,您可以通過使用SQL PROC _method選項審查。潛在的用戶優化策略在這裏列出(http://support.sas.com/techsup/technote/ts553.html)。可能,您的情況屬於小(h2)和大(h1)數據集的連接類別 - 在此情況下創建關鍵字索引通常會有所幫助。

+0

感謝您的建議,所以您會建議在兩個數據集中創建permno索引?在sql連接執行作業之前運行以下代碼:proc sql;在crsp_daily1a上創建唯一索引permno;但是,我並沒有真正處理小數據集和大數據集,實際上它們是相同的,因此具有相同的大小。這仍然是一個合理的步驟? – InfiniteVariance 2014-10-30 17:16:22

+0

@Kostya,那個鏈接對我來說是新鮮事物。謝謝! – Jeff 2014-10-31 20:16:35

+0

@ user3575894道歉,不能早點回來。不幸的是,優化取決於數據的結構。但主要想法很簡單:在形成笛卡爾積之前減小數據集的大小。也許,如果你可以發佈proc sql _method的日誌,我們可以建議一些更具體的 – Kostya 2014-11-01 22:13:24