 import excel "python处理后用于回归的数据集.xlsx", sheet("一级发行") firstrow

 //删除重要变量缺失的样本
 egen mis = rowmiss( 发行总额 债券期限 发行利差 地级市GDP 省级GDP 第三产业比重 财政平衡指标 省级存量债务 资产负债率 盈利能力 流动比率 长期负债占比 评级)
 drop if mis

 gen province_gdp = ln(省级GDP)
 gen city_gdp = ln(地级市GDP)
 gen province_debt = ln(省级存量债务)

 //声明控制变量
 global control "city_gdp province_gdp province_debt 发行总额 债券期限 评级 财政平衡指标 第三产业比重 资产负债率 盈利能力 流动比率 长期负债占比 含权"

 //缩尾处理，剔除异常值
 winsor2 $control, replace cuts (1,99)
 winsor2 发行利差, replace cuts (1,99)

 //生成省份和城市ID
 egen province_id = group(省份)
 egen city_id = group(城市)


//基准回归分析

reg 发行利差 发债之前是否发生过非标违约 $control if 违约省份 == 1, r
 est store m1

reg 发行利差 发债之前是否发生过非标违约 $control i.上市年份  if 违约省份 == 1, r
 est store m2

 reg 发行利差 发债之前是否发生过非标违约 $control i.上市年份 i.province_id if 违约省份 == 1, r
 est store m3

 reg2docx m1 m2 m3 using table1.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))


//传染效应分析

//非标违约在城市内的传染效应
 reg 发行利差 所在城市1年内发生过非标违约 所在城市12年内发生过非标违约 所在城市23年内发生过非标违约 所在城市3年以外发生过非标违约 $control i.上市年份 i.province_id if 发债之前是否发生过非标违约 == 0,cluster(城市)
est store m1


//非标违约在城市间的传染效应

//本城市未发生非标违约，但同省其他城市发生非标违约
 gen 同省份其他城市1年内发生过非标违约 = 所在省份1年内发生过非标违约 - 所在城市1年内发生过非标违约
 gen 同省份其他城市12年内发生过非标违约 = 所在省份12年内发生过非标违约 - 所在城市12年内发生过非标违约
 gen 同省份其他城市23年内发生过非标违约 = 所在省份23年内发生过非标违约 - 所在城市23年内发生过非标违约
 gen 同省份其他城市3年以外发生过非标违约 = 所在省份3年以外发生过非标违约 - 所在城市3年以外发生过非标违约

//所在城市是否发生过非标违约
gen treat = 0
replace treat = 1 if 所在城市1年内发生过非标违约 == 1| 所在城市12年内发生过非标违约 == 1| 所在城市23年内发生过非标违约 == 1| 所在城市3年以外发生过非标违约 == 1


reg 发行利差 同省份其他城市1年内发生过非标违约 同省份其他城市12年内发生过非标违约 同省份其他城市23年内发生过非标违约 同省份其他城市3年以外发生过非标违约 ///
 $control i.上市年份 i.province_id if treat == 0 & 发债之前是否发生过非标违约 == 0 , cluster(省份)
 est store m2

//非标风险提示在城市内的传染效应

reg 发行利差 所在城市1年内发生过非标风险提示 所在城市12年内发生过非标风险提示 所在城市23年内发生过非标风险提示 所在城市3年以外发生过非标风险提示 $control  i.上市年份 i.province_id if 发债之前是否发生过风险提示 == 0, cluster(城市)
 est store m3

//非标风险提示在城市间的传染效应


//本城市未发生非标风险提示，但同省其他城市发生非标风险提示
gen 同省份其他城市1年内发生过非标风险提示 = 所在省份1年内发生过非标风险提示 - 所在城市1年内发生过非标风险提示
gen 同省份其他城市12年内发生过非标风险提示 = 所在省份12年内发生过非标风险提示 - 所在城市12年内发生过非标风险提示
gen 同省份其他城市23年内发生过非标风险提示 = 所在省份23年内发生过非标风险提示 - 所在城市23年内发生过非标风险提示
gen 同省份其他城市3年以外发生过非标风险提示 = 所在省份3年以外发生过非标风险提示 - 所在城市3年以外发生过非标风险提示


//所在城市是否发生过非标风险提示
gen treat1 = 0
replace treat1 = 1 if 所在城市1年内发生过非标风险提示 == 1|所在城市12年内发生过非标风险提示 == 1|所在城市23年内发生过非标风险提示 == 1|所在城市3年以外发生过非标风险提示 == 1


reg 发行利差 同省份其他城市1年内发生过非标风险提示 同省份其他城市12年内发生过非标风险提示 同省份其他城市23年内发生过非标风险提示 同省份其他城市3年以外发生过非标风险提示 $control i.上市年份 i.province_id if treat1 == 0 &发债之前是否发生过风险提示 == 0 , cluster(省份)
 est store m4


reg2docx m1 m2 m3 m4 using table2.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))


//异质性检验

//评级的异质性检验

global control1 "city_gdp province_gdp province_debt 发行总额 债券期限 财政平衡指标 第三产业比重 资产负债率 盈利能力 流动比率 长期负债占比 含权"

