簡體   English   中英

如何為每個單獨的交易日 (TAQ) 數據創建一個 SAS 數據集並將它們保存到文件中

[英]How to create a SAS dataset for each individual trading day (TAQ) data and save them to a file

我有一個月的每日交易數據(TAQ 數據)。 我正在嘗試解壓縮它們中的每一個。 該文件夾的名稱是 EQY_US_ALL_TRADE_202107。 每個交易日都有幾個壓縮(GZ 文件)文件,名為 EQY_US_ALL_TRADE_202210701 EQY_US_ALL_TRADE_202210702 EQY_US_ALL_TRADE_202210703 ... EQY_US_ALL_TRADE_202210729

我想為每一天創建一個 SAS 數據集並將它們保存到一個文件中。 據我所知,我需要通過一個月的每日 TAQ 數據循環到 go 並計算交易持續時間,然后將相關數據保存到一個文件中,這樣每個保存的數據集都會很小,然后我必須將它們全部匯總起來。 為了計算交易持續時間,我只取“DATETIME”變量的差值(例如 dif(datetime))

到目前為止,我一直在創建一個工作目錄 (D:\MainDataset) 並從解壓縮文件開始在其中進行計算。 但它占用了太多時間和磁盤空間。 我需要為每個交易日創建單獨的數據集並將其保存到文件中。

    data "D:\MainDataset" (keep= filename time exchange symbol saleCondition tradeVolume tradePrice   tradeStopStock
            tradeCorrection sequenceNumber tradeId sourceOfTrade tradeReportingFacility 
            participantTimeStamp tradeReportingFacilityTimeStamp); 
     length folderef $8 time $15. exchange $1. symbol $17. saleCondition $4. tradeStopStock $1.
            sourceOfTrade $1. tradeReportingFacility $1. 
            participantTimeStamp $15. tradeReportingFacilityTimestamp $15.;

    rc=filename(folderef,"D:\EQY_US_ALL_TRADE_202107");
    did = dopen(folderef);
    putlog did=;
    /* do k = 1 to dnum(did);   Use this to run the loop over all files in the folder */
    do k = 1 to 3;   
    filename = dread(did,k);
    putlog filename=;
    if scan(filename,-1,'.') ne 'gz' then continue;
    fullname = pathname(folderef) || '\' || filename;
    putlog fullname=;

    do while(1);
    infile archive zip filevar=fullname gzip dlm='|' firstobs=2 obs=5000000 dsd truncover eof=nextfile;
    input time exchange symbol saleCondition tradeVolume tradePrice tradeStopStock
            tradeCorrection sequenceNumber tradeId sourceOfTrade tradeReportingFacility 
            participantTimeStamp tradeReportingFacilityTimeStamp;
    output;
    end;
    nextfile:
    end;
    stop;
    run;
    Proc contents data = "D:\MainDataset";
run;

proc print data ="D:\MainDataset" (obs = 110);
run;

%let nsPerSec=1e9; /*nanoseconds per second*/
%let sPerMin=60; /*seconds per minute*/
%let sPerHr=3600; /*seconds per hour*/
%let tdStart=9*&sPerHr*&nsPerSec+30*&sPerMin*&nsPerSec; /*09:30 am EST. Regular trading hours start*/
%let tdEnd=16*&sPerHr*&nsPerSec; /*16:00 EST. Regular trading hours end*/

