ОШИБКА: Обнаружен символьный операнд в функции %EVAL или условии %IF, где требуется числовой операнд

У меня возникают ошибки, как показано ниже.

ОШИБКА: Обнаружен символьный операнд в функции %EVAL или условии %IF, где требуется числовой операнд. Условие было: &N_GROUP

ОШИБКА: значение %TO цикла %DO I недопустимо.

ОШИБКА: макрос 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);

Любые комментарии приветствуются. Спасибо.


person Jay    schedule 03.11.2017    source источник
comment
Вы можете добавить некоторые из многих вещей, которые вы пытались исправить, чтобы у вас не было повторяющихся предложений, чтобы попробовать.   -  person IncredibleHat    schedule 03.11.2017
comment
Работая локально, вы подключаетесь к серверу WRDS через RSUBMIT/SIGNON, но если вы работаете на сервере, вам не нужны эти операторы, не так ли? Я не уверен на 100%, как он устроен. Можете ли вы добавить options mprint symbolgen mlogic; в свой код, отправить его и опубликовать полный журнал с сообщением об ошибке.   -  person Reeza    schedule 03.11.2017
comment
Спасибо за совет, а также за то, что сообщили мне варианты, которые я не знал раньше. Ваш совет сработал так же хорошо, как и совет Тома!   -  person Jay    schedule 03.11.2017


Ответы (1)


Этот макрос предназначен для работы на ЛОКАЛЬНОЙ машине, поскольку он включает в себя блоки SIGNON и RSUBMIT/ENDRSUBMIT.

Но вы ссылаетесь на переменную макроса N_GROUP, которая была создана на удаленной машине с помощью предложения SQL INTO. Я предполагаю, что это причина сообщений об ошибках.

Либо определите макрос для запуска на удаленном компьютере, либо используйте %SYSRPUT, чтобы переместить значение переменной макроса обратно на локальный компьютер, чтобы вы могли использовать его для управления циклом %DO.

person Tom    schedule 03.11.2017
comment
Большое спасибо, Том! Определение макроса на удаленном сервере сработало. Как же я не подумал об этом! А также, пока я искал другие решения относительно макропеременных как для удаленных, так и для локальных настроек, я нашел ссылку ниже, которая может быть полезна для других пользователей, а также для меня. documentation.sas.com/ Еще раз спасибо. - person Jay; 03.11.2017