2017-12-14 12 views
1

私は、20ペアの株価とその価格差、そしてそれぞれのペアについて、125日以上のトリガー値を持つデータセットを持っています。今度は、データセットを得るためにいくつかの計算を行い、それぞれのペアに対して合計リターンを求めていますが、私の値がどうにか失われてしまいます。これまでは、私のすべてのペアの名前を変数として出力データセットを取得しましたが、常に値がありませんでした。 まず、価格偏差、トリガー、およびリターン偏差変数の名前を3つのマクロ変数に入れます。次に、合計60個の変数の値を持つデータセットを作成します。 MYデータは「すべては」私は、異なるデータsets.Theyからのproc SQLを使用したマクロVARSはTRIGGER1、トリガ2などまたはpricedev1 pricedev2などまたはreturndev1として変数名を含める作成し、このマクロループに沿った損失額

date   trigger1 trigger2 ...... trigger20 pricedev1 pricedev2....... returndev1 returndev2 ......... returndev20 
21/11/2002 0.04 0.23      -0.12 .     0.0012  .     .  
.    0.04 o.23      0.34 
.    .  .       . 
.    .  .    
28/04/2004 0.04 0.23 ...     0.11 .....            -0.23 

のように見える設定、retundev2など。そして、それは私がやったことだ:

data all; 
    if _n_=1 then set trigger; 
    set ba.trade1_pdev; 
    run; 

    data all; 
    merge all ba.trade1_rdev; 
    run; 



    Proc transpose data=all out=data1 (rename=(_name_=var)); 
    by date; 
    run; 

は、それから私は、マクロを作成しました:

%macro totret (dsname); 

    %do d=1 %to 20; 

    %let pair=%trim(%scan(&pairname.,&d.," ")); 
    %let ret=%trim(%scan(&ret.,&d.," ")); 
    %let trigger=%trim(%scan(&trigger.,&d.," ")); 

    data pair; 
    set data1; 
    length all $20; 
    if var="&pair." then all="pdev"; 
    else if var="&trigger." then all="trigger"; 
    else if var="&ret." then all="rdev"; 
    else delete; 
    drop var; 
    run; 

    proc sort data=pair; 
    by date; 
    quit; 

    proc transpose data=pair out=pair; 
    by date; 
    id all; 
    quit; 


    data pair; 
    set pair; 
    ivar=0; 
    if pdev>=trigger then ivar=1; 
    if pdev<=-1*trigger then ivar=-1; 
    run; 

    data pair; 
    set pair; 
    totret=ivar*rdev; 
    keep date totret; 
    run; 

    data pair; 
    set pair; 
    rename totret=&pair.; 
    run; 

    proc sort data=pair; 
    by date; 
    quit; 

    proc transpose data=pair out=pair (rename=(_name_=var)); 
    by date; 
    quit; 


    %if &d.=1 %then %do; 

    data &dsname.; 
    set pair; 
    run; 

    %end; 


    %if &d.>1 %then %do; 

    data &dsname.; 
    set &dsname. pair; 
    run; 

    %end; 



    %end; 

    %mend totret; 
    %totret (tot_ret); 

は、その後、私は再びそれをバック移調が、結果は20個の変数と日付変数とデータセットが、20のすべてですvarsには値がありません。

私が持っていたい私の結果のデータセット内の
proc sort data=tot_ret; 
    by date; 
    quit; 

    Proc transpose data=tot_ret out=test; 
    by date; 
    id var; 
    quit; 

date  totret1 totret2  ...........  totret20 
21/11/2002  .  .       . 
.    
.    .  .       . 
.    .  .    
28/04/2004  .  .        . 

しかし、単に正しい値を持つ;)

+0

%スキャンしているマクロ変数の値が表示されていません。 – Tom

+0

しかし、このステップでは、その時点で転記されているので、私はマクロ内の株式名を必要とする値を望んでいません。私はただ1つの株ペアのコードを最初に書いて、それは働いた。しかし、私はそれをマクロループに変えてからではありません。 –

+2

マクロの外部でマクロ変数を定義することはできますが、あなたの質問にそれらのサンプル値を含める必要があります。同様に、サンプル入力データと望ましい結果を投稿するのに役立ちます。 – Tom

答えて

2

転置の同じアクションをやって20回のループの処理を、簡単な操作、転置、および結果の積み重ねは、おそらく配列を使用できることを示します。私がこのプロセスを理解していれば、があります。マクロを一度に1つずつ、多くの回転で実行する必要はありません。配列を使用

サンプルコード(未テスト):私は質問私の謝罪を誤解している場合は

data want; 
    set all end=end; 
    by date; * for safety, cause error if rows are not in date order; 

    array TRIGGERS trigger1-trigger20; 
    array PRICEDEVS price1-price20; 
    array RETURNDEVS returndev1-returndev20; 
    array IVARS ivar1-ivar20; 
    array TOTRETS totret1-totret20; 

    * process all 20 stocks price info on a day; 
    do index = 1 to 20; 
    if PRICEDEVS[index] >= TRIGGERS[index] then 
     IVARS[index] = 1 
    else 
    if PRICEDEVS[index] <= -TRIGGERS[index] then 
     IVARS[index] = -1; 

    TOTRETS[index] = IVARS[index] * RETURNDEVS[index]; 
    end; 
    keep date totret1-totret20; 
