2017-12-01 9 views
1

私は262株のサンプルを持っているという問題に直面しています。今私は、これらの株式のペアリングのすべての可能な組み合わせの計算を行う必要があります。 私は2つのループを取ることを考えていました。しかし、私がそれをコード化した方法では、ログウィンドウに出力やエラーの通知も出ません。 まず、proc sqlを使用して、マクロ変数にすべてのティッカーシンボルを挿入します。最後にSASすべての変数を特定の計算で他のすべての変数と比較する

proc sql noprint; 
select distinct name 
into :ticker separated by " " 
from stocks; 
quit; 



%macro close2; 
%let n=262; /*262 stocks*/ 

%do i=1 %to &n.-1; 
%do j=i-1 %to &n.; 

%let s1=%trim(%scan(&ticker.,&i.," ")); 
%let s2=%trim(%scan(&ticker.,&j.," ")); 


data close; 
set normp; 
closeness=(&s1.-&s2.)**2; 
run; 

proc means data=close noprint; 
var closeness; 
output out=close1 (drop=_type_ _freq_) 
sum(closeness)=closen; 
run;quit; 

data=close1; 
set close1; 
&s1.%s2.=closen; 
run; 

%end; 
%end; 
%mend close2; 

私は私がそれを計算された2社の株式の2 tickersymbolsで命名VAR「近さ」のすべての異なる合計を持っていると思います。

+0

あなたはPROC IMLを持っていますか? – DomPazz

+0

1つのデータセットに262個の変数があり、行数はいくつですか? – Joe

+0

この計算には250行が必要 –

答えて

1

はルーピー(http://www2.sas.com/proceedings/forum2007/183-2007.pdf

てはいけない、私はあなたが比較のために日付列または他の識別子を持っていると仮定します。

いくつかの偽のデータ:

%let nStocks=200; 

data stocks; 
array S[&nStocks]; 
do date=1 to 10; 
    do st=1 to &nStocks; 
     S[st] = rannor(1); 
    end; 
    output; 
end; 
drop st; 
run; 

トランスポーズこの確かにすべてが同じ順序であることを確認する代わりに

proc transpose data=stocks out=stocks_t(rename=(_name_=Stock1 col1=S1_value)); 
by date; 
run; 

ソート「短く、幅の広い」の「長いとスキニー」となるように、 (分で重要になります)と株式の名前を取得するPROC SQLのステップ。

proc sort data=stocks_t; 
by date Stock1; 
run; 

proc sql noprint; 
select distinct Stock1 
    into :stocks separated by ' ' 
    from stocks_t 
    order by Stock1; 
quit; 

%put &stocks; 

ここで、データステップを使用してデータを調べます。ハッシュテーブルとループを使用して、日付ごとに異なる組み合わせを追加します。 「近さ」を計算します。ここから

data need; 
set stocks_t; 
if _n_=1 then do; 
    %create_hash(lk,date Stock2, S2_Value,"stocks_t(rename=(Stock1=Stock2 S1_Value=S2_value))"); 
end; 
by date; 

stocks = "&stocks"; 

if first.date then 
    count = 1; 

count + 1; 

do j=count to &nStocks; 
    Stock2 = scan(stocks,j); 
    S2_value = .; 
    rc = lk.find(); 
    closeness=(S1_Value-S2_Value)**2; 
    C_Var = catt(Stock1,Stock2); 
    output; 
end; 

drop rc count stocks j; 
run; 

、あなたは自分の合計を行う必要があり、あなたが行われています。ここから

proc summary data=need; 
var closeness; 
class C_Var; 
output out=closeness(where=(C_Var^="") drop=_type_ _freq_) sum=; 
run; 

%create_hash()マクロ:https://github.com/FinancialRiskGroup/SASPerformanceAnalytics

関連する問題