Преобразование ежедневных данных в недельные данные в SAS - PullRequest
0 голосов
/ 18 марта 2019

У меня ЕЖЕДНЕВНАЯ доходность отраслевых портфелей в SAS.

Я хотел бы рассчитать ЕЖЕНЕДЕЛЬНЫЕ доходы.

Ежедневная доходность в процентах, поэтому я думаю, что это должна быть просто сумма возвратов за каждую неделю.

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

Таблица, которую я имею в SAS, имеет следующий формат:

INDUSTRY_NUMBER DATE DAILY_RETURN 

Любая помощь будет принята с благодарностью.

Я пробовал это:

proc expand data=Day_result
out=Week_result from=day to=week;
Industry_Number Trading_Date;
convert Value_weighted_return / method=aggregate observed=total;
run;

Ежедневные данные находятся в Day_Result, когда я удаляю четвертую строку, т.е.

proc expand data=Day_result
out=Week_result from=day to=week;
convert Value_weighted_return / method=aggregate observed=total;
run;

Это работает так же, как и эточто я хочу, чтобы он делал, но он делает это не для каждой категории, а для всей таблицы.

Так что, если у меня есть 40 категорий, я хочу еженедельный доход для каждой категории.

Второй набор кодов обеспечивает еженедельный доход для каждой категории.

ПРИМЕРНЫЕ ДАННЫЕ:

data have;
    format trading_date date9.;
    infile datalines dlm=',';
    input trading_date:ddmmyy10. industry_number value_weighted_return;
    datalines;
19/01/2000,1, -0.008
20/01/2000,1, 0.008
23/01/2000,1, 0.008
24/01/2000,1, -0.007
25/01/2000,1, -0.009
26/01/2000,1, 0.008
27/01/2000,1, -0.008
30/01/2000,1, 0.003
31/01/2000,1, -0.001
01/02/2000,1, 0.004
02/02/2000,2, -0.008
03/02/2000,2, -0.005
06/02/2000,2, -0.004
07/02/2000,2, -0.009
08/02/2000,2, 0.002
09/02/2000,2, 0.006
10/02/2000,2, 0.008
13/02/2000,2, 0.008
14/02/2000,2, 0.002
15/02/2000,2, 0.01
16/02/2000,2, -0.008
;
run;

1 Ответ

0 голосов
/ 19 марта 2019

Сортируйте данные по INDUSTRY_NUMBER Trading_Date, используйте INDUSTRY_NUMBER в качестве группы, определите вашу временную переменную.

proc sort data=have;
    by industry_number trading_date;
run;

Затем преобразуйте данные во временные ряды, чтобы устранить любые временные промежутки,Установите любые пропущенные дни в качестве предыдущего значения, поскольку оно не изменяется в эти торговые дни (например, выходные, праздничные дни и т. Д.).

proc timeseries data=have
                out=have_ts;
    by industry_number;
    id trading_date interval=day 
                    setmissing=previous
                    accumulate=average
    ;

    var value_weighted_return;
run;

Наконец, возьмите выходные данные временного ряда и конвертируйте их из дняна неделю.Поскольку вы используете веса, вы можете использовать average вместо total.

proc expand data=have_ts
            out=have_ts_week
            from=day
            to=week
    ;
    by industry_number;
    id trading_date;

    convert Value_weighted_return / method=aggregate observed=average;
run;
...