Code:
local todrop
use TF_Short_10Y_5BP_US_end.dta compress save TF_Short_10Y_5BP_US_end.dta, replace
clear all
set seed 431
set maxvar 10000
input float(Tradenumb start_date duration)
44 14444 444
187 14714 1621
end
format %tdDayDDmonCCYY start_date
expand duration
bysort Tradenumb : gen Date = start_date + _n - 1
format %tdDayDDmonCCYY Date
drop if inlist(dow(Date), 0, 6) // Sunday and Saturday
drop start_date duration
isid Tradenumb Date, sort
foreach v in Treasury Swap LIBOR LIBOR_discount Repo {
gen `v' = runiform()
}
forvalues i = 0/3600 {
gen DT__`i' = 1 / (1 + runiform(.055,.065)/360)^`i'
gen DS__`i' = 1 / (1 + runiform(.065,.075)/360)^`i'
}
save "test_data.dta", replace
replace Treasury_coupon_11_date = trade_start_date + 1980 if Tradenumb == `i' replace Swap_coupon_11_date = trade_start_date + 1980 if Tradenumb == `i'
use "test_data.dta", clear
* verify assumptions about the data
isid Tradenumb Date, sort
* the day of each observation relative to the first trade date
by Tradenumb: gen tday = Date - Date[1]
by Tradenumb: gen LIBOR_coupon_date = Date[1] + 90 * (ceil(tday/90))
by Tradenumb: gen REPO_reset_date = Date[_n-1]
format %td LIBOR_coupon_date REPO_reset_date
* copy relevant DT_* DS_* values at half-year coupon dates
qui forvalues i = 1/20 {
local periods = `i' * 180
by Tradenumb: gen target_`i' = `periods' - tday
gen Treasury_disc_`i' = 1
gen Swap_disc_`i' = 1
forvalues j = 1/`periods' {
replace Treasury_disc_`i' = DT__`j' if target_`i' == `j'
replace Swap_disc_`i' = DS__`j' if target_`i' == `j'
}
}
drop DT_* DS_*
save "faster.dta", replace
ds target_* tday, not
cf `r(varlist)' using slow_code.dta, all
. cf `r(varlist)' using slow_code.dta, all
Tradenumb: match
Date: match
Treasury: match
Swap: match
LIBOR: match
LIBOR_discount: match
Repo: match
LIBOR_coupon_d~e: 2 mismatches
REPO_reset_date: match
Treasury_disc_1: match
Swap_disc_1: match
Treasury_disc_2: match
Swap_disc_2: match
Treasury_disc_3: match
Swap_disc_3: match
Treasury_disc_4: match
Swap_disc_4: match
Treasury_disc_5: match
Swap_disc_5: match
Treasury_disc_6: match
Swap_disc_6: match
Treasury_disc_7: match
Swap_disc_7: match
Treasury_disc_8: match
Swap_disc_8: match
Treasury_disc_9: match
Swap_disc_9: match
Treasury_disc_10: match
Swap_disc_10: match
Treasury_disc_11: match
Swap_disc_11: match
Treasury_disc_12: match
Swap_disc_12: match
Treasury_disc_13: match
Swap_disc_13: match
Treasury_disc_14: match
Swap_disc_14: match
Treasury_disc_15: match
Swap_disc_15: match
Treasury_disc_16: match
Swap_disc_16: match
Treasury_disc_17: match
Swap_disc_17: match
Treasury_disc_18: match
Swap_disc_18: match
Treasury_disc_19: match
Swap_disc_19: match
Treasury_disc_20: match
Swap_disc_20: match
// US 10Y 10BP SHORT
clear all
quietly {
use TF_Short_10Y_10BP_US_end.dta
forval j = 1/19 {
gen Treasury_coupon_`j' = Treasury
}
gen Treasury_coupon_20 = Treasury + 100
forval j = 1/19 {
gen Swap_coupon_`j' = Swap
}
gen Swap_coupon_20 = Swap + 100
gen LIBOR_coupon = LIBOR + 100
forval j = 1/20 {
gen Treasury_disc_`j' = 1
gen Swap_disc_`j' = 1
gen Treasury_coupon_`j'_date =.
gen Swap_coupon_`j'_date =.
}
gen LIBOR_coupon_date = .
gen REPO_reset_date =.
quietly bysort Tradenumb (Date) : gen trade_start_date = Date[1]
quietly bysort Tradenumb (Date) : gen trade_end_date = Date[_N]
forval j = 1/20 {
local J = 180 * `j'
replace Treasury_coupon_`j'_date = trade_start_date + `J'
replace Swap_coupon_`j'_date = trade_start_date + `J'
}
gen y = Date - trade_start_date
gen z= 90*ceil(y / 90)
replace z = 90 if z == 0
replace LIBOR_coupon_date = trade_start_date + z
drop y z
replace REPO_reset_date = Date[_n-1] if Date <= trade_end_date
replace REPO_reset_date =. if Date == trade_start_date
set tracedepth 1
set trace on
forvalues j= 0/3600 {
forval k = 1/20 {
replace Treasury_disc_`k' = DT__`j' if Treasury_coupon_`k'_date - Date == `j'
replace Swap_disc_`k' = DS__`j' if Swap_coupon_`k'_date - Date == `j'
}
local todrop `todrop' DT__`j' DS__`j'
}
drop `todrop'
}
save TF_Short_10Y_10BP_US_last.dta, replace
Comment