gen high_rate = 0
replace high_rate = 1 if 评级 > 9
gen high_treat = treat*high_rate

reg 发行利差 treat high_rate high_treat $control1 i.上市年份 i.province_id if 违约省份 == 1 & 发债之前是否发生过非标违约 == 0, r

est store m1

//行政等级的异质性检验

gen muni = 0
gen province = 0
replace muni = 1 if 城投行政级别Wind == "地市"|城投行政级别Wind == "地市(开发区)"
replace province = 1 if 城投行政级别Wind == "省"|城投行政级别Wind == "省(开发区)"

gen muni_treat = muni*treat
gen province_treat = province*treat

reg 发行利差 treat muni province muni_treat province_treat $control i.上市年份 i.province_id if 违约省份 == 1 & 发债之前是否发生过非标违约 == 0, r

est store m2


//平台重要性的异质性检验

egen mis1 = rowmiss(平台重要性)

gen main = 0
replace main = 1 if 平台重要性 == "主要平台"
gen main_treat = treat*main

reg 发行利差 treat main main_treat $control i.上市年份 i.province_id if 违约省份 == 1 & 发债之前是否发生过非标违约 == 0 & mis1 == 0, r

est store m3

reg2docx m1 m2 m3 using table3.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))


//******稳健性检验

//将核心解释变量由虚拟变量替换为数量型变量

reg 发行利差 发债前发生过非标违约的次数 $control if 违约省份 == 1, r
 est store m1

reg 发行利差 发债前发生过非标违约的次数 $control i.上市年份  if 违约省份 == 1, r
 est store m2

 reg 发行利差 发债前发生过非标违约的次数 $control i.上市年份 i.province_id if 违约省份 == 1, r
 est store m3


//基于不同违约数量检验传染效应的强度差异
 gen 所在城市1年内发生过1次非标违约 = 0
 gen 所在城市1年内发生过2次非标违约 = 0
 gen 所在城市1年内发生过3次以上非标违约 = 0

 replace 所在城市1年内发生过1次非标违约 = 1 if 所在城市1年内发生过非标违约的次数 == 1
 replace 所在城市1年内发生过2次非标违约 = 1 if 所在城市1年内发生过非标违约的次数 == 2
 replace 所在城市1年内发生过3次以上非标违约 = 1 if 所在城市1年内发生过非标违约的次数 >= 3

 reg 发行利差 所在城市1年内发生过1次非标违约 所在城市1年内发生过2次非标违约 所在城市1年内发生过3次以上非标违约 $control i.上市年份 i.province_id if 发债之前是否发生过非标违约 == 0,cluster(城市)
 est store m4

 reg2docx m1 m2 m3 m4 using table4.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))


//安慰剂检验

permute 发债之前是否发生过非标违约 beta = _b[发债之前是否发生过非标违约] se = _se[发债之前是否发生过非标违约] df = e(df_r), reps(500) rseed(123) saving("simulations.dta"):reg 发行利差 发债之前是否发生过非标违约 $control i.上市年份 i.province_id if 违约省份 == 1, r

**绘制回归系数的分布图

 use "simulations.dta", clear
gen t_value = beta / se
gen p_value = 2 * ttail(df, abs(beta/se))

#delimit ;
dpplot beta,
 xline(0.913, lc(black*0.5) lp(dash))
 xline(0, lc(black*0.5) lp(solid))
 xlabel(-0.5(0.1)1)
    xtitle("Coefficient of Default", size(*0.8)) xlabel(, format(%4.1f) labsize(small))
    ytitle("Density", size(*0.8)) ylabel(, nogrid format(%4.1f) labsize(small))
    note("") caption("") graphregion(fcolor(white)) ;
#delimit cr


//利用PSM方法对违约样本进行匹配

 *- 设置图片输出样式

graph set window fontface     "Times New Roman"
graph set window fontfacesans "宋体"
set scheme s1color

psmatch2 treat $control , outcome(发行利差) logit neighbor(2) ties common ate caliper(0.05)

pstest, both graph saving(balancing_assumption, replace)
graph export "balancing_assumption.emf", replace

**# 1.3 倾向得分值的核密度图

sum _pscore if treat == 1, detail  // 处理组的倾向得分均值为 0.1763072

*- 匹配前

sum _pscore if treat == 0, detail