run; 

この種のデータの将来の取り扱いについては、新しい株に新しい列を追加しないことを検討してください。 stockdatetriggerpricedevreturndevtotretという単純なWHERE文で、株式や日付範囲を簡単に選択できるデータのカテゴリ形状に切り替えることを検討してください。

** **

トリガーの命名パターンに従って意味的に名付けられた列の場合には

、pricedev、returndevとあなたが配列されている変数のためのソースコードを生成するためにマクロを使用することができますtotretを追加しました要素。例えば、

  • 株式市場は、日付の概念に値をトリガ:変数名は、常に最新のコンセプトに_t
  • 株式pricedev値である:変数名は常に
  • 日付概念上の株式return_dev値である:変数名日付のコンセプトに常に_r
  • 株式totret値は次のとおりです。あなたは、構造yの有用性をプロセスの高度化を増加する場合、変数名は常に、しかし

を_totretされます今は減少しています。

異なるストックセットを処理するtotretマクロの例。

%let stocks = BNNESR CNNESR XYZFOO ACHOO SYNOJ; 
... data gather process for stocks creates ALL ... 
%totret (data=all, id=mrX_set1, stocks=&stocks) 

%let stocks = GGL IBM ABC MSFT ORCL; 
... data gather process for stocks creates ALL ... 
%totret (data=all, id=mrX_set2, stocks=&stocks) 

呼び出されるマクロは、以前のデータステップの抽象化(テンプレート化バージョン)になります。マクロが呼び出されると、特定のDATAステップのソースコードが生成されます。マクロは、以下の(未テスト)のようになります。

%macro totret (data=, id=, stocks=, out=totret_&id); 

    %local trigger_vars pricedev_vars returndev_vars totret_vars; 
    %local i stock; 

    %* use macro to build up variable name lists; 
    %* the variable names for the concepts of 
    %* trigger, pricedev, returndev, and totret 
    %* must follow the expected naming conventions; 

    %let i = 1; 
    %do %while (%length(%scan(&stocks,&i)) > 0); 
    %let stock = %scan(&stocks,&i); 
              * naming convention; 
              * VVVVVVVVVVVVVVVVV; 
    %let trigger_vars = &trigger_vars &stock._t; 
    %let pricedev_vars = &pricedev_vars &stock; 
    %let returndev_vars = &returndev_vars &stock._r; 
    %let totret_vars = &totret_vars &stock._totret; 

    %let i = %eval (&i + 1); 
    %end; 

    data &OUT; 
    set &DATA end=end; 
    by date; * for safety, cause error if rows are not in date order; 

    array TRIGGERS &trigger_vars; 
    array PRICEDEVS &pricedev_vars; 
    array RETURNDEVS &returndev_vars; 
    array TOTRETS &totret_vars; 
    * array IVARS ivar1-ivar20; * does not need to be arrayified; 

    * process all 20 stocks price info on a day; 
    do index = 1 to DIM(TRIGGERS); 
     if PRICEDEVS[index] >= TRIGGERS[index] then 
     IVARS = 1 
     else 
     if PRICEDEVS[index] <= -TRIGGERS[index] then 
     IVARS = -1; 

     TOTRETS[index] = IVARS * RETURNDEVS[index]; 
    end; 

    keep date &totret_vars; 
    run; 
%mend; 

注:データはプロセスが実行中に処理されている株式のRUN_IDとリストの抽象化のテコもすべき集まります。

あなたはまた、次のような制御データセットに実行スルーパラメータの複数のセットの条件を管理する上で有用性を見つけるかもしれない:再び

run_id, index, stock 
mrX_set1, 1, BNNESR 
mrX_set1, 2, CNNESR 
mrX_set1, 3, XYZFOO 
mrX_set1, 4, ACHOO 
mrX_set1, 5, SYNOJ 
... 
mrX_set2, 1, GGL 
... 
mrX_set2, 5, ORCL 

、長期、データstucturesをリファクタリングを検討しているので、彼らカテゴリ概念として株式を持っている。

+0

ありがとうございました。しかし問題は、変数は実際にはtrigger1またはprivedev1と呼ばれていませんが、私のトリガーのような実際のペア名はBNNESR_tであり、ペアのretdevはBNNESR_rとpricedev BNNESRと呼ばれています。全部で20組。それはdoableです –

+0

しかし、私はずっと25倍もあり、おそらく常に異なったペアを取得するので、異なる名前を持つコード全体を実行します。それで、もし私が思うように動くなら、最高のものになるでしょうので、25の異なるデータセットにトートレットを保存することができます –

+0

ARRAYステートメントの変数のリストを、使用していた変数名のスペースで区切られたリストあなたのマクロ。 '配列トリガー&トリガー;' – Tom

関連する問題