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