twoway(kdensity _pscore if treat == 1, lpattern(solid)                     ///
              lcolor(black)                                                  ///
              lwidth(thin)                                                   ///
              scheme(qleanmono)                                              ///
              ytitle("{stSans:核}""{stSans:密}""{stSans:度}",                ///
                     size(medlarge) orientation(h))                          ///
              xtitle("{stSans:匹配前的倾向得分值}",                          ///
                     size(medlarge))                                         ///
              xline(0.1763072   , lpattern(solid) lcolor(black))                ///
              xline(`r(mean)', lpattern(dash)  lcolor(black))                ///
              saving(kensity_cs_before, replace))                            ///
      (kdensity _pscore if treat == 0, lpattern(dash)),                    ///
      xlabel(     , labsize(medlarge) format(%02.1f))                        ///
      ylabel(0(1)4, labsize(medlarge))                                       ///
      legend(label(1 "{stSans:处理组}")                                      ///
             label(2 "{stSans:控制组}")                                      ///
             size(medlarge) position(1) symxsize(10))

graph export "kensity_cs_before.emf", replace

discard

*- 匹配后

sum _pscore if treat == 0 & _weight != ., detail

twoway(kdensity _pscore if treat == 1, lpattern(solid)                     ///
              lcolor(black)                                                  ///
              lwidth(thin)                                                   ///
              scheme(qleanmono)                                              ///
              ytitle("{stSans:核}""{stSans:密}""{stSans:度}",                ///
                     size(medlarge) orientation(h))                          ///
              xtitle("{stSans:匹配后的倾向得分值}",                          ///
                     size(medlarge))                                         ///
              xline(0.5632   , lpattern(solid) lcolor(black))                ///
              xline(`r(mean)', lpattern(dash)  lcolor(black))                ///
              saving(kensity_cs_after, replace))                             ///
      (kdensity _pscore if treat == 0 & _weight != ., lpattern(dash)),     ///
      xlabel(     , labsize(medlarge) format(%02.1f))                        ///
      ylabel(0(1)4, labsize(medlarge))                                       ///
      legend(label(1 "{stSans:处理组}")                                      ///
             label(2 "{stSans:控制组}")                                      ///
             size(medlarge) position(1) symxsize(10))

graph export "kensity_cs_after.emf", replace



psmatch2 发债之前是否发生过非标违约 $control , outcome(发行利差) logit neighbor(2) ties common ate caliper(0.05)
 reg 发行利差 发债之前是否发生过非标违约  $control i.上市年份 i.province_id if _weight != .,r
est store m1


 psmatch2 发债之前是否发生过非标违约 $control , outcome(发行利差) logit neighbor(4) ties common ate caliper(0.05)
 reg 发行利差 发债之前是否发生过非标违约  $control i.上市年份 i.province_id if _weight != .,r
est store m2

 psmatch2 发债之前是否发生过非标违约 $control , outcome(发行利差) logit neighbor(6) ties common ate caliper(0.05)
 reg 发行利差 发债之前是否发生过非标违约  $control i.上市年份 i.province_id if _weight != .,r
 est store m3

 reg2docx m1 m2 m3 using table5.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))


//调整固定效应设定

 reg 发行利差 发债之前是否发生过非标违约 $control i.上市年份#i.province_id if 违约省份 == 1, r
 est store m1


//替换解释变量为人均指标，增加解释变量
 gen gdp_per = ln(人均GDP)
 gen debt_per = ln(人均存量债务)
 gen local_debt = ln(地方债规模)

 global control1 "gdp_per debt_per 发行总额 债券期限 评级 财政平衡指标 第三产业比重 资产负债率 盈利能力 流动比率 长期负债占比 含权"

 global control2 "city_gdp province_gdp province_debt 发行总额 债券期限 评级 财政平衡指标 第三产业比重 资产负债率 盈利能力 流动比率 长期负债占比 含权 local_debt GDP增速"

 reg 发行利差 发债之前是否发生过非标违约 $control1 i.上市年份 i.province_id if 违约省份 == 1, r
  est store m2

 reg 发行利差 发债之前是否发生过非标违约 $control1 i.上市年份#i.province_id if 违约省份 == 1, r
  est store m3


 reg 发行利差 发债之前是否发生过非标违约 $control2 i.上市年份 i.province_id if 违约省份 == 1, r
 est store m4

 reg 发行利差 发债之前是否发生过非标违约 $control2 i.上市年份#i.province_id if 违约省份 == 1, r
 est store m5

 reg2docx m1 m2 m3 m4 m5 using table6.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))


//使用二级交易数据进一步检验
//导入回归数据集"自身违约（二级）"sheet

egen province_id = group(省份)
egen city_id = group(城市)
egen bond = group(bond_id)
egen firm_id = group(债务主体)
egen year = group(年份)


reg ytm 违约后 i.city_id i.year i.firm_id
est store m1
reg ytm 违约后 i.city_id i.year i.firm_id i.bond
est store m2

//导入回归数据集"所在区县违约（二级）"sheet

egen province_id = group(省份)
egen city_id = group(城市)
egen bond = group(bond_id)
egen firm_id = group(债务主体)
egen year = group(年份)

reg ytm 违约后 i.city_id i.year i.firm_id
est store m3
reg ytm 违约后 i.city_id i.year i.firm_id i.bond
est store m4

//导入回归数据集"所在城市违约（二级）"sheet

egen province_id = group(省份)
egen city_id = group(城市)
egen bond = group(bond_id)
egen firm_id = group(债务主体)
egen year = group(年份)

reg ytm 违约后 i.city_id i.year i.firm_id
est store m5
reg ytm 违约后 i.city_id i.year i.firm_id i.bond
est store m6


reg2docx m1 m2 m3 m4 m5 m6 using table7.docx, replace b(%6.3f) t(%6.2f) scalars(N r2_a(%6.4f))