Среднее слияние временного ряда, соответствующего промежутку времени в другом наборе данных

У меня есть два набора данных, один с контрактами и один с рыночными ценами. Суть того, что я пытаюсь выполнить, - найти среднее значение временного ряда, соответствующего периоду времени, в наборе данных поперечного сечения. Пожалуйста, смотрите ниже.

Пример набора данных 1:

Beginning Ending    Price
1/1/2014  5/15/2014 $19.50
3/2/2012  10/9/2015 $20.31
...
1/1/2012 1/8/2012 $19.00

В приведенном выше примере есть несколько контрактов, первый из которых охватывает период с января 2014 года по май 2014 года, второй - с марта 2012 года по октябрь 2015 года. Каждый из них имеет свою цену. Второй набор данных имеет еженедельные рыночные цены.

Пример набора данных 2:

Date     Price
1/1/2012 $18
1/8/2012 $17.50
....
1/15/2015 $21.00

Я хотел бы найти среднюю "рыночную цену" (то есть среднее значение цены в наборе данных 2) между начальным и конечным периодом для каждого контракта в наборе данных 1. Итак, для третьего контракта с 01.01.2012 по 1/8/2012, из второго набора данных результат будет (18+17,50)/2 = 17,75. Затем объедините это значение с исходным набором данных.

Я работаю со Stata, но также могу работать с R или Excel.

Кроме того, если у вас есть лучшее предложение для названия, я был бы очень признателен!

1 ответ

Решение

Вы можете пересекать данные сечения контрактов с временным рядом, который образует каждую попарную комбинацию, отбрасывать цены за пределами диапазона дат и вычислять среднее значение следующим образом:

/* Fake Data */
tempfile ts ccs

clear
input str9 d p_daily
"1/1/2012" 18
"1/8/2012" 17.50
"1/15/2015" 21.00 
end
gen date = date(d,"MDY")
format date %td
drop d
rename date d
save `ts'
clear
input id str8 bd str9 ed p_contract
1 "1/1/2014"  "5/15/2014" 19.50
2 "3/2/2012"  "10/9/2015" 20.31
3 "1/1/2012"  "1/8/2012" 19.00
end
foreach var of varlist bd ed {
    gen date = date(`var',"MDY")
    format date %td
    drop `var'
    rename date `var'
}
save `ccs'

/* Calculate Mean Prices and Merge Contracts Back In */
cross using `ts'
sort id d
keep if d >= bd & d <=ed
collapse (mean) mean_p = p_daily, by(id bd ed p_contract)
merge 1:1 id using `ccs', nogen
sort id

Это дает вам что-то вроде этого:

  id   p_contract          bd          ed   mean_p  
     1       19.5   01jan2014   15may2014        .  
     2      20.31   02mar2012   09oct2015       21  
     3         19   01jan2012   08jan2012    17.75  
Другие вопросы по тегам