/*Sample new variables defined on data read into "test"*/
data test1; /*3 seconds*/
    set "D:\MainDataset" (keep = time exchange symbol saleCondition tradeVolume tradePrice tradeStopStock
            tradeCorrection sequenceNumber tradeId sourceOfTrade tradeReportingFacility 
            participantTimeStamp tradeReportingFacilityTimeStamp filename); /*imports that sas dataset "test" that is created in the block above*/
    where symbol in ('AXP' 'AMGN' 'AAPL' 'BA' 'CAT' 'CSCO' 'CVX' 'GS' 'HD' 'HON'
        'IBM' 'INTC' 'JNJ' 'KO' 'JPM' 'MCD' 'MMM' 'MRK' 'MSFT' 'NKE' 'PG' 'TRV' 'UNH' 
        'CRM' 'VZ' 'V' 'WBA' 'WMT' 'DIS' 'DOW'); /*Keeps only observations with current Dow Jones stocks*/
    hr=substr(time,1,2); /*hour*/
    min=substr(time,3,2); /*minute*/
    sec=substr(time,5,2); /*second*/
    ns=substr(time,7,9); /*nanosecond*/
    secNs=sec+ns/1e9; /*Format sec.nanoseconds*/
    inDayTime=hr*&sPerHr*&nsPerSec+min*&sPerMin*&nsPerSec+sec*&nsPerSec+ns; 
        /*intrday time in nanoseconds from midnight (00:00).*/
    if inDayTime>&tdStart; /*keeps only observations after 09:30 EST*/
    if inDayTime<&tdEnd; /*keeps only observations less than 16:00 EST*/
    dur=dif(inDayTime)/&nsPerSec; /*time duration between trades in seconds*/
    rollBAS=(tradePrice-lag(tradePrice))*(lag(tradePrice)-lag2(tradePrice)); /*Roll autocovariance.  take BAS=sqrt(-ACF)*/
    /*... Create datetime variable*/
    yr = substr(filename,18,4);
    mo = substr(filename,22,2);
    d  = substr(filename,24,2);
    date= yr || mo || d; /*creates sas date variable*/
    datetime=hms(hr,min,secNS); /*creates sas datetime variable with nanoseconds*/
    duration= dif(datetime);
    run;
    
    Data test1 ;
    Set test1;
    if duration < 0    
    then duration_m = 0;  
    else duration_m = duration;  
    run;

創建代碼來處理一個文件。 可能編碼為一個宏,它將要讀取的文件的名稱和要創建的數據集的名稱作為輸入。

%macro taq(infile,dataset);
data &dataset;
  infile "&infile" zip gzip dsd dlm='|' truncover firstobs=2;
  ....
run;
%mend taq;

然后生成一個數據集,其中包含要讀取的文件的名稱以及您要從中創建的數據集名稱。 所以也許是這樣的:

%let ym=202107;
%let folder=D:\EQY_US_ALL_TRADE_&ym;

data taq_files;
  length dataset $32 filename $256 ;
  keep dataset filename;
  rc=filename('folder',"&folder");
  did=dopen('folder');
  do fnum=1 to dnum(did);
    filename=catx('\',"&folder",dread(did,fnum));
    dataset=scan(filename,-2,'./\');
    if 'gz'=lowcase(scan(filename,-1,'.')) then output;
  end;
  did=dclose(did);
  rc=filename('folder');
run;

現在您有了文件列表,您可以使用它為每個文件調用一次宏。

data _null_;
  set taq_files;
  call execute(cats('%nrstr(%taq)(',filename,',',dataset,')'));
run;

宏的主體可以包含代碼,以從分隔文件中讀取值並計算所需的任何新變量。 根據您目前展示的內容,無需分多個步驟執行此操作。

您將時間戳字符串轉換為時間值的邏輯似乎過於復雜。 只需使用與文件中字符串樣式匹配的信息。 例如,如果字符串以表示 HHMMSS 的 6 位數字開頭,則使用 HHMMSS6 讀取它。 信息格式。 如果文件名具有 YYYYMMDD 樣式的數字字符串,則使用 YYMMDD8 讀取它。 信息格式。

請注意,壓縮到 2GB 的文本文件將生成一個可能大 10 到 30 倍的數據集。 您可能希望將各個數據集定義為視圖,而不是通過更改 DATA 語句來避免使用該空間:

data &dataset / view=&dataset ;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM