【问题标题】:ERROR: A character operand was found in the %EVAL function or %IF condition where a numeric operand is required错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数
【发布时间】:2017-11-03 01:12:15
【问题描述】:

我遇到以下错误。

错误:在需要数字操作数的 %EVAL 函数或 %IF 条件中找到字符操作数。条件是:&N_GROUP

错误:%DO I 循环的 %TO 值无效。

错误:宏 ORDERFLOW 将停止执行。

当我在没有远程提交的情况下在本地测试它时,它起作用了。但它不适用于 WRDS 服务器。我尝试了很多方法来解决此问题,但无法找出问题所在。

这是我的代码。仅供参考,这是一个更大的试验代码。

%macro orderflow(YYYYMMDD=, CUTOFF=) /des = "Create OrderFlow"; 

%syslput YYYYMMDD = &YYYYMMDD;
%syslput CUTOFF = &CUTOFF;

%let wrds = wrds.wharton.upenn.edu 4016;
options comamid=TCP;
signon wrds username=_prompt_;

rsubmit;

/* Enter your WRDS institution name and your WRDS username */
options errors=2;

/* STEP 1: RETRIEVE DAILY TRADE AND QUOTE (DTAQ) FILES */
    libname nbbo '/wrds/nyse/sasdata/taqms/nbbo';
    libname cq '/wrds/nyse/sasdata/taqms/cq';
    libname ct '/wrds/nyse/sasdata/taqms/ct';
    libname mast '/wrds/nyse/sasdata/taqms/mast';

    /* Create StockList each having 100 stocks */
    proc sql noprint;
    select  ceil(count(SYMBOL_ROOT)/&CUTOFF)    into :N_GROUP     
    from  mast.mastm_&YYYYMMDD
    where  LISTED_MARKET in ('A' 'N' 'T' 'Q')   /* AMEX, NYSE, NASDAQ */
    and  TAPE = 'A'                         /* Common stock */     
    ; quit;
    
    %do i=1 %to &N_GROUP;
        %global STOCKLIST&i;
        proc sql noprint;
        select  SYMBOL_ROOT  into :STOCKLIST&i  separated by '" "'
        from  mast.mastm_&YYYYMMDD
        where  LISTED_MARKET in ('A' 'N' 'T' 'Q')   /* AMEX, NYSE, NASDAQ */
        and  TAPE = 'A'                             /* Common stock */
        and  monotonic() between &cutoff*(&i-1)+1 and &cutoff*&i
        ; quit;


    /* Retrieve NBBO data */
    data DailyNBBO;

        /* Enter NBBO file names in YYYYMMDD format for the dates you want */
        set nbbo.nbbom_&YYYYMMDD;

        /* Enter company tickers you want */
        where sym_root in ("&&STOCKLIST&i") and 

        /* Quotes are retrieved prior to market open time to ensure NBBO 
           Quotes are available for beginning of the day trades */
        (("9:00:00.000000000"t) <= time_m <= ("9:30:00.000000000"t));
        format date date9.;
        format time_m part_time trf_time TIME20.9;
    run;

    /* Retrieve Quote data */
    data DailyQuote;

        /* Enter Quote file names in YYYYMMDD format for the same dates */
        set cq.cqm_&YYYYMMDD;

        /* Enter the same company tickers as above */
        where sym_root in ("&&STOCKLIST&i") and 

        /* Quotes are retrieved prior to market open time to ensure NBBO 
           Quotes are available for beginning of the day trades*/
        (("9:00:00.000000000"t) <= time_m <= ("9:30:00.000000000"t));
        format date date9.;
        format time_m part_time trf_time TIME20.9;
    run;

    /* Retrieve Trade data */
    data DailyTrade;

        /* Enter Trade file names in YYYYMMDD format for the same dates */
        set ct.ctm_&YYYYMMDD;

        /* Enter the same company tickers as above */
        where sym_root in ("&&STOCKLIST&i") and 

        /* Retrieve trades during normal market hours */
        (("9:30:00.000000000"t) <= time_m <= ("9:30:00.000000000"t));
        type='T';
        format date date9.;
        format time_m part_time trf_time TIME20.9;
    run;

    /* Download to PC */
    proc download data=DailyNBBO out=taq.DailyNBBO_&&YYYYMMDD&i;     run;
    proc download data=DailyQuote out=taq.DailyQuote_&&YYYYMMDD&i;     run;
    proc download data=DailyTrade out=taq.DailyTrade_&&YYYYMMDD&i;     run;

%end;
%mend orderflow;
%orderflow(YYYYMMDD=20141224,CUTOFF=100);

感谢任何 cmets。谢谢。

【问题讨论】:

  • 您可以添加一些您尝试修复它的东西,这样您就不会得到一些重复的建议来尝试。
  • 在本地运行时,您通过 RSUBMIT/SIGNON 连接到 WRDS 服务器,但如果您在服务器上运行,则不需要这些语句,对吗?我不是 100% 确定它是如何设置的。您能否将options mprint symbolgen mlogic; 添加到您的代码中,提交并发布带有错误消息的完整日志。
  • 感谢您的建议,也感谢您让我知道我以前不知道的选项。你的建议和汤姆的一样有效!

标签: sas wrds


【解决方案1】:

此宏被构造为在 LOCAL 机器上运行,因为它包含 SIGNON 和 RSUBMIT/ENDRSUBMIT 块。

但是您正在引用通过 SQL INTO 子句在远程计算机上创建的宏变量 N_GROUP。我认为这是错误消息的原因。

要么定义要在远程机器上运行的宏,要么使用%SYSRPUT 将宏变量值移回本地机器,以便您可以使用它来控制%DO 循环。

【讨论】:

  • 非常感谢你,汤姆!在远程服务器上定义宏有效。我怎么没想到!而且,当我在寻找有关远程和本地设置的宏变量的其他解决方案时,我发现下面的链接可能对其他用户和我都有用。 documentation.sas.com/… 再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多