2016-04-14 14 views
0
で2行ごと

私のデータセットが
benchmark_return 201301X 0.98 0.99
201302X 1.03 1.01
201303X 1.03 1
201301Y 150 150
201302Y 150 1.01
をこのdoループはSAS

eom_stock_idのstock_returnようになります 201303Y 1.02 1

(在庫総額)benchmark_return私は、次のような操作を実行する必要があります。ベンチマーク復帰(2)

つまり0.98 * 1.03- 0.99 * 1.01。

doループを使用してどのように行うのかを教えてください。私はdoループを使って毎秒の観測にそれを参照する必要があります

答えて

0

私は前の行からの値をLAG()にする必要があると思います。

データステップを使用してデータを作成しますが、月の値をスティックIDと混合する代わりに、それらを2つの別々の変数にしましょう。その後、BY処理を使用して、新しい在庫がいつ開始されるかを知ることができます。

data have ; 
    input month $6. stock_id $ stock_return benchmark_return ; 
cards; 
201301X 0.98 0.99 
201302X 1.03 1.01 
201303X 1.03 1 
201301Y 0.99 0.99 
201302Y 0.99 1.01 
201303Y 1.02 1 
;;;; 

は今、あなたは自分の数式を使用する必要がある、あなたの新しい変数を作成するには、しかし、あなたは遅れ値が異なる株式のためのものであるので、最初の観察のためにそれを行うことはないことを確認する必要があります。

data want ; 
    set have ; 
    by stock_id month; 
    new = lag(stock_return)*stock_return-lag(benchmark_return)*benchmark_return; 
    if first.stock_id then new=.; 
run; 

LAG()関数呼び出しを条件付きの内部に入れたくないことに注意してください。 LAG()は、関数の以前の実行からの値を実際に引っ張りますが、以前の観測値からは引き出されません。したがって、すべての観測でそれを実行することをスキップすると、返された値は以前の観測値からの値にはなりません。