This file follows the creation of the link table update the end of 2023. The file is called Link_table_2024.RData. The manual document can be found in file “DealScan_Link_Table_Compustat.html”.
The purpose of this document is to document the flow of logic in identifying amendaments/renegotiations/refinancing of exiting syndicated loan contracts in the LPC DealScan data.
The deal is identified as a “refinancing” deal because in the “Item 1.01 Entry into a Material Definitive Agreement”, it says:
… The Credit Agreement is a $1.75 billion revolving credit facility, which refinanced the existing $1.50 billion Credit Agreement dated April 20, 2010, as amended (the “2010 Credit Facility”), that would have matured in November 2013.
Note that the firm is acquired by Marriott International Inc (Borrower_Id=‘18487’) in 2016.
LPC_Deal_ID andLPC_Tranche_ID are kept even after refinancing.
To track changes/amendments: Deal_Amended, Tranche_Amended, and Tranche_O_A.
Trance_O_A: Origination, Amendment 1, etc.
To track refinancing: Deal_Refinancing and Tranche_Refinancing.
S2. Data sources
LPC DealScan from WRDS.
S3. DealScan Data Preview
s3.1 Deal Purposes
Show the code
## build up and clean the dataset # DealScan <- fread("hi0yvqzhxowsqnpf.csv") # save(DealScan, file = "DealScan.Rdata")# DealScan_borrower <- DealScan %>%# select(- grep(pattern = "Lend|Role", x = names(.), value = T) ) %>% # unique()# save(DealScan_borrower, file = "DealScan_borrower.Rdata")# load("DealScan.Rdata") load("DealScan_borrower.Rdata") # for data only with names(DealScan_borrower)# ## Here is one example: # b_9514 <- DealScan_borrower %>% # filter(Borrower_Id == 9514)# # b_9514 %>% # select(LPC_Deal_ID, LPC_Tranche_ID, # Deal_Active, Deal_Active_Date, Deal_Amended, Deal_Refinancing, Deal_Amount,# Tranche_Amended, Tranche_O_A, Tranche_Active_Date, Tranche_Refinancing, Tranche_Amount) %>% # unique() %>% # arrange(Deal_Active_Date, Tranche_Active_Date) %>% # View("b_9514") # # DealScan_borrower %>% # filter(LPC_Tranche_ID == 52511)# # ## Summary stats for the deals: # Deal_summary <- DealScan_borrower %>% # group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% # summarise(LPC_Tranche_Num = n(), # Tranche_First = min(Tranche_Active_Date), # Tranche_Last = max(Tranche_Active_Date),# ) %>% # ungroup() # Deal_summary %>% head(20)### Look into the deal purpose. dt.Deal_Purpose <- DealScan_borrower %>%select(grep(pattern ="Purpose", x =names(.), value = T)) %>%unique() %>%lapply(X = ., FUN =function(x) unique(x)) %>%as.data.table(.)dt.Deal_Purpose$Deal_Purpose %>%unique()### Look into the number of deals under each purposeDeal_Purpose_Type <- DealScan_borrower %>%group_by(Deal_Purpose) %>%summarise(Deal_Purpose_Type_Num =length(unique(LPC_Deal_ID))) %>%ungroup() %>%arrange(-Deal_Purpose_Type_Num) %>%mutate(Deal_Purpose =paste(format(1:length(Deal_Purpose), width =2), Deal_Purpose, sep ="-"), Deal_Purpose_Type_Prc = Deal_Purpose_Type_Num /sum(Deal_Purpose_Type_Num) )plt.deal_purpose <-ggplot(Deal_Purpose_Type) +geom_col(aes(y =reorder(Deal_Purpose, Deal_Purpose_Type_Num), x =log10(Deal_Purpose_Type_Num)), fill ="#076fa2",width =0.9, position =position_dodge(width =0.9)) +scale_x_continuous(limits =c(0, 5.3),breaks =seq(0, 6, by =1), expand =c(0.01, 0), # The horizontal axis does not extend to either sideposition ="top"# Labels are located on the top ) +# The vertical axis only extends upwardsscale_y_discrete(expand =expansion(add =c(0, 0.5))) +theme(# Set background color to whitepanel.background =element_rect(fill ="white"),# Set the color and the width of the grid lines for the horizontal axispanel.grid.major.x =element_line(color ="#A8BAC4", linewidth =0.3),# Remove tick marks by setting their length to 0axis.ticks.length =unit(0, "mm"),# Remove the title for both axesaxis.title =element_blank(),# Only left line of the vertical axis is painted in blackaxis.line.y.left =element_line(color ="black"),# Remove labels from the vertical axisaxis.text.y =element_blank(),# But customize labels for the horizontal axisaxis.text.x =element_text(family ="Courier", size =10) # "Econ Sans Cnd"; "Comic Sans MS" ) +geom_shadowtext(data =subset(Deal_Purpose_Type, log10(Deal_Purpose_Type_Num) <3),aes(log10(Deal_Purpose_Type_Num), y = Deal_Purpose, label = Deal_Purpose),fontface ="bold", hjust =0,nudge_x =0.1,colour ="#076fa2",bg.colour ="white",bg.r =0.2,family ="Courier",size =3 ) +geom_text(data = Deal_Purpose_Type,aes(log10(Deal_Purpose_Type_Num), y = Deal_Purpose, label =sapply(X = Deal_Purpose_Type_Prc*100, FUN =function(x) {paste(ifelse(round(x, digits =2) ==0, round(x, digits =3), round(x, digits =2)), "%" , sep ="")}) ), fontface ="bold", hjust =0,nudge_x =-0.3,colour ="white",family ="Courier",size =3 ) +geom_text(data =subset(Deal_Purpose_Type, log10(Deal_Purpose_Type_Num) >=3), aes(0, y = Deal_Purpose, label = Deal_Purpose), # paste("<b>", Deal_Purpose, "</b>", sep = "")), fontface ="bold", hjust =0,nudge_x =0.3,colour ="white",family ="Courier",size =3 )plt.deal_purpose +labs(title =paste("Deal Purpose: activated between", paste(range(DealScan_borrower$Tranche_Active_Date), collapse =" and ")),subtitle ="Number of Deals for Each Deal Purpose (from WRDS DealScan)" ) +theme(plot.title =element_text(family ="Comic Sans MS", face ="bold",size =15 ), plot.subtitle =element_text(family ="Comic Sans MS",size =10 ) ) +annotate(geom ="text", label =paste("Sample Size: ", format(sum(Deal_Purpose_Type$Deal_Purpose_Type_Num), big.mark =","), sep =""), # , "\n updated: ", date()x =4.5, y =2, color ="#076fa2", family ="Courier",size =2.5 )
In the above codes, I first use LPC_Deal_ID to identify each unique deal and then group by variable Deal_Purpose to calculate the number of deals for each purpose. I store the number of deals for each purpose in the dataset Deal_Purpose_Type and the above plot. The total number of deal observations is 261007.
The most frequent purpose is named under the General Purpose and the second and third most frequent purposes are Working Capital and Refinancing. Deals under these three purposes collectively account for around 63% percentage of all the deals in the sample.
Another big chunk is in the capital investments: real estate, equipment, construction, aircraft & ship, telecom, hardware, etc.
Another part is the trade finance - no. 11, 13, 21.
SPV (Project Finance), M&A, LBO (all different buyouts), Takeover.
The name of each variable is defined in Loan Connector FTP User Guide and Fact Sheet. Through the fuzzy matching, I can match most of the variables in DealScan_borrower to that file.
In the next code block, I will look into amendments/refinancing for firms operating in US. The date for each step in the syndication process is crucial.
Amend_Extend_Flag: For analytic purposes, LPC defines an amend and extend during instances when a portion of the lending group wishes not to extend out their commitments. Thus only a percentage of the original overall commitment amount would get extended and that portion would get flagged as amend & extend volume (Yes/No).
`summarise()` has grouped output by 'Change_Freq_Positive'. You can override
using the `.groups` argument.
Show the code
ggplot(data =na.omit(dt.Deal_Amend_Refin.plot), aes(fill = Year_groups, x = Change_Freq_Positive, y = n) ) +geom_bar(position="stack", stat="identity") # +
Show the code
# scale_y_continuous(name = "Number of Deal-Tranche", trans='log10')ggplot(na.omit(dt.Deal_Amend_Refin.plot), aes(fill=Year_groups, y=n, x=Change_Freq_Positive)) +geom_bar(position="dodge", stat="identity") +scale_y_continuous(name ="Number of Deal-Tranche w/ Amendments") +scale_x_continuous(name ="Frequency of Amendments")
Show the code
ggplot(na.omit(dt.Deal_Amend_Refin.plot), aes(fill=Year_groups, y=share_in_yeargroup, x=Change_Freq_Positive)) +geom_bar(position="dodge", stat="identity") +scale_y_continuous(name ="Number of Deal-Tranche w/ Amendments") +scale_x_continuous(name ="Frequency of Amendments")
Show the code
#### number of deal-tranche (1 to 10)fig_amend_count <-ggplot(na.omit(filter(dt.Deal_Amend_Refin.plot, Change_Freq_Positive <=10)), aes(fill=Year_groups, y=n, x=Change_Freq_Positive)) +geom_bar(position="dodge", stat="identity") +# scale_y_continuous(name = "Number of Deal-Tranche w/ Amendments") + scale_x_continuous(name ="Frequency of Amendments", breaks =1:10) +labs(title ="Number of Deal-Tranches w/ Amendments", subtitle ="Number of Deal-Tranche w/ Amendments", fill ="Origination Year Groups") +theme_economist(base_size =10,base_family ="Courier",horizontal =TRUE,dkpanel =FALSE ) +theme(# Remove labels from the vertical axisaxis.title.y =element_blank(), axis.text.x =element_text(vjust=3),axis.text.y =element_text(hjust=1),axis.ticks =element_blank(), # Title formatplot.title =element_text(family ="Comic Sans MS", face ="bold",size =13.5, hjust =0# shift the ), # Subtitle format plot.subtitle =element_text(family ="Comic Sans MS",size =12, hjust =0 ), # plot.title.position = "plot",legend.text =element_text(size=10), #change font size of legend textlegend.title =element_text(size=10), #change font size of legend title legend.position ="top", legend.key.size =unit(0.3, 'cm') # change the size of the legend key - the blocks )#### share of deal-tranche within each year group (1 to 10)fig_amend_share <-ggplot(na.omit(filter(dt.Deal_Amend_Refin.plot, Change_Freq_Positive <=10)), aes(fill=Year_groups, y=share_in_yeargroup, x=Change_Freq_Positive)) +geom_bar(position="dodge", stat="identity") +# scale_y_continuous(name = ) + scale_x_continuous(name ="Frequency of Amendments", breaks =1:10) +labs(title ="Share of Deal-Tranches w/ Amendments within Origination-year Group", subtitle ="Percentage of Deal-Tranche w/ Amendments (%)", fill ="Origination Year Groups") +theme_economist(base_size =10,base_family ="Courier",horizontal =TRUE,dkpanel =FALSE ) +theme(# Remove labels from the vertical axisaxis.title.y =element_blank(), axis.text.x =element_text(vjust=3),axis.text.y =element_text(hjust=1),axis.ticks =element_blank(), # Title formatplot.title =element_text(family ="Comic Sans MS", face ="bold",size =13.5, hjust =0# shift the ), # Subtitle format plot.subtitle =element_text(family ="Comic Sans MS",size =12, hjust =0 ), # plot.title.position = "plot",legend.text =element_text(size=10), #change font size of legend textlegend.title =element_text(size=10), #change font size of legend title legend.position ="top", legend.key.size =unit(0.3, 'cm') # change the size of the legend key - the blocks )cowplot::plot_grid(fig_amend_count, fig_amend_share, ncol =1)
vars n mean sd median trimmed mad min
LPC_Deal_ID 1 110448 129520.46 79671.48 121980 124537.1 84471.88 2
Deal_Change_Freq 2 110448 0.41 1.21 0 0.1 0.00 0
max range skew kurtosis se
LPC_Deal_ID 323649 323647 0.45 -0.60 239.73
Deal_Change_Freq 36 36 5.24 47.79 0.00
Among all 173,999 unique Deal-Tranche observations, 43,870 of those have recorded amendments to their Deal-Tranches. Among deals experienced amendments, each Deal-Tranche is amended on average 2.1 times and this seems to be quite stable to the origination time of the Deal-Tranche. This is somewhat consistent with the idea that the renegotiation is not rare.
The amendment is made at August 28, 2006. The amended document says that
… WHEREAS, the Borrowers has requested an amendment to the Credit Agreement; and WHEREAS, the Lenders are willing to agree to such amendments, subject to the terms and conditions set forth herein; …
This seems that if the borrower request an amendment, it can be approved by the syndicate.
This amendment happened in around 5 months after the loan origination.
Important 1: Who initiates the renegotiation process?
I only observe the successful renegotiations and potentially can also identify who initiates this process. This may create selection bias in your analysis. Need to think about how will this issue create upward/downward bias in your results.
The syndicte has four banks and the cost of renegotiation might be small? & What is usually the fees/expenses for renegotiations?
Tip 1: How to detect the relationship lending?
One tip to detect such lending relationship might be a scrap and search for the person and his/her title along the loan path and also for a single firm’s loan pool.
Different types of term loans:
Term loan (also Term Loan A): This layer of debt is typically amortized evenly over 5 to 7 years. Just like a mortgage.
Term loan B (also TLB): This layer of debt usually involves nominal amortization (repayment) over 5 to 8 years, with a large bullet payment in the last year. Term Loan B allows borrowers to defer repayment of a large portion of the loan, but is more costly to borrowers than Term Loan A.
TLB proceeds can be used in various ways, including for refinancing, acquisitions and general corporate use.
The first two types generally are secured loans.
Repayment can be made and is generally required at a premium to face value.
Term loan C (also TLC): TLC proceeds are used to fund cash collateral accounts that support letters of credit—a letter from a bank guaranteeing that a seller of goods or services will receive payment in full and on time, even if the buyer defaults.
TLC debt, however, may only be used to provide collateral for letters of credit.
Since TLCs are specifically raised to provide cash collateral, which must be available in an account to support letters of credit, they also do not amortize.
TLB is senior than TLC debt.
The idea is to use long-term debt to hedge the short-term liquidity/cash needs. TLC plays such a role for this specific purpose. It is a risky debt; however, very strict covenants and purposes are imposed to mitigate risk-shifting by the manager.
Revolver/Line: Revolving Credit Facility, which is basically a credit card for the borrower. There are two costs associated with revolving lines of credit: (1) the interest rate charged on the revolver’s drawn balance, and (2) an undrawn commitment fee.
Table 1. Panel B: Aeroflex Inc. Deal-Tranche Level Loan Path
LPC Tranche_ID
Deal Amended
Amend Extend_Flag
Tranche Amended
Deal Refinancing
Tranche O_A
Tranche Refinancing
Tranche Maturity_Date
Tenor Maturity
Deal Amount
Tranche Amount
Deal Active_Date
Deal Input_Date
Tranche Active_Date
Tranche Type
Deal Purpose
Deal: 128721
224767
No
No
No
Yes
Origination
2000-09-30
54
20.00
4.00
1996-03-15
1998-09-09
1996-03-15
Term Loan
General Purpose/Refinance
273100
No
No
No
Yes
Origination
1999-03-31
36
20.00
16.00
1996-03-15
1998-09-09
1996-03-15
Revolver/Line >= 1 Yr.
General Purpose/Refinance
Deal: 143473
185023
No
No
No
Yes
Origination
2002-12-31
46
47.48
20.00
1999-02-25
1999-03-10
1999-02-25
Term Loan
General Purpose/Refinance
186036
No
No
No
Yes
Origination
2002-12-31
46
47.48
23.00
1999-02-25
1999-03-10
1999-02-25
Revolver/Line >= 1 Yr.
General Purpose/Refinance
278055
No
No
No
Yes
Origination
2008-04-30
110
47.48
4.48
1999-02-25
1999-03-10
1999-02-25
Revolver/Line >= 1 Yr.
General Purpose/Refinance
Deal: 42818
83949
No
No
No
Yes
Origination
2008-04-30
62
53.23
3.23
2003-02-14
2003-02-28
2003-02-14
Term Loan
Working capital
98794
No
No
No
Yes
Origination
2007-02-14
48
53.23
50.00
2003-02-14
2003-02-28
2003-02-14
Revolver/Line >= 1 Yr.
Working capital
Deal: 151556
197238
Yes
No
Yes
Yes
Origination
2011-03-21
60
100.00
100.00
2006-03-21
2006-03-22
2006-03-21
Revolver/Line >= 1 Yr.
Working capital
197238
Yes
No
Yes
Yes
Amendment 1
2011-03-21
55
100.00
100.00
2006-03-21
2006-08-28
2006-08-28
Revolver/Line >= 1 Yr.
Working capital
Deal: 57853
108980
No
No
No
No
Origination
NA
NA
780.00
245.00
2007-04-13
2007-03-30
2007-04-13
Term Loan
Leveraged Buyout
230824
No
No
No
No
Origination
NA
NA
780.00
475.00
2007-04-13
2007-03-30
2007-04-13
Term Loan B
Leveraged Buyout
98546
No
No
No
No
Origination
NA
NA
780.00
60.00
2007-04-13
2007-03-30
2007-04-13
Revolver/Line >= 1 Yr.
Leveraged Buyout
Deal: 16163
35910
No
No
No
Yes
Origination
2013-08-15
72
575.00
50.00
2007-08-15
2007-06-25
2007-08-15
Revolver/Line >= 1 Yr.
Leveraged Buyout
35911
No
No
No
Yes
Origination
2014-08-15
84
575.00
400.00
2007-08-15
2007-06-25
2007-08-15
Term Loan B
Leveraged Buyout
36226
No
No
No
Yes
Origination
2014-08-15
84
575.00
125.00
2007-08-15
2007-06-25
2007-08-15
Term Loan C
Leveraged Buyout
Deal: 16164
43063
Yes
No
Yes
Yes
Origination
Yes
2016-12-31
67
669.12
75.00
2011-05-09
2011-04-27
2011-05-09
Revolver/Line >= 1 Yr.
General Purpose
43063
Yes
No
Yes
Yes
Amendment 1
Yes
2016-12-31
55
669.12
75.00
2011-05-09
2012-05-25
2012-05-25
Revolver/Line >= 1 Yr.
General Purpose
43063
Yes
No
Yes
Yes
Amendment 2
Yes
2017-11-28
54
669.12
57.12
2011-05-09
2013-05-14
2013-05-28
Revolver/Line >= 1 Yr.
General Purpose
43064
Yes
No
Yes
Yes
Origination
Yes
2018-12-31
91
669.12
725.00
2011-05-09
2011-04-27
2011-05-09
Term Loan B
General Purpose
43064
Yes
No
Yes
Yes
Amendment 1
Yes
2018-12-31
79
669.12
725.00
2011-05-09
2012-05-25
2012-05-25
Term Loan B
General Purpose
43064
Yes
No
Yes
Yes
Amendment 2
Yes
2019-11-28
78
669.12
612.00
2011-05-09
2013-05-14
2013-05-28
Term Loan B
General Purpose
Consistent with Roberts (2015), most of deal-tranche observations in DealScan are not consistent with their SEC filings. In other words, the loan path in the DealScan data is rather incomplete. For instance, the tranche (LPC_Deal_ID = 128721, LPC_Tranche_ID = 224767) only appears once in DealScan and is classified as an “Origination” + “Refinancing” deal. However, the SEC filings from Table B1 Panel B in Roberts (2015) shows a total 8 observations along the loan path. The observation recorded in DealScan is not an origination and is classified as an “Amended/Restate” event in Roberts dataset. Therefore, the renegotiation frequency is significantly different from the actual ones and the full dataset may not be granular enough.
Another way to better identify the connection between different deals, and tranches in particular, is to look into variable Deal_Remark. Some examples below:
Table 1. Panel C: Aeroflex Inc. Deal-Tranche Level Loan Path
w/ additional information in remarks
LPC Tranche_ID
Deal Amended
Amend Extend_Flag
Tranche Amended
Deal Refinancing
Tranche O_A
Tranche Refinancing
Tranche Maturity_Date
Tenor Maturity
Deal Amount
Tranche Amount
Deal Active_Date
Deal Input_Date
Tranche Active_Date
Tranche Type
Deal Purpose
Purpose Remark
Deal Remark
Tranche Remark
Performance Pricing_Remark
Deal: 128721
224767
No
No
No
Yes
Origination
2000-09-30
54
20
4
1996-03-15
1998-09-09
1996-03-15
Term Loan
General Purpose/Refinance
Background: Credit amends and restates a $8M agreement dated 4/11/94. Co. was formerly known as ARX Inc. Credit is also arranged for a number of subsids and backs the acquisition of MIC Technology. Pricing: (See grid).
Pricing is as indicated thru 6/30/96, tied to co.'s debt to EBITDA ratio thereafter.
273100
No
No
No
Yes
Origination
1999-03-31
36
20
16
1996-03-15
1998-09-09
1996-03-15
Revolver/Line >= 1 Yr.
General Purpose/Refinance
Background: Credit amends and restates a $8M agreement dated 4/11/94. Co. was formerly known as ARX Inc. Credit is also arranged for a number of subsids and backs the acquisition of MIC Technology. Pricing: (See grid).
Option: $2M LC sublimit. Security: Borrow. base = 80% of elig. receivs. plus 40% of elig. invent.
Pricing is as indicated thru 6/30/96, tied to co.'s debt to EBITDA ratio thereafter.
You can see the ample information covered in the Deal_Remark and Tranche_Remark section.
To connect to loan contracts preceding these ones, I recovered the loans originated under the same entity but under a different name. These are loans from ARX Inc. (Borrower_Id = 31224):
Table 1. Panel D: ARX Inc. Deal-Tranche Level Loan Path
LPC Tranche_ID
Deal Amended
Amend Extend_Flag
Tranche Amended
Deal Refinancing
Tranche O_A
Tranche Refinancing
Tranche Maturity_Date
Tenor Maturity
Deal Amount
Tranche Amount
Deal Active_Date
Deal Input_Date
Tranche Active_Date
Tranche Type
Deal Purpose
Purpose Remark
Deal Remark
Tranche Remark
Performance Pricing_Remark
Deal: 91747
171206
No
No
No
Yes
Origination
1996-03-31
83
40.0
40.0
1989-04-24
1989-11-02
1989-04-24
Revolver/Term Loan
General Purpose/Refinance
Commit. was reduced from $50M and pricing increased from P, LIB+75 in an amendment dated11/27/90. The credit reduces further to $33.5M.
Indicated LIB pricing is for interest periods of less than 6 mos., LIB+250 for interest periods > 6 mos. Key Financial Ratios: min. current ratio of 3:1; min. quick ratio of 1.5:1; min. interest coverage ratio of 1.5:1. Credit converts to a 4-yr. term loan.
Deal: 78408
141738
No
No
No
No
Origination
1994-07-31
33
38.5
23.5
1991-10-10
1991-10-23
1991-10-10
Revolver/Line >= 1 Yr.
Working capital
Credit is also for several of the co.'s affiliates. Credit amends and restates a prior agreement. Revolver commit. was reduced from $38.5M and $15M of outstands. were converted to term loans. Overdue pricing is P+300. Credit is prepaid with 100% of the net proceeds of any lease or disposition of assets > $250K, 25% used to reduce the revolver and 75% to reduce the term loan to $6M. Credit is prepaid with 75% of securities sales. Agent collects unspecified fees. Indicated upfr. fee is a restructuring fee. Banks may make assigns. Elig. assignees: banks having total assets > or = $1B, and S&Ls and financial institutions with total assets > or = $500M. Assign. min.: $5M. Key Financial Ratios: max. total consol. liab. to tang. net worth ratio decreasing from 4.45:1 thru 9/30/91 to 2.6:1 after 6/29/94; min. consol. operating income to gross interest expense ratio of 1:1 thru 6/30/93, 1.5:1 thereafter.
245103
No
No
No
No
Origination
1994-07-31
33
38.5
15.0
1991-10-10
1991-10-23
1991-10-10
Term Loan
Working capital
Credit is also for several of the co.'s affiliates. Credit amends and restates a prior agreement. Revolver commit. was reduced from $38.5M and $15M of outstands. were converted to term loans. Overdue pricing is P+300. Credit is prepaid with 100% of the net proceeds of any lease or disposition of assets > $250K, 25% used to reduce the revolver and 75% to reduce the term loan to $6M. Credit is prepaid with 75% of securities sales. Agent collects unspecified fees. Indicated upfr. fee is a restructuring fee. Banks may make assigns. Elig. assignees: banks having total assets > or = $1B, and S&Ls and financial institutions with total assets > or = $500M. Assign. min.: $5M. Key Financial Ratios: max. total consol. liab. to tang. net worth ratio decreasing from 4.45:1 thru 9/30/91 to 2.6:1 after 6/29/94; min. consol. operating income to gross interest expense ratio of 1:1 thru 6/30/93, 1.5:1 thereafter.
Credit is repaid in qtrly. installs. of $500K ea. beg. 9/30/91 to reduce the term loan to $6M; thereafter, installs. will be used to reduce revolver, with the excess again used to reduce the term loan.
Deal: 53953
105809
No
No
No
No
Origination
1997-03-31
35
20.0
16.0
1994-04-11
1994-10-12
1994-04-11
Revolver/Line >= 1 Yr.
Working capital
Background: Credit amends and restates a $38.5M agreement dated 10/10/91 and is also arranged for various affiliates. Pricing: (See grid). Overdue fee = 300 bps. Prepayments: Asset sales > $100,000, 100%. Assignments: Banks consent required. Assign. min. = $4M. Key Financial Ratios: Max. consol. effective leverage ratio decreasing from 1.5:1 to 1.4:1; min. consol. interest coverage ratio of 1.75:1; min. consol. debt service coverage ratio of 1.25:1.
Pricing: As indicated thru 6/30/94; tied to above grid thereafter.
83591
No
No
No
No
Origination
1997-03-31
35
20.0
4.0
1994-04-11
1994-10-12
1994-04-11
Term Loan
Working capital
Background: Credit amends and restates a $38.5M agreement dated 10/10/91 and is also arranged for various affiliates. Pricing: (See grid). Overdue fee = 300 bps. Prepayments: Asset sales > $100,000, 100%. Assignments: Banks consent required. Assign. min. = $4M. Key Financial Ratios: Max. consol. effective leverage ratio decreasing from 1.5:1 to 1.4:1; min. consol. interest coverage ratio of 1.75:1; min. consol. debt service coverage ratio of 1.25:1.
Pricing: As indicated thru 6/30/94; tied to above grid thereafter.
Although this is far from perfect in recording the life-cycle of the loan, it is not as sparse as I thought previously. Also, the frequency of renegotiation needs to be recalculated, with around 25% of the “Origination”s to be reclassified as “Amend/Restate”.
Tip 2: The correct way to recover loan path for a unique firm!
A thorough look into the DealScan dataset shows that the issue of incomplete loan path presented in Roberts (2015) may not be as severe as what he suggested. The huge amount of missing observations comes from the ignoring that the company has a different name, and so a different Borrower_Id, in the dataset. The Aeroflex Inc. is previously known as ARX Inc. (gvkey = 1056).
We can recover past observations from Borrower_Id = 31224 (rather than 8532). However, in order to recover the exact loan path and connects the evolution of each tranche under the same deal, we need to use variable Deal_Remark and extract textual information and match previous deals.
In addition, all observations after 2010 are under the name AEROFLEX HOLDING CORP. and you can access their 8-K filings.
s3.3c Will this affect my project?
However, this should not be an issue for my project.
First, my focus is on the firm-level observations and the dependent variable in the first step is whether a renegotiation happens.
Second, to identify an amendment/restatement/refinancing, I should use the Deal_Refinancing rather than the Origination variable. While the majority (60%) of tranche observations classified as Origination has “No” for all other identifiers, around 25% of tranche observations in those has “Yes” for Deal_Refinancing. This is exactly the case we saw in the example above. > updated
Show the code
# to identify different types of contracts which are defined as "Origination". DealScan_borrower %>%filter(grepl(pattern ="Orig", x = Tranche_O_A)) %>%# only keep tranches classified as "Origination"group_by(Deal_Amended, Tranche_Amended, Deal_Refinancing, Tranche_Refinancing) %>%summarise(n =n()) %>%# count the number of each types ungroup() %>%mutate(percentage = (n /sum(n))) %>%gt() %>%tab_header(title ="Table 2: WRDS DealScan Deal-Tranche Level Loan Events", subtitle ="Subgroup: `Tranche_O_A` = Origination" ) %>%tab_options(table.font.size =11, heading.align ='left' ) %>%tab_style( # update the font size for table cells. style =cell_text(size =px(11)),locations =cells_body() ) %>%fmt_percent(columns = percentage, decimals =2)
# to identify different types of contracts which are defined as "Amendment 1". DealScan_borrower %>%filter(grepl(pattern ="Amendment", x = Tranche_O_A)) %>%# only keep tranches classified as "Origination"group_by(Deal_Amended, Tranche_Amended, Deal_Refinancing, Tranche_Refinancing) %>%summarise(n =n()) %>%# count the number of each types ungroup() %>%mutate(percentage = (n /sum(n))) %>%gt() %>%tab_header(title ="Table 2b: WRDS DealScan Deal-Tranche Level Loan Events", subtitle ="Subgroup: `Tranche_O_A` = Amendment(s)" ) %>%tab_options(table.font.size =11, heading.align ='left' ) %>%tab_style( # update the font size for table cells. style =cell_text(size =px(11)),locations =cells_body() ) %>%fmt_percent(columns = percentage, decimals =2)
Third, I won’t expect that renegotiations happen extremely frequency, not at each month. Thus, if some terms are changed, e.g. spreads and deal/tranche amounts, I can validate these changes from the balance sheet.
This section aims to classify different variables into groups. This is used to prepare the subsequent analyses regarding covenants and terms in the contract.
Show the code
# LPC_def %>% head(30) %>% View()LPC_def_class <- LPC_def %>%# the list of variables under each class. filter(header_true == T) %>%select(header = V1, header_id) %>%left_join(LPC_def, by ="header_id") %>%select(header, header_id, variable = V1) %>%filter(header != variable) %>%mutate(variable =clean_strings(variable, remove_char ="&|$") %>%# remove the "and" words in the variable. str_replace(pattern ="sr", replacement ="senior"), # replace the word 'sr' to 'senior'. unique_key_2 =1:nrow(.) ) all_names <-as.data.table(str_replace_all(names(DealScan_borrower), pattern ="_", replacement =" ") %>%clean_strings() %>%str_replace(pattern ="sr", replacement ="senior")) all_names$unique_key_1 <-1:length(names(DealScan_borrower))## fuzzy matching for the non-matching items with constrained bars. fuzzy_result <-merge_plus(data1 = all_names, data2 = LPC_def_class,by.x ="V1",by.y ="variable", match_type ="fuzzy", fuzzy_settings =build_fuzzy_settings(maxDist = .1, nthread =20),unique_key_1 ="unique_key_1",unique_key_2 ="unique_key_2")cat("Results from fuzzy matching the names from LPC DealScan and WRDS DealScan: \n")
Results from fuzzy matching the names from LPC DealScan and WRDS DealScan:
Show the code
# fuzzy_result$match_evaluation# fuzzy_result$matches# fuzzy_result$matches %>% arrange(unique_key_1) %>% filter(grepl(pattern = "percentage", ignore.case = T, x = V1))# fuzzy_result$data1_nomatch# fuzzy_result$data2_nomatch # %>% filter(grepl(pattern = "deal", ignore.case = T, x = variable))## fuzzy matching for the non-matching items with relaxed bars. fuzzy_result2 <-merge_plus(data1 = fuzzy_result$data1_nomatch, data2 = fuzzy_result$data2_nomatch,by.x ="V1",by.y ="variable", match_type ="fuzzy", fuzzy_settings =build_fuzzy_settings(maxDist = .25, nthread =20),unique_key_1 ="unique_key_1",unique_key_2 ="unique_key_2")# fuzzy_result2$matches# fuzzy_result2$data1_nomatch# fuzzy_result2$data2_nomatch %>% filter(header != "Lender ")## hand match the remaining ones: manual_results <- fuzzy_result2$data1_nomatch %>%mutate(header =c(rep("ID",3), "Spread/Fee"),header_id =c(rep(0, 3), 14) )## merge into one file > variable name ~ header class: dt.name_match <-rbind.data.frame(select(fuzzy_result$matches, unique_key_1, V1, header, header_id), select(fuzzy_result2$matches, unique_key_1, V1, header, header_id), select(manual_results, unique_key_1, V1, header, header_id)) %>%arrange(unique_key_1) %>%left_join(y =data.frame(orig_name =names(DealScan_borrower), unique_key_1 =1:length(names(DealScan_borrower))), by ="unique_key_1") %>%mutate(group_header =paste(header_id, header, sep =": ")) %>%select(unique_key_1, orig_name, group_header) dt.name_match %>%group_by(group_header) %>%summarise(Variables =paste(orig_name, collapse =", "), Num_Vars =length(orig_name) # number of variables in the group ) %>%ungroup() %>%arrange(str_extract(group_header, pattern ="\\d+") %>%as.numeric()) %>%gt() %>%# tab_options(table.font.size = 10, heading.align = 'left' ) %>%tab_style( # update the font size for table cells. style =cell_text(size =px(13)),locations =cells_body() ) %>%cols_width(ends_with("Variables") ~px(1000))
All variables containing ID are classified into the "ID" group.
The majority of the covenants are in group 17:Financial and it records the changes in the financial covenants. The group 19: General also includes many restrictions on loan repayment policy.
Standard financial covenants including cross default, negative pledge
NA
NA
No
NA
NA
NA
45832
211755
Origination
No
No
No
Yes
6.0e+08
NA
Tangible Net Worth: 6e+008
Total borrowings to tangible net worth shall not exceed 1.5 times; total liabilities to tangible net worth shall not exceed 2 times; tangible net worth shall be not less than M$600m
NA
NA
No
NA
NA
NA
179048
215589
Origination
Yes
No
No
Yes
0.65:1
4.5e+08
NA
2.5:1
Max. Leverage Ratio: Value is 0.65, Tangible Net Worth: 4.5e+008, Min. Interest Coverage Ratio: Value is 2.50
Minimum liquidity = $25M; required if > 50% of vessels are subject to time charters with remaining term <= one year. Minimum interest and principal coverage ratio of 1.1:1.
NA
100
Yes
NA
NA
100
64153
117680
Origination
Yes
No
No
No
NA
NA
Covenants: Rolling 12 months ICR > 1.50x
NA
NA
No
NA
NA
NA
64153
95407
Origination
Yes
No
No
No
NA
NA
Covenants: Rolling 12 months ICR > 1.50x
NA
NA
No
NA
NA
NA
155394
183441
Origination
Yes
No
No
No
NA
NA
Covenants include max. debt to EBITDA, interest cover and tangible net worth.
NA
NA
No
NA
NA
NA
155394
242738
Origination
Yes
No
No
No
NA
NA
Covenants include max. debt to EBITDA, interest cover and tangible net worth.
NA
NA
No
NA
NA
NA
2987
54057
Origination
Yes
No
No
Yes
0.68:1
NA
1.5e+09
2:1
Max. Leverage Ratio: Value is 0.68, Net Worth: 1.5e+009, Min. Interest Coverage Ratio: Value is 2.00
Min. net worth = $1.5B plus 25% of consol. net income as of 01/01/2002.
NA
NA
No
NA
NA
NA
17943
12625
Origination
Yes
No
No
Yes
NA
8.0e+08
1.8:1
Net Worth: 8e+008, Min. Interest Coverage Ratio: Value is 1.80
Indicated consolidated net worth applies thru 3/31/03, decreases to EUR 500M thru 3/31/04.
NA
NA
Yes
NA
NA
NA
4946
16223
Origination
Yes
No
No
Yes
Decreasing from 8:1 to 3.6:1
NA
NA
Increasing from 1.2:1 to 2.5:1
Max. Debt to Cash Flow: Decreasing from 8.00 to 3.60, Min. Interest Coverage Ratio: Increasing from 1.20 to 2.50
Min. consolidated net worth = EUR1.4B at 3/31/04, fluctuating between EUR850M to EUR1.15B thereafter.
NA
NA
No
NA
NA
NA
4946
56194
Origination
Yes
No
No
Yes
Decreasing from 8:1 to 3.6:1
NA
NA
Increasing from 1.2:1 to 2.5:1
Max. Debt to Cash Flow: Decreasing from 8.00 to 3.60, Min. Interest Coverage Ratio: Increasing from 1.20 to 2.50
Min. consolidated net worth = EUR1.4B at 3/31/04, fluctuating between EUR850M to EUR1.15B thereafter.
NA
NA
No
NA
NA
NA
5296
56208
Origination
No
No
No
Yes
NA
8.0e+08
Increasing from 1.8:1 to 6:1
Net Worth: 8e+008, Min. Interest Coverage Ratio: Increasing from 1.80 to 6.00
Indicated consolidated net worth fluctuates between EUR 800M and EUR 500M.
NA
NA
Yes
NA
NA
NA
5296
56335
Origination
No
No
No
Yes
NA
8.0e+08
Increasing from 1.8:1 to 6:1
Net Worth: 8e+008, Min. Interest Coverage Ratio: Increasing from 1.80 to 6.00
Indicated consolidated net worth fluctuates between EUR 800M and EUR 500M.
NA
NA
Yes
NA
NA
NA
5260
14653
Origination
No
No
No
Yes
NA
NA
Decreasing from 3.5:1 to 2.5:1
Increasing from 3:1 to 4:1
Min. Debt Service Coverage Ratio: Decreasing from 3.50 to 2.50, Min. Interest Coverage Ratio: Increasing from 3.00 to 4.00
Carries two covenants: The interest coverage ratio must be three times until December 31 2004, from June 30, 2005 until December 31, 2005 it must be 3.5 times, after which time it must be four times. Total net debt coverage ratio must be no higher 3.5 times, until June 30, 2005. From December 31, 2005 until June 39, 2007 it must be three times. After December 31, 2007 it must be four times.
NA
NA
No
NA
NA
NA
5260
14654
Origination
No
No
No
Yes
NA
NA
Decreasing from 3.5:1 to 2.5:1
Increasing from 3:1 to 4:1
Min. Debt Service Coverage Ratio: Decreasing from 3.50 to 2.50, Min. Interest Coverage Ratio: Increasing from 3.00 to 4.00
Carries two covenants: The interest coverage ratio must be three times until December 31 2004, from June 30, 2005 until December 31, 2005 it must be 3.5 times, after which time it must be four times. Total net debt coverage ratio must be no higher 3.5 times, until June 30, 2005. From December 31, 2005 until June 39, 2007 it must be three times. After December 31, 2007 it must be four times.
NA
NA
No
NA
NA
NA
5261
14650
Origination
No
No
No
Yes
NA
NA
Decreasing from 2.75:1 to 2.25:1
Increasing from 3:1 to 4:1
Min. Debt Service Coverage Ratio: Decreasing from 2.75 to 2.25, Min. Interest Coverage Ratio: Increasing from 3.00 to 4.00
Carries two covenants: The interest coverage ratio must be three times until June 2005, and four times after December 2005. The total net debt coverage ratio must be no higher than 2.75 times until June 2004, must be down to 2.5 times by December 2004, and down further to 2.25 times by December 2005.
NA
NA
No
NA
NA
NA
5261
14651
Origination
No
No
No
Yes
NA
NA
Decreasing from 2.75:1 to 2.25:1
Increasing from 3:1 to 4:1
Min. Debt Service Coverage Ratio: Decreasing from 2.75 to 2.25, Min. Interest Coverage Ratio: Increasing from 3.00 to 4.00
Carries two covenants: The interest coverage ratio must be three times until June 2005, and four times after December 2005. The total net debt coverage ratio must be no higher than 2.75 times until June 2004, must be down to 2.5 times by December 2004, and down further to 2.25 times by December 2005.
NA
NA
No
NA
NA
NA
4229
14638
Origination
Yes
No
No
No
NA
NA
Net Debt: Annualised EBITDA not exceeding 4x.
NA
NA
No
NA
NA
NA
4229
14639
Origination
Yes
No
No
No
NA
NA
Net Debt: Annualised EBITDA not exceeding 4x.
NA
NA
No
NA
NA
NA
4229
14640
Origination
Yes
No
No
No
NA
NA
Net Debt: Annualised EBITDA not exceeding 4x.
NA
NA
No
NA
NA
NA
4290
14755
Origination
Yes
No
No
No
NA
NA
Deal has no covenants.
NA
NA
No
NA
NA
NA
5686
59146
Origination
Yes
No
No
No
NA
NA
A minimum net worth of EUR5.5B, a maximum gearing of 1.2:1 or 120%.
NA
NA
No
NA
NA
NA
162655
248891
Origination
No
No
No
Yes
Decreasing from 0.75:1 to 0.7:1
NA
NA
Increasing from 1.6:1 to 1.8:1
Max. Leverage Ratio: Decreasing from 0.75 to 0.70, Min. Interest Coverage Ratio: Increasing from 1.60 to 1.80
If extension option applies, min. initial EBITDA = $2.7B and min. final EBITDA = $3.2B.
NA
NA
Yes
100
100
NA
16522
40264
Origination
Yes
No
No
No
NA
NA
Covenants: Rolling 12 month ICR > 1.20x
NA
NA
No
NA
NA
NA
16522
40265
Origination
Yes
No
No
No
NA
NA
Covenants: Rolling 12 month ICR > 1.20x
NA
NA
No
NA
NA
NA
166621
252405
Origination
No
No
No
No
NA
NA
Negative pledge, restriction of sale of material assets, shareholders covenants
NA
NA
No
NA
NA
NA
76957
111400
Origination
No
No
No
No
NA
NA
Put option if government ceases to own more than 50% of the issuer
NA
NA
No
NA
NA
NA
89765
168065
Origination
No
No
No
No
NA
NA
Joint and several guarantee from Evergreen International SA and personal guarantee of Chang Yung Fa, president of Evergreen
NA
NA
No
NA
NA
NA
211
52290
Origination
Yes
No
No
Yes
0.95:1
NA
NA
Increasing from 0.65:1 to 2:1
1.5:1
Max. Leverage Ratio: Value is 0.95, Min. Interest Coverage Ratio: Increasing from 0.65 to 2.00, Min. Current Ratio: Value is 1.50
Indicated leverage ratio is debt to equity + sub. debt.
70
100
Yes
0
100
0
211
52488
Origination
Yes
No
No
Yes
0.95:1
NA
NA
Increasing from 0.65:1 to 2:1
1.5:1
Max. Leverage Ratio: Value is 0.95, Min. Interest Coverage Ratio: Increasing from 0.65 to 2.00, Min. Current Ratio: Value is 1.50
Indicated leverage ratio is debt to equity + sub. debt.
70
100
Yes
0
100
0
Some remarks:
The variable Covenants is a flag indicator for whether financial covenants are included in the contract.
Relating to Section s3.2/s3.3c, a renegotiation can be identified as having either Tranche_O_A\not=Origination OR Deal_Refinancing = Yes.
6-K rather than 8-K filing is an SEC filing submitted to the U.S. Securities and Exchange Commission used by certain foreign private issuers to provide information that is: Required to be made public in the country of its domicile. Filed with and made public by a foreign stock exchange on which its securities are traded.
Use LPC_Tranche_ID = 215589 as an example: its 6-K filing can be found here.
an interesting point is that at the start of the document, it states “… AS AMENDED AND RESTATED …”. Thus, this loan is renegotiated.
item 5 “REPAYMENT” and sub-item 5.1: repayment and the conditions for rolling over the loan.
item 6 “PREPAYMENT AND CANCELLATION”: voluntary pre-payment is allowed.
sub-item 17.8 “Testing of Financial Covenants”: specify the testing frequencies of each covenant.
s3.5 Covenants Preview
Look into the type of covenants and still use the Aeroflex Inc. as the example. I can also compare to the information presented in Roberts (2015) to cross-validate.
Table 2. Panel B: Aeroflex Inc. Deal-Tranche Level Loan Path
LPC Tranche_ID
Deal Amended
Amend Extend_Flag
Tranche Amended
Deal Refinancing
Tranche O_A
Tranche Refinancing
Tranche Maturity_Date
Tenor Maturity
Deal Amount
Tranche Amount
Deal Active_Date
Deal Input_Date
Tranche Active_Date
Tranche Type
Deal Purpose
Phase
Purpose Remark
Deal Remark
Tranche Remark
Performance Pricing_Remark
Deal: 128721
224767
No
No
No
Yes
Origination
2000-09-30
54
20.00
4.00
1996-03-15
1998-09-09
1996-03-15
Term Loan
General Purpose/Refinance
Closed
Background: Credit amends and restates a $8M agreement dated 4/11/94. Co. was formerly known as ARX Inc. Credit is also arranged for a number of subsids and backs the acquisition of MIC Technology. Pricing: (See grid).
Pricing is as indicated thru 6/30/96, tied to co.'s debt to EBITDA ratio thereafter.
273100
No
No
No
Yes
Origination
1999-03-31
36
20.00
16.00
1996-03-15
1998-09-09
1996-03-15
Revolver/Line >= 1 Yr.
General Purpose/Refinance
Closed
Background: Credit amends and restates a $8M agreement dated 4/11/94. Co. was formerly known as ARX Inc. Credit is also arranged for a number of subsids and backs the acquisition of MIC Technology. Pricing: (See grid).
Option: $2M LC sublimit. Security: Borrow. base = 80% of elig. receivs. plus 40% of elig. invent.
Pricing is as indicated thru 6/30/96, tied to co.'s debt to EBITDA ratio thereafter.
Deal: 143473
185023
No
No
No
Yes
Origination
2002-12-31
46
47.48
20.00
1999-02-25
1999-03-10
1999-02-25
Term Loan
General Purpose/Refinance
Closed
Background: Credit amends and restates a $20M agreement dated 3/15/96. Credit is also arranged for several subsids. Pricing: (See grid). Default rate = +300 bps. Key Financial Ratios: Max. consol. sr. funded debt to EBITDA ratio of 2.75:1; max. consol. unsub. debt to consol. effective net worth ratio of 1.5:1; min. debt service ratio of 1:1; min. quick ratio of 1:1.
Pricing is as indicated thru. 9/30/99, tied to co.'s consol. sr. funded debt to EBITDA ratio thereafter.
186036
No
No
No
Yes
Origination
2002-12-31
46
47.48
23.00
1999-02-25
1999-03-10
1999-02-25
Revolver/Line >= 1 Yr.
General Purpose/Refinance
Closed
Background: Credit amends and restates a $20M agreement dated 3/15/96. Credit is also arranged for several subsids. Pricing: (See grid). Default rate = +300 bps. Key Financial Ratios: Max. consol. sr. funded debt to EBITDA ratio of 2.75:1; max. consol. unsub. debt to consol. effective net worth ratio of 1.5:1; min. debt service ratio of 1:1; min. quick ratio of 1:1.
Min. SBLC fee = the greater of 50 bps and $1K. Option: $3M LC sublimit. Security: Borrow. base = 85% of elig. receivs. plus 25-85% of elig. invent.
Pricing is as indicated thru. 9/30/99, tied to co.'s consol. sr. funded debt to EBITDA ratio thereafter.
278055
No
No
No
Yes
Origination
2008-04-30
110
47.48
4.48
1999-02-25
1999-03-10
1999-02-25
Revolver/Line >= 1 Yr.
General Purpose/Refinance
Closed
Background: Credit amends and restates a $20M agreement dated 3/15/96. Credit is also arranged for several subsids. Pricing: (See grid). Default rate = +300 bps. Key Financial Ratios: Max. consol. sr. funded debt to EBITDA ratio of 2.75:1; max. consol. unsub. debt to consol. effective net worth ratio of 1.5:1; min. debt service ratio of 1:1; min. quick ratio of 1:1.
Reductions: 109 mthly. reductions of $26,222.22 beg. 2/26/99; with a final payment of $1.626M at maturity.
Deal: 42818
83949
No
No
No
Yes
Origination
2008-04-30
62
53.23
3.23
2003-02-14
2003-02-28
2003-02-14
Term Loan
Working capital
Closed
Background: Credit amends and restates a $47.484M agreement dated 02/25/99 and is also arranged for several subsids. Pricing: (See grid). Default rate = applic. P+200. Security: Credit includes a springing lien. Key Financial Ratios: Max. consolidated senior funded debt to consolidated adjusted EBITDA ratio of 2.75:1; min. consolidated fixed charged coverage ratio of 1.5:1; min. quick ratio of 1:1 anytime obligations are not secured by the springing collateral, 0.85:1 otherwise.
Facility is a mortgage facility. Pricing: Is not grid-based.
98794
No
No
No
Yes
Origination
2007-02-14
48
53.23
50.00
2003-02-14
2003-02-28
2003-02-14
Revolver/Line >= 1 Yr.
Working capital
Closed
Background: Credit amends and restates a $47.484M agreement dated 02/25/99 and is also arranged for several subsids. Pricing: (See grid). Default rate = applic. P+200. Security: Credit includes a springing lien. Key Financial Ratios: Max. consolidated senior funded debt to consolidated adjusted EBITDA ratio of 2.75:1; min. consolidated fixed charged coverage ratio of 1.5:1; min. quick ratio of 1:1 anytime obligations are not secured by the springing collateral, 0.85:1 otherwise.
Option: $10M LC sublimit.
Pricing is as indicated initially, tied to co.'s consolidated senior funded debt to consolidated adjusted EBITDA ratio thereafter. Min. SBLC fee = the greater of $1K or 50% of SBLC face value.
Credit may be denominated in Euros and British Pounds and may be increased up to $150M. J.P. Morgan Securities Inc. acted as lead arranger and sole bookrunner. Law Firm: Kramer Wactlar & Liberman PC (for borrowers). Pricing: (See grid). Overdue rate = +200 bps.
Pricing is tied to company's consolidated total debt to consolidated EBITDA ratio thereafter. Company pays a SBLC fee = applicable LIBOR margin and an issuance fee of 25 bps.
197238
Yes
No
Yes
Yes
Amendment 1
2011-03-21
55
100.00
100.00
2006-03-21
2006-08-28
2006-08-28
Revolver/Line >= 1 Yr.
Working capital
Closed
Pricing is tied to company's consolidated total debt to consolidated EBITDA ratio thereafter. Company pays a SBLC fee = applicable LIBOR margin and an issuance fee of 25 bps.
Deal: 57853
108980
No
No
No
No
Origination
NA
NA
780.00
245.00
2007-04-13
2007-03-30
2007-04-13
Term Loan
Leveraged Buyout
Cancelled
Credit backs buyout of co. by General Atlantic and Francisco Partners.
JP Morgan and Lehman Brothers are leading the deal.
This is a second-lien facility.
230824
No
No
No
No
Origination
NA
NA
780.00
475.00
2007-04-13
2007-03-30
2007-04-13
Term Loan B
Leveraged Buyout
Cancelled
Credit backs buyout of co. by General Atlantic and Francisco Partners.
JP Morgan and Lehman Brothers are leading the deal.
98546
No
No
No
No
Origination
NA
NA
780.00
60.00
2007-04-13
2007-03-30
2007-04-13
Revolver/Line >= 1 Yr.
Leveraged Buyout
Cancelled
Credit backs buyout of co. by General Atlantic and Francisco Partners.
JP Morgan and Lehman Brothers are leading the deal.
Deal: 16163
35910
No
No
No
Yes
Origination
2013-08-15
72
575.00
50.00
2007-08-15
2007-06-25
2007-08-15
Revolver/Line >= 1 Yr.
Leveraged Buyout
Closed
Credit backs company's LBO by Veritas Capital's and refinances company's 5-year RC facility agreement dated 3/21/06 and its fifth amended and restated loan dated 2/14/03.
Credit is arranged for AX Acquisition Corp. Credit may be increased up to $650M by increasing RC facility or thru additional TL facilities, if company's consolidated senior secured debt to consolidated adjusted EBITDA ratio <= 3.75:1. Credit comes in conjunction with $225M senior unsecured TL loan agreement and $120M subordinated unsecured TL agreement (which were cancelled 8/16/07) and $272M of equity ($172M by Golden Gate Capital and $100M by GS Direct). Goldman Sachs Credit Partners LP also acted as sole lead arranger and sole bookrunner. Law Firms: Schulte, Roth & Zabel LLP (for borrower); Latham & Watkins LLP (for lender). Pricing: (See grid). Default rate = +200 bps. Interest Rate Protection: Company must enter, within 60 days of closing, into agreements hedging >= 50% of the aggregate principal amount of the total debt outstanding for at least three years.
Pricing is as indicated initially, tied to company's consolidated senior secured debt to consolidated adjusted EBITDA ratio thereafter. Company pays a SBLC fee = applicable LIBOR margin and an issuance fee of 25 bps. Co. pays a 50 bps commitment fee when ratio > 3:1, 37.5 bps when ratio >2:1 but < 3:1, and 25 bps when ratio <2:1.
35911
No
No
No
Yes
Origination
2014-08-15
84
575.00
400.00
2007-08-15
2007-06-25
2007-08-15
Term Loan B
Leveraged Buyout
Closed
Credit backs company's LBO by Veritas Capital's and refinances company's 5-year RC facility agreement dated 3/21/06 and its fifth amended and restated loan dated 2/14/03.
Credit is arranged for AX Acquisition Corp. Credit may be increased up to $650M by increasing RC facility or thru additional TL facilities, if company's consolidated senior secured debt to consolidated adjusted EBITDA ratio <= 3.75:1. Credit comes in conjunction with $225M senior unsecured TL loan agreement and $120M subordinated unsecured TL agreement (which were cancelled 8/16/07) and $272M of equity ($172M by Golden Gate Capital and $100M by GS Direct). Goldman Sachs Credit Partners LP also acted as sole lead arranger and sole bookrunner. Law Firms: Schulte, Roth & Zabel LLP (for borrower); Latham & Watkins LLP (for lender). Pricing: (See grid). Default rate = +200 bps. Interest Rate Protection: Company must enter, within 60 days of closing, into agreements hedging >= 50% of the aggregate principal amount of the total debt outstanding for at least three years.
Facility is a first-out loan which carries a call protection of 101.
Pricing is as indicated initially, tied to company's consolidated senior secured debt to consolidated adjusted EBITDA ratio thereafter.
36226
No
No
No
Yes
Origination
2014-08-15
84
575.00
125.00
2007-08-15
2007-06-25
2007-08-15
Term Loan C
Leveraged Buyout
Closed
Credit backs company's LBO by Veritas Capital's and refinances company's 5-year RC facility agreement dated 3/21/06 and its fifth amended and restated loan dated 2/14/03.
Credit is arranged for AX Acquisition Corp. Credit may be increased up to $650M by increasing RC facility or thru additional TL facilities, if company's consolidated senior secured debt to consolidated adjusted EBITDA ratio <= 3.75:1. Credit comes in conjunction with $225M senior unsecured TL loan agreement and $120M subordinated unsecured TL agreement (which were cancelled 8/16/07) and $272M of equity ($172M by Golden Gate Capital and $100M by GS Direct). Goldman Sachs Credit Partners LP also acted as sole lead arranger and sole bookrunner. Law Firms: Schulte, Roth & Zabel LLP (for borrower); Latham & Watkins LLP (for lender). Pricing: (See grid). Default rate = +200 bps. Interest Rate Protection: Company must enter, within 60 days of closing, into agreements hedging >= 50% of the aggregate principal amount of the total debt outstanding for at least three years.
Facility is a first-loss loan which carries a call protection of 102 and 101.
Pricing is as indicated initially, tied to company's consolidated senior secured debt to consolidated adjusted EBITDA ratio thereafter.
Deal: 16164
43063
Yes
No
Yes
Yes
Origination
Yes
2016-12-31
67
669.12
75.00
2011-05-09
2011-04-27
2011-05-09
Revolver/Line >= 1 Yr.
General Purpose
Closed
JP Morgan is leading the deal. LIBOR floor = 1.25%. OID = 99.5.
Price talk: LIB+325-350.
43063
Yes
No
Yes
Yes
Amendment 1
Yes
2016-12-31
55
669.12
75.00
2011-05-09
2012-05-25
2012-05-25
Revolver/Line >= 1 Yr.
General Purpose
Closed
43063
Yes
No
Yes
Yes
Amendment 2
Yes
2017-11-28
54
669.12
57.12
2011-05-09
2013-05-14
2013-05-28
Revolver/Line >= 1 Yr.
General Purpose
Closed
Credit will be used to refinance co.'s existing loan.
JP Morgan led the deal.
Prior to close, facility was decreased from $75M.
43064
Yes
No
Yes
Yes
Origination
Yes
2018-12-31
91
669.12
725.00
2011-05-09
2011-04-27
2011-05-09
Term Loan B
General Purpose
Closed
JP Morgan is leading the deal. LIBOR floor = 1.25%. OID = 99.5.
Pricing: LIB+300 (from initial talk of LIB+325-350). Facility has 101 soft call protection.
43064
Yes
No
Yes
Yes
Amendment 1
Yes
2018-12-31
79
669.12
725.00
2011-05-09
2012-05-25
2012-05-25
Term Loan B
General Purpose
Closed
Pricing is as indicated initially, tied to the co.'s total debt to EBITDA ratio thereafter.
43064
Yes
No
Yes
Yes
Amendment 2
Yes
2019-11-28
78
669.12
612.00
2011-05-09
2013-05-14
2013-05-28
Term Loan B
General Purpose
Closed
Credit will be used to refinance co.'s existing loan.
JP Morgan led the deal.
Prior to close, facility was increased by $6M to $612M. Pricing: LIB+350 (tighter end of LIB+350-375 talk). LIBOR floor = 1%. OID = 99.75 (tightened from 99.5). Facility will include 101 soft call protection for one year.
Table 2. Panel B: Aeroflex Inc. Covenants - Financial and General
LPC Tranche_ID
Deal Refinancing
Deal Amended
Tranche Refinancing
Tranche Amended
Tranche O_A
Deal Amount
Tranche Amount
Deal Active_Date
Tranche Active_Date
Covenants
Max Leverage_Ratio
Max Debt_to_Cash_Flow
Max Sr_Debt_to_Cash_Flow
Tangible Net_Worth
Net Worth
Min Fixed_Charge_Coverage_Ratio
Min Debt_Service_Coverage_Ratio
Min Interest_Coverage_Ratio
Min Cash_Interest_Coverage_Ratio
Max Debt_to_Tangible_Net_Worth
Max Debt_to_Equity_Ratio
Min Current_Ratio
Max Loan_to_Value_Ratio
All Covenants_Financial
Covenant Comment
Deal: 128721
224767
Yes
No
No
Origination
20.00
4.00
1996-03-15
1996-03-15
No
NA
NA
273100
Yes
No
No
Origination
20.00
16.00
1996-03-15
1996-03-15
No
NA
NA
Deal: 143473
185023
Yes
No
No
Origination
47.48
20.00
1999-02-25
1999-02-25
Yes
2.75:1
NA
6.00e+07
1:1
Max. Sr. Debt to Cash Flow: Value is 2.75, Net Worth: 6e+007, Min. Debt Service Coverage Ratio: Value is 1.00
186036
Yes
No
No
Origination
47.48
23.00
1999-02-25
1999-02-25
Yes
2.75:1
NA
6.00e+07
1:1
Max. Sr. Debt to Cash Flow: Value is 2.75, Net Worth: 6e+007, Min. Debt Service Coverage Ratio: Value is 1.00
278055
Yes
No
No
Origination
47.48
4.48
1999-02-25
1999-02-25
Yes
2.75:1
NA
6.00e+07
1:1
Max. Sr. Debt to Cash Flow: Value is 2.75, Net Worth: 6e+007, Min. Debt Service Coverage Ratio: Value is 1.00
Deal: 42818
83949
Yes
No
No
Origination
53.23
3.23
2003-02-14
2003-02-14
Yes
2.75:1
NA
1.65e+08
1.5:1
Max. Debt to Cash Flow: Value is 2.75, Net Worth: 1.65e+008, Min. Fixed Charge Coverage Ratio: Value is 1.50
98794
Yes
No
No
Origination
53.23
50.00
2003-02-14
2003-02-14
Yes
2.75:1
NA
1.65e+08
1.5:1
Max. Debt to Cash Flow: Value is 2.75, Net Worth: 1.65e+008, Min. Fixed Charge Coverage Ratio: Value is 1.50
Deal: 151556
197238
Yes
Yes
Yes
Origination
100.00
100.00
2006-03-21
2006-03-21
Yes
2.75:1
NA
NA
3:1
Max. Debt to Cash Flow: Value is 2.75, Min. Interest Coverage Ratio: Value is 3.00
197238
Yes
Yes
Yes
Amendment 1
100.00
100.00
2006-03-21
2006-08-28
Yes
NA
NA
Max. Debt to Cash Flow: Value is 2.75, Min. Interest Coverage Ratio: Value is 3.00
Deal: 57853
108980
No
No
No
Origination
780.00
245.00
2007-04-13
2007-04-13
No
NA
NA
230824
No
No
No
Origination
780.00
475.00
2007-04-13
2007-04-13
No
NA
NA
98546
No
No
No
Origination
780.00
60.00
2007-04-13
2007-04-13
No
NA
NA
Deal: 16163
35910
Yes
No
No
Origination
575.00
50.00
2007-08-15
2007-08-15
Yes
Decreasing from 9:1 to 5.2:1
NA
NA
Max. Debt to Cash Flow: Decreasing from 9.00 to 5.20
35911
Yes
No
No
Origination
575.00
400.00
2007-08-15
2007-08-15
Yes
Decreasing from 9:1 to 5.2:1
NA
NA
Max. Debt to Cash Flow: Decreasing from 9.00 to 5.20
36226
Yes
No
No
Origination
575.00
125.00
2007-08-15
2007-08-15
Yes
Decreasing from 9:1 to 5.2:1
NA
NA
Max. Debt to Cash Flow: Decreasing from 9.00 to 5.20
Deal: 16164
43063
Yes
Yes
Yes
Yes
Origination
669.12
75.00
2011-05-09
2011-05-09
No
NA
NA
43063
Yes
Yes
Yes
Yes
Amendment 1
669.12
75.00
2011-05-09
2012-05-25
Yes
NA
NA
Max. Debt to Cash Flow: Value is 5.75
43063
Yes
Yes
Yes
Yes
Amendment 2
669.12
57.12
2011-05-09
2013-05-28
Yes
NA
NA
Max. Debt to Cash Flow: Value is 5.75
43064
Yes
Yes
Yes
Yes
Origination
669.12
725.00
2011-05-09
2011-05-09
No
NA
NA
43064
Yes
Yes
Yes
Yes
Amendment 1
669.12
725.00
2011-05-09
2012-05-25
Yes
NA
NA
Max. Debt to Cash Flow: Value is 5.75
43064
Yes
Yes
Yes
Yes
Amendment 2
669.12
612.00
2011-05-09
2013-05-28
Yes
NA
NA
Max. Debt to Cash Flow: Value is 5.75
Some related questions:
Definitions
S4. Future Notes
The next step is to follow the procedure in Roberts (2015) to first identify whether the contract terms are changed. In particular, I need to identify whether covenants are changed and what type of covenants is updated, which the changing direction. Then, summarize the changing frequencies and get summary statistics. The most important one is Table 5.
Reference
Roberts, M.R., 2015. The role of dynamic renegotiation and asymmetric information in financial contracting. Journal of Financial Economics 116, 61–81. https://doi.org/10.1016/j.jfineco.2014.11.013
---title: "DealScan Renegotiation Data"author: "Hongyi Xu"date: "June 13, 2024"date-modified: last-modifiedformat: html: theme: flatly toc: true code-fold: true code-tools: true code-summary: "Show the code" html-math-method: katex toc-location: left editor: visual---[> Back to research](https://hongyileoxu.github.io/research/)```{=html}<style type="text/css">body, td { font-size: 16px;}code.r{ font-size: 12px;}pre { font-size: 12px}</style>``````{r setup, include=FALSE}knitr::opts_chunk$set(echo = TRUE) setwd("~/Library/CloudStorage/OneDrive-HandelshögskolaniStockholm/Projects_2024/Dealscan_LinkTable/DealScan_Data_Renegotiations_Jun2024")list.files(pattern = ".csv")library(tidyverse)library(readxl)library(data.table)library(ggplot2)library(ggthemes)library(shadowtext)library(egg)library(gt)library(psych)library(zoo)library(fedmatch)# library(arrow)```## S1. Objective {#sec-s1.-objective}This file follows the creation of the link table update the end of 2023. [The file](https://livehhsse-my.sharepoint.com/:f:/r/personal/65570_student_hhs_se/Documents/Projects_2024/Dealscan_LinkTable/DealScan_Link_Table_Compustat_Jun2024?csf=1&web=1&e=n68lWi) is called [Link_table_2024.RData](https://livehhsse-my.sharepoint.com/:u:/r/personal/65570_student_hhs_se/Documents/Projects_2024/Dealscan_LinkTable/DealScan_Link_Table_Compustat_Jun2024/Link_table_2024.RData?csf=1&web=1&e=PvzxRC). The manual document can be found in file "DealScan_Link_Table_Compustat.html".The purpose of this document is to document the flow of logic in identifying amendaments/renegotiations/refinancing of exiting syndicated loan contracts in the LPC DealScan data.## S2. Examples {#sec-s2.-examples}[An updated manual](https://wrds-www.wharton.upenn.edu/pages/support/manuals-and-overviews/thomson-reuters/wrds-reuters-dealscan/wrds-overview-on-dealscan-loanconnector/#linking-with-other-databases) about DealScan in WRDS. - <font size="2">updated Nov 2021</font>- Example 1: *Starwood Hotels & Resorts Worldwide* (Borrower_Id='9514') - Apr 20, 2010: [8-K for the new credit agreement](https://www.sec.gov/Archives/edgar/data/316206/000129993310001593/htm_37246.htm) - November 30, 2012: [8-K for the refinancing deal](https://www.sec.gov/Archives/edgar/data/316206/000119312512491462/d449323d8k.htm) - The deal is identified as a "refinancing" deal because in the "Item 1.01 Entry into a Material Definitive Agreement", it says: > ... The Credit Agreement is a \$1.75 billion revolving credit facility, which refinanced the existing \$1.50 billion Credit Agreement dated April 20, 2010, as amended (the "2010 Credit Facility"), that would have matured in November 2013. - Note that the firm is acquired by *Marriott International Inc* (Borrower_Id='18487') in 2016. - `LPC_Deal_ID` and`LPC_Tranche_ID` are kept even after refinancing. - To track changes/amendments: `Deal_Amended`, `Tranche_Amended`, and `Tranche_O_A`. - `Trance_O_A`: *Origination*, *Amendment 1*, etc. - To track refinancing: `Deal_Refinancing` and `Tranche_Refinancing`.<!-- Selected Variables: --><!-- LPC_Deal_ID, LPC_Tranche_ID, --><!-- Deal_Active, Deal_Active_Date, Deal_Amended, Deal_Refinancing, Deal_Amount, --><!-- Tranche_Amended, Tranche_O_A, Tranche_Active_Date, Tranche_Refinancing, Tranche_Amount -->## S2. Data sources {#sec-s2.-data-sources}[LPC DealScan]{style="color: red;"} from WRDS.## S3. DealScan Data Preview {#sec-s3.-dealscan-data-preview}### s3.1 Deal Purposes {#sec-s3.1-deal-purposes}```{r dealscan, echo=TRUE, results='hide', fig.width=10,fig.height=8, warning=FALSE}## build up and clean the dataset # DealScan <- fread("hi0yvqzhxowsqnpf.csv") # save(DealScan, file = "DealScan.Rdata")# DealScan_borrower <- DealScan %>%# select(- grep(pattern = "Lend|Role", x = names(.), value = T) ) %>% # unique()# save(DealScan_borrower, file = "DealScan_borrower.Rdata")# load("DealScan.Rdata") load("DealScan_borrower.Rdata") # for data only with names(DealScan_borrower)# ## Here is one example: # b_9514 <- DealScan_borrower %>% # filter(Borrower_Id == 9514)# # b_9514 %>% # select(LPC_Deal_ID, LPC_Tranche_ID, # Deal_Active, Deal_Active_Date, Deal_Amended, Deal_Refinancing, Deal_Amount,# Tranche_Amended, Tranche_O_A, Tranche_Active_Date, Tranche_Refinancing, Tranche_Amount) %>% # unique() %>% # arrange(Deal_Active_Date, Tranche_Active_Date) %>% # View("b_9514") # # DealScan_borrower %>% # filter(LPC_Tranche_ID == 52511)# # ## Summary stats for the deals: # Deal_summary <- DealScan_borrower %>% # group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% # summarise(LPC_Tranche_Num = n(), # Tranche_First = min(Tranche_Active_Date), # Tranche_Last = max(Tranche_Active_Date),# ) %>% # ungroup() # Deal_summary %>% head(20)### Look into the deal purpose. dt.Deal_Purpose <- DealScan_borrower %>% select(grep(pattern = "Purpose", x = names(.), value = T)) %>% unique() %>% lapply(X = ., FUN = function(x) unique(x)) %>% as.data.table(.)dt.Deal_Purpose$Deal_Purpose %>% unique()### Look into the number of deals under each purposeDeal_Purpose_Type <- DealScan_borrower %>% group_by(Deal_Purpose) %>% summarise(Deal_Purpose_Type_Num = length(unique(LPC_Deal_ID))) %>% ungroup() %>% arrange(-Deal_Purpose_Type_Num) %>% mutate(Deal_Purpose = paste(format(1:length(Deal_Purpose), width = 2), Deal_Purpose, sep = "-"), Deal_Purpose_Type_Prc = Deal_Purpose_Type_Num / sum(Deal_Purpose_Type_Num) )plt.deal_purpose <- ggplot(Deal_Purpose_Type) + geom_col(aes(y = reorder(Deal_Purpose, Deal_Purpose_Type_Num), x = log10(Deal_Purpose_Type_Num)), fill = "#076fa2", width = 0.9, position = position_dodge(width = 0.9)) + scale_x_continuous( limits = c(0, 5.3), breaks = seq(0, 6, by = 1), expand = c(0.01, 0), # The horizontal axis does not extend to either side position = "top" # Labels are located on the top ) + # The vertical axis only extends upwards scale_y_discrete(expand = expansion(add = c(0, 0.5))) + theme( # Set background color to white panel.background = element_rect(fill = "white"), # Set the color and the width of the grid lines for the horizontal axis panel.grid.major.x = element_line(color = "#A8BAC4", linewidth = 0.3), # Remove tick marks by setting their length to 0 axis.ticks.length = unit(0, "mm"), # Remove the title for both axes axis.title = element_blank(), # Only left line of the vertical axis is painted in black axis.line.y.left = element_line(color = "black"), # Remove labels from the vertical axis axis.text.y = element_blank(), # But customize labels for the horizontal axis axis.text.x = element_text(family = "Courier", size = 10) # "Econ Sans Cnd"; "Comic Sans MS" ) + geom_shadowtext( data = subset(Deal_Purpose_Type, log10(Deal_Purpose_Type_Num) < 3), aes(log10(Deal_Purpose_Type_Num), y = Deal_Purpose, label = Deal_Purpose), fontface = "bold", hjust = 0, nudge_x = 0.1, colour = "#076fa2", bg.colour = "white", bg.r = 0.2, family = "Courier", size = 3 ) + geom_text( data = Deal_Purpose_Type, aes(log10(Deal_Purpose_Type_Num), y = Deal_Purpose, label = sapply(X = Deal_Purpose_Type_Prc*100, FUN = function(x) {paste(ifelse(round(x, digits = 2) == 0, round(x, digits = 3), round(x, digits = 2)), "%" , sep = "")}) ), fontface = "bold", hjust = 0, nudge_x = -0.3, colour = "white", family = "Courier", size = 3 ) + geom_text( data = subset(Deal_Purpose_Type, log10(Deal_Purpose_Type_Num) >= 3), aes(0, y = Deal_Purpose, label = Deal_Purpose), # paste("<b>", Deal_Purpose, "</b>", sep = "")), fontface = "bold", hjust = 0, nudge_x = 0.3, colour = "white", family = "Courier", size = 3 )plt.deal_purpose + labs( title = paste("Deal Purpose: activated between", paste(range(DealScan_borrower$Tranche_Active_Date), collapse = " and ")), subtitle = "Number of Deals for Each Deal Purpose (from WRDS DealScan)" ) + theme( plot.title = element_text( family = "Comic Sans MS", face = "bold", size = 15 ), plot.subtitle = element_text( family = "Comic Sans MS", size = 10 ) ) + annotate( geom = "text", label = paste("Sample Size: ", format(sum(Deal_Purpose_Type$Deal_Purpose_Type_Num), big.mark = ","), sep = ""), # , "\n updated: ", date() x = 4.5, y = 2, color = "#076fa2", family = "Courier", size = 2.5 )```In the above codes, I first use `LPC_Deal_ID` to identify each unique deal and then group by variable `Deal_Purpose` to calculate the number of deals for each purpose. I store the number of deals for each purpose in the dataset `Deal_Purpose_Type` and the above plot. The total number of deal observations is 261007.1. The most frequent purpose is named under the `General Purpose` and the second and third most frequent purposes are `Working Capital` and `Refinancing`. Deals under these three purposes collectively account for around 63% percentage of all the deals in the sample.2. Another big chunk is in the capital investments: real estate, equipment, construction, aircraft & ship, telecom, hardware, etc.3. Another part is the trade finance - no. 11, 13, 21.4. SPV (Project Finance), M&A, LBO (all different buyouts), Takeover.5. Recapitalization (dividend, share repurchase, cash distribution).6. Takeover defense is there but not frequent.### s3.2 Amendaments and Refinancing {#sec-s3.2-amendaments-and-refinancing}The name of each variable is defined in [Loan Connector FTP User Guide and Fact Sheet](https://wrds-www.wharton.upenn.edu/documents/1560/Loan_Connector_FTP_User_Guide_and_Fact_Sheet.xlsx). Through the fuzzy matching, I can match most of the variables in `DealScan_borrower` to that file.<!-- Start the work: June 5, 2024 -->In the next code block, I will look into amendments/refinancing [for firms operating in US]{style="color: red;"}. The date for each step in the syndication process is crucial.Definition of Variables:- Deal/Tranche Identifier: `LPC_Deal_ID`, `LPC_Tranche_ID`;- Size of Deal/Tranche: `Deal_Amount`, `Tranche_Amount`- Amend/Refinancing Flag: `Deal_Amended`, `Tranche_Amended`, `Tranche_O_A`, `Deal_Refinancing`, `Tranche_Refinancing`, `Amend_Extend_Flag`; - `Amend_Extend_Flag`: For analytic purposes, LPC defines an amend and extend during instances when a portion of the lending group wishes not to extend out their commitments. Thus only a percentage of the original overall commitment amount would get extended and that portion would get flagged as amend & extend volume (Yes/No).- Maturity Time: `Tranche_Maturity_Date`, `Tenor_Maturity`;- Deal (re-)Starting Time: `Deal_Active_Date`, `Deal_Input_Date`, `Tranche_Active_Date`.```{r amend_refinance, echo=TRUE, ref.label="amend_refinance", warning=FALSE}## construct the dataset for the deal/tranche amendments or refinancing. dt.Deal_Amend_Refin <- DealScan_borrower %>% filter(Country == "United States") %>% select(grep(x = names(.), pattern = "LPC", value = T), grep(x = names(.), pattern = "Amend", value = T), grep(x = names(.), pattern = "Refinanc|Tranche_O_A", value = T), grep(x = names(.), pattern = "Matur", ignore.case = T, value = T), "Deal_Amount", "Tranche_Amount", "Deal_Active_Date", "Deal_Input_Date", "Tranche_Active_Date" )cat("Variable names: \n")names(dt.Deal_Amend_Refin) # check the selected variables ## some examples: # dt.Deal_Amend_Refin %>% head(30) %>% View("dt.Deal_Amend_Refin")# dt.Deal_Amend_Refin %>% # arrange(LPC_Tranche_ID) %>% # filter(LPC_Deal_ID == 21561) %>% View("dt.Deal_Amend_Refin")## calculate the frequency of deal amend/refinancing in the dataset - ex. "Origination"dt.Deal_Amend_Refin.freq <- dt.Deal_Amend_Refin %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% ## for each deal-tranche IDs over its life-cycle. summarise( ### frequency of tranche amendments - ex. "Origination" Tranche_Change_Freq = length(grep(pattern = "Orig", x = unique(Tranche_O_A), value = T, invert = T )), ### number of different deal size / tranche size Tranche_Size = mean(Tranche_Amount, na.rm = T), ### deal origination year Deal_Start_ym = as.yearmon(unique(Deal_Active_Date)) ) %>% ungroup() %>% mutate(Change_Freq_Positive = ifelse(Tranche_Change_Freq > 0, Tranche_Change_Freq, NA), # keep only observations with deal/tranche modifications Year_groups = cut(as.numeric(Deal_Start_ym), breaks = c(1950, 2000, 2010, 2020, 2030), labels = c("Pre-2000", "2000-2010", "2010-2020", "Post-2020") ) # create decade groups )cat("Data preview: \n")dt.Deal_Amend_Refin.freq %>% head(20) ### double check# dt.Deal_Amend_Refin %>% filter(LPC_Deal_ID == 7)# DealScan_borrower %>% filter(LPC_Deal_ID == 7)# DealScan_borrower %>% filter(Borrower_Id == 228)### visualization names(dt.Deal_Amend_Refin.freq)#### number of unique deal / deal-tranche apply(dt.Deal_Amend_Refin.freq[1:2], MARGIN = 2, FUN = function(x) length(unique(x)) )nrow(names(dt.Deal_Amend_Refin.freq))#### frequencydt.Deal_Amend_Refin.plot <- dt.Deal_Amend_Refin.freq %>% na.omit() %>% group_by(Change_Freq_Positive, Year_groups) %>% summarise(n = n()) %>% ungroup() %>% group_by(Year_groups) %>% mutate(share_in_yeargroup = n / sum(n, na.rm = T) * 100) %>% ungroup()ggplot(data = na.omit(dt.Deal_Amend_Refin.plot), aes(fill = Year_groups, x = Change_Freq_Positive, y = n) ) + geom_bar(position="stack", stat="identity") # + # scale_y_continuous(name = "Number of Deal-Tranche", trans='log10')ggplot(na.omit(dt.Deal_Amend_Refin.plot), aes(fill=Year_groups, y=n, x=Change_Freq_Positive)) + geom_bar(position="dodge", stat="identity") + scale_y_continuous(name = "Number of Deal-Tranche w/ Amendments") + scale_x_continuous(name = "Frequency of Amendments")ggplot(na.omit(dt.Deal_Amend_Refin.plot), aes(fill=Year_groups, y=share_in_yeargroup, x=Change_Freq_Positive)) + geom_bar(position="dodge", stat="identity") + scale_y_continuous(name = "Number of Deal-Tranche w/ Amendments") + scale_x_continuous(name = "Frequency of Amendments")#### number of deal-tranche (1 to 10)fig_amend_count <- ggplot(na.omit(filter(dt.Deal_Amend_Refin.plot, Change_Freq_Positive <= 10)), aes(fill=Year_groups, y=n, x=Change_Freq_Positive)) + geom_bar(position="dodge", stat="identity") + # scale_y_continuous(name = "Number of Deal-Tranche w/ Amendments") + scale_x_continuous(name = "Frequency of Amendments", breaks = 1:10) + labs(title = "Number of Deal-Tranches w/ Amendments", subtitle = "Number of Deal-Tranche w/ Amendments", fill = "Origination Year Groups") + theme_economist( base_size = 10, base_family = "Courier", horizontal = TRUE, dkpanel = FALSE ) + theme( # Remove labels from the vertical axis axis.title.y = element_blank(), axis.text.x = element_text(vjust=3), axis.text.y = element_text(hjust=1), axis.ticks = element_blank(), # Title format plot.title = element_text( family = "Comic Sans MS", face = "bold", size = 13.5, hjust = 0 # shift the ), # Subtitle format plot.subtitle = element_text( family = "Comic Sans MS", size = 12, hjust = 0 ), # plot.title.position = "plot", legend.text = element_text(size=10), #change font size of legend text legend.title = element_text(size=10), #change font size of legend title legend.position = "top", legend.key.size = unit(0.3, 'cm') # change the size of the legend key - the blocks )#### share of deal-tranche within each year group (1 to 10)fig_amend_share <- ggplot(na.omit(filter(dt.Deal_Amend_Refin.plot, Change_Freq_Positive <= 10)), aes(fill=Year_groups, y=share_in_yeargroup, x=Change_Freq_Positive)) + geom_bar(position="dodge", stat="identity") + # scale_y_continuous(name = ) + scale_x_continuous(name = "Frequency of Amendments", breaks = 1:10) + labs(title = "Share of Deal-Tranches w/ Amendments within Origination-year Group", subtitle = "Percentage of Deal-Tranche w/ Amendments (%)", fill = "Origination Year Groups") + theme_economist( base_size = 10, base_family = "Courier", horizontal = TRUE, dkpanel = FALSE ) + theme( # Remove labels from the vertical axis axis.title.y = element_blank(), axis.text.x = element_text(vjust=3), axis.text.y = element_text(hjust=1), axis.ticks = element_blank(), # Title format plot.title = element_text( family = "Comic Sans MS", face = "bold", size = 13.5, hjust = 0 # shift the ), # Subtitle format plot.subtitle = element_text( family = "Comic Sans MS", size = 12, hjust = 0 ), # plot.title.position = "plot", legend.text = element_text(size=10), #change font size of legend text legend.title = element_text(size=10), #change font size of legend title legend.position = "top", legend.key.size = unit(0.3, 'cm') # change the size of the legend key - the blocks )cowplot::plot_grid(fig_amend_count, fig_amend_share, ncol = 1)# ggplot(na.omit(dt.Deal_Amend_Refin.plot), aes(fill=Year_groups, y=n, x=Change_Freq_Positive)) + # geom_bar(position="dodge", stat="identity") + # scale_y_continuous(name = "Number of Deal-Tranche w/ Amendments") + # scale_x_continuous(name = "Frequency of Amendments")quantile(dt.Deal_Amend_Refin.freq$Change_Freq_Positive, na.rm = T)quantile(dt.Deal_Amend_Refin.freq$Tranche_Size, na.rm = T)plot(x = log10(dt.Deal_Amend_Refin.freq$Tranche_Size), y = dt.Deal_Amend_Refin.freq$Change_Freq_Positive, col = dt.Deal_Amend_Refin.freq$Year_groups)# legend("topright", col = dt.Deal_Amend_Refin.freq$Year_groups, legend = dt.Deal_Amend_Refin.freq$Year_groups, lty = 1:4, cex = 1)describe(dt.Deal_Amend_Refin.freq %>% select("Tranche_Change_Freq", "Change_Freq_Positive"), IQR = T) describe(dt.Deal_Amend_Refin.freq %>% filter(Year_groups != "Post-2020") %>% select("Tranche_Change_Freq", "Change_Freq_Positive"), IQR = T) dt.Deal_Amend_Refin.freq %>% group_by(LPC_Deal_ID) %>% summarise(Deal_Change_Freq = max(Tranche_Change_Freq)) %>% ungroup() %>% describe() ```Among all `r nrow(dt.Deal_Amend_Refin.freq) %>% format(big.mark = ",")` unique Deal-Tranche observations, `r nrow(na.omit(dt.Deal_Amend_Refin.freq)) %>% format(big.mark = ",")` of those have recorded amendments to their Deal-Tranches. Among deals experienced amendments, each Deal-Tranche is amended on average `r round(mean(dt.Deal_Amend_Refin.freq$Change_Freq_Positive, na.rm = T), digits = 1)` times and this seems to be quite stable to the origination time of the Deal-Tranche. This is somewhat consistent with the idea that the renegotiation is not rare.::: {.alert .alert-dismissible .alert-info}<button type="button" class="btn-close" data-bs-dismiss="alert"></button><strong>Heads up!</strong> However, one thing to be noted is <a href="##sec-s3.2-amendaments-and-refinancing" class="alert-link">the renegotiation with the good or bad news are not distinguished</a> in the above statistics..:::### s3.3 Follow Roberts (2015) {#sec-s3.3-follow-roberts2015}For Table B1, I extract the loan information and path for Aeroflex Inc. (`Borrower_Id` = 8532) from the dataset `DealScan_borrower`. [Company SEC Filings](https://www.sec.gov/edgar/browse/?CIK=0000002601)```{r roberts_2015_B1_PanelA, echo=TRUE, size=0.5}#| column: pageDealScan_Aeroflex <- DealScan_borrower %>% filter(Borrower_Id == 8532)DealScan_Aeroflex %>% select(names(dt.Deal_Amend_Refin), Deal_Input_Date, Tranche_Type, Deal_Purpose) %>% as_tibble() %>% filter(grepl(pattern = "Orig", x = Tranche_O_A, ignore.case = F)) %>% # keep only observations at origination arrange(Deal_Active_Date, Tranche_Active_Date, Tranche_Maturity_Date) %>% rename_with(~ str_replace(string = .x, pattern = "_", replacement = "\n")) %>% gt(id = 'table_id') %>% # cols_label(fn = ~ str_replace(string = ., pattern = "_", replacement = "\n") ) %>% tab_header(title = "Table 1. Panel A: Aeroflex Inc. Deal Originations") %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(10) ), locations = cells_body() )```This table is consistent with Table B1 Panel A in Roberts (2015):- The identifier `(LPC_Deal_ID, LPC_Tranche_ID)` maps to `(Package ID, Facility ID)`.- The identifier `Tranche_Type` maps to `Loan type`.- The date information - `Deal_Active_Date` maps to `Event date`.- `Tranche_Maturity_Date` maps to `Maturity date`.- `Tranche_Amount` maps to `Amount (millions)`.- `Tranche_O_A` maps to `Event`.<!-- Start the work: June 6, 2024 -->#### s3.3a Example from borrower (`Borrower_Id` = 8532) {#sec-s3.3a-example-from-borrower}The next step is to construct the life-cycle / loan path as in Table B1 Panel B.E.g. This deal (`LPC_Deal_ID` = 151556, `LPC_Tranche_ID` = 197238) can be found in [this filing](https://www.sec.gov/Archives/edgar/data/2601/000093221406000138/0000932214-06-000138.txt).- This [deal](https://www.sec.gov/Archives/edgar/data/2601/000093221406000138/0000932214-06-000138.txt) is originated at March 21, 2006.- [The amendment](https://www.sec.gov/edgar/search/?r=el#exhibit10-1.txt) is made at August 28, 2006. The amended document says that > ... WHEREAS, <mark>the Borrowers has requested an amendment to the Credit Agreement</mark>; and WHEREAS, the Lenders are willing to agree to such amendments, subject to the terms and conditions set forth herein; ... - This seems that if the borrower request an amendment, it can be approved by the syndicate. - This amendment happened in around 5 months after the loan origination. ::: {#imp-amend .callout-important} ## Who initiates the renegotiation process? I only observe the successful renegotiations and potentially can also identify who initiates this process. This may create selection bias in your analysis. Need to think about how will this issue create upward/downward bias in your results. ::: - The syndicte has four banks and the cost of renegotiation might be small? & What is usually the fees/expenses for renegotiations?::: {#tip-syndicate .callout-tip .column-margin}## How to detect the relationship lending?One tip to detect such lending relationship might be a scrap and search for the person and his/her title along the loan path and also for a single firm's loan pool.:::Different types of term loans:- Term loan (also Term Loan A): This layer of debt is typically amortized evenly over 5 to 7 years. Just like a mortgage.- Term loan B (also TLB): This layer of debt usually involves nominal amortization (repayment) over 5 to 8 years, with a large bullet payment in the last year. Term Loan B allows borrowers to defer repayment of a large portion of the loan, but is more costly to borrowers than Term Loan A. - TLB proceeds can be used in various ways, including for refinancing, acquisitions and general corporate use. - The first two types generally are secured loans. - Repayment can be made and is generally required at a premium to face value.- Term loan C (also TLC): TLC proceeds are used to fund cash collateral accounts that support letters of credit---a letter from a bank guaranteeing that a seller of goods or services will receive payment in full and on time, even if the buyer defaults. - TLC debt, however, may only be used to provide collateral for letters of credit. - Since TLCs are specifically raised to provide cash collateral, which must be available in an account to support letters of credit, they also do not amortize. - TLB is senior than TLC debt. - The idea is to use long-term debt to hedge the short-term liquidity/cash needs. TLC plays such a role for this specific purpose. It is a risky debt; however, very strict covenants and purposes are imposed to mitigate risk-shifting by the manager. - [A nice article about TLC debt](https://debtexplorer.whitecase.com/leveraged-finance-commentary/term-loan-c-in-the-spotlight).- Revolver/Line: Revolving Credit Facility, which is basically a credit card for the borrower. There are two costs associated with revolving lines of credit: (1) the interest rate charged on the revolver's drawn balance, and (2) an undrawn commitment fee.#### s3.3b Q: What happens to the loan path? {#sec-q-what-happens-to-the-loan-path}```{r roberts_2015_B1_PanelB, echo=TRUE}#| column: pageDealScan_Aeroflex %>% select(names(dt.Deal_Amend_Refin), Deal_Input_Date, Tranche_Type, Deal_Purpose) %>% as_tibble() %>% mutate(Tranche_O_A_round = replace_na(as.numeric(str_extract(string = Tranche_O_A, pattern = "\\d+$")) , replace = 0 ), LPC_Deal_ID = paste("Deal: ", LPC_Deal_ID, sep = "") ) %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% arrange(Deal_Active_Date) %>% # check whether there exists tranche amendment in the dataset mutate(Amend_Flag_check = max(Tranche_O_A_round) > 0) %>% ungroup() %>% rename_with(~ str_replace(string = .x, pattern = "_", replacement = "\n")) %>% gt(id = 'table_id', groupname_col = "LPC\nDeal_ID") %>% # cols_label(fn = ~ str_replace(string = ., pattern = "_", replacement = "\n") ) %>% tab_header(title = "Table 1. Panel B: Aeroflex Inc. Deal-Tranche Level Loan Path") %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(10)), locations = cells_body() ) %>% tab_style( style = cell_text(style = "italic", color = 'red'), locations = cells_body( columns = "LPC\nTranche_ID", rows = `Amend\nFlag_check` > 0 ) ) %>% cols_hide(columns = c("Tranche\nO_A_round", "Amend\nFlag_check") ) # hide columns ```Consistent with Roberts (2015), most of deal-tranche observations in DealScan are not consistent with their SEC filings. In other words, the loan path in the DealScan data is rather incomplete. For instance, the tranche (`LPC_Deal_ID` = 128721, `LPC_Tranche_ID` = 224767) only appears once in DealScan and is classified as an "Origination" + "Refinancing" deal. However, the SEC filings from Table B1 Panel B in Roberts (2015) shows a total 8 observations along the loan path. The observation recorded in DealScan is not an origination and is classified as an "Amended/Restate" event in Roberts dataset. Therefore, the renegotiation frequency is significantly different from the actual ones and the full dataset may not be granular enough.Another way to better identify the connection between different deals, and tranches in particular, is to look into variable `Deal_Remark`. Some examples below:```{r roberts_2015_B1_PanelB2, echo=TRUE}#| column: screen-insetDealScan_Aeroflex %>% select(names(dt.Deal_Amend_Refin), Deal_Input_Date, Tranche_Type, Deal_Purpose, grep(pattern = "Remark", x = names(.), value = T) ) %>% as_tibble() %>% mutate(Tranche_O_A_round = replace_na(as.numeric(str_extract(string = Tranche_O_A, pattern = "\\d+$")) , replace = 0 ), LPC_Deal_ID = paste("Deal: ", LPC_Deal_ID, sep = "") ) %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% arrange(Deal_Active_Date) %>% # check whether there exists tranche amendment in the dataset mutate(Amend_Flag_check = max(Tranche_O_A_round) > 0) %>% ungroup() %>% filter(LPC_Deal_ID == "Deal: 128721") %>% rename_with(~ str_replace(string = .x, pattern = "_", replacement = "\n")) %>% gt(id = 'table_id', groupname_col = "LPC\nDeal_ID") %>% # cols_label(fn = ~ str_replace(string = ., pattern = "_", replacement = "\n") ) %>% tab_header(title = "Table 1. Panel C: Aeroflex Inc. Deal-Tranche Level Loan Path", subtitle = "w/ additional information in remarks" ) %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(10)), locations = cells_body() ) %>% tab_style( style = cell_text(style = "italic", color = 'red'), locations = cells_body( columns = "LPC\nTranche_ID", rows = `Amend\nFlag_check` > 0 ) ) %>% cols_width(ends_with("Remark") ~ px(800)) %>% cols_hide(columns = c("Tranche\nO_A_round", "Amend\nFlag_check") ) # hide columns ```You can see the ample information covered in the `Deal_Remark` and `Tranche_Remark` section.To connect to loan contracts preceding these ones, I recovered the loans originated under the same entity but under a different name. These are loans from ARX Inc. (`Borrower_Id = 31224`):```{r roberts_2015_B1_PanelB3, echo=TRUE}#| column: screen-insetDealScan_borrower %>% filter(Borrower_Id == 31224) %>% ## now is the DealScan_ARX select(names(dt.Deal_Amend_Refin), Deal_Input_Date, Tranche_Type, Deal_Purpose, grep(pattern = "Remark", x = names(.), value = T) ) %>% as_tibble() %>% mutate(Tranche_O_A_round = replace_na(as.numeric(str_extract(string = Tranche_O_A, pattern = "\\d+$")) , replace = 0 ), LPC_Deal_ID = paste("Deal: ", LPC_Deal_ID, sep = "") ) %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% arrange(Deal_Active_Date) %>% # check whether there exists tranche amendment in the dataset mutate(Amend_Flag_check = max(Tranche_O_A_round) > 0) %>% ungroup() %>% rename_with(~ str_replace(string = .x, pattern = "_", replacement = "\n")) %>% gt(id = 'table_id', groupname_col = "LPC\nDeal_ID") %>% # cols_label(fn = ~ str_replace(string = ., pattern = "_", replacement = "\n") ) %>% tab_header(title = "Table 1. Panel D: ARX Inc. Deal-Tranche Level Loan Path") %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(10)), locations = cells_body() ) %>% tab_style( style = cell_text(style = "italic", color = 'red'), locations = cells_body( columns = "LPC\nTranche_ID", rows = `Amend\nFlag_check` > 0 ) ) %>% cols_width(ends_with("Remark") ~ px(800)) %>% cols_hide(columns = c("Tranche\nO_A_round", "Amend\nFlag_check") ) # hide columns ```Although this is far from perfect in recording the life-cycle of the loan, it is not as sparse as I thought previously. Also, the frequency of renegotiation needs to be recalculated, with around 25% of the "Origination"s to be reclassified as "Amend/Restate".::: {#tip-loan-path .callout-tip .column-margin}## The correct way to recover loan path for a unique firm!A thorough look into the DealScan dataset shows that the issue of incomplete loan path presented in Roberts (2015) may not be as severe as what he suggested. The huge amount of missing observations comes from the ignoring that the company has a different name, and so a different `Borrower_Id`, in the dataset. The Aeroflex Inc. is previously known as ARX Inc. (`gvkey` = 1056). <br><br>We can recover past observations from `Borrower_Id = 31224` (rather than `8532`). However, in order to recover the exact loan path and connects the evolution of each tranche under the same deal, we need to use variable `Deal_Remark` and extract textual information and match previous deals. <br><br>In addition, all observations after 2010 are under the name [AEROFLEX HOLDING CORP.](https://www.sec.gov/edgar/search/#/dateRange=custom&category=custom&ciks=0001487990&entityName=AEROFLEX%2520HOLDING%2520CORP.%2520(CIK%25200001487990)&startdt=2008-06-01&enddt=2024-06-19&forms=8-K) and you can access their 8-K filings. :::#### s3.3c Will this affect my project? {#sec-s3.3c-will-this-affect-my-project}However, this should not be an issue for my project.1. First, my focus is on the firm-level observations and the dependent variable in the first step is whether a renegotiation happens.2. Second, to identify an amendment/restatement/refinancing, I should use the `Deal_Refinancing` rather than the `Origination` variable. While the majority (60%) of tranche observations classified as `Origination` has "No" for all other identifiers, around 25% of tranche observations in those has "Yes" for `Deal_Refinancing`. This is exactly the case we saw in the example above. [\> updated](#tip-loan-path)```{r identify_refinance, echo=TRUE, message=FALSE}# to identify different types of contracts which are defined as "Origination". DealScan_borrower %>% filter(grepl(pattern = "Orig", x = Tranche_O_A)) %>% # only keep tranches classified as "Origination" group_by(Deal_Amended, Tranche_Amended, Deal_Refinancing, Tranche_Refinancing) %>% summarise(n = n()) %>% # count the number of each types ungroup() %>% mutate(percentage = (n / sum(n))) %>% gt() %>% tab_header(title = "Table 2: WRDS DealScan Deal-Tranche Level Loan Events", subtitle = "Subgroup: `Tranche_O_A` = Origination" ) %>% tab_options(table.font.size = 11, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(11)), locations = cells_body() ) %>% fmt_percent(columns = percentage, decimals = 2)# to identify different types of contracts which are defined as "Amendment 1". DealScan_borrower %>% filter(grepl(pattern = "Amendment", x = Tranche_O_A)) %>% # only keep tranches classified as "Origination" group_by(Deal_Amended, Tranche_Amended, Deal_Refinancing, Tranche_Refinancing) %>% summarise(n = n()) %>% # count the number of each types ungroup() %>% mutate(percentage = (n / sum(n))) %>% gt() %>% tab_header(title = "Table 2b: WRDS DealScan Deal-Tranche Level Loan Events", subtitle = "Subgroup: `Tranche_O_A` = Amendment(s)" ) %>% tab_options(table.font.size = 11, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(11)), locations = cells_body() ) %>% fmt_percent(columns = percentage, decimals = 2)```3. Third, I won't expect that renegotiations happen extremely frequency, not at each month. Thus, if some terms are changed, e.g. spreads and deal/tranche amounts, I can validate these changes from the balance sheet.```{r roberts_2015_B1_flowchat, echo=TRUE}dt.DealScan_Aeroflex <- DealScan_Aeroflex %>% select(names(dt.Deal_Amend_Refin), Deal_Input_Date, Tranche_Type, Deal_Purpose) %>% as_tibble() %>% mutate(Tranche_O_A_round = replace_na(as.numeric(str_extract(string = Tranche_O_A, pattern = "\\d+$")) , replace = 0 ), LPC_Deal_ID = paste("Deal: ", LPC_Deal_ID, sep = "") ) %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% arrange(Deal_Active_Date) %>% # check whether there exists tranche amendment in the dataset mutate(Amend_Flag_check = max(Tranche_O_A_round) > 0) %>% ungroup() %>% select(LPC_Deal_ID, LPC_Tranche_ID, Deal_Refinancing, Tranche_Amount, Tranche_Active_Date, Tranche_Type) ggplot(dt.DealScan_Aeroflex, aes(x = Tranche_Active_Date)) + geom_bar(aes(fill = LPC_Deal_ID)) DiagrammeR::grViz("digraph { graph [layout = dot, rankdir = TB] node [shape = rectangle] rec1 [label = 'Deal: 128721'] rec2 [label = 'Deal: 143473'] rec3 [label = 'Deal: 42818'] rec4 [label = 'Deal: 151556'] # edge definitions with the node IDs rec1 -> rec2 -> rec3 -> rec4 }", height = 300)```#### A List for the following tasks: June 7, 2024 {#sec-to-do-list}- [ ] Use `Deal_Remark` to extract information about `Event` and `Network` information. The variable `Network` will be defined as the loan deal preceding the current one. These information can be extracted from <mark>Table 1. Panel D</mark>.- [ ][Re-generate the loan paths for each firm]{style="color: red;"}.------------------------------------------------------------------------### s3.4 Classify variable names {#sec-s3.4-classify-variable-names}```{r variable_names2, echo=FALSE}#| column: marginLPC_def <- read.csv("LPC_variable_def.csv", header = F) %>% mutate(header_id = cumsum(nchar(V2) == 0) * (nchar(V1) > 0), header_true = (nchar(V1) > 0) & (nchar(V2) == 0) )cat("Here maps the group header id to names:")gt( LPC_def %>% # the list of variables under each class. filter(header_true == T) %>% select(header = V1, header_id) ) %>% tab_header(title = "Variable Name Groups") %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(11)), locations = cells_body() )```This section <!---follows [section 3.2](#sec-s3.2-amendaments-and-refinancing) and---> aims to classify different variables into groups. This is used to prepare the subsequent analyses regarding covenants and terms in the contract.```{r variable_names, echo=TRUE, results='asis'}# LPC_def %>% head(30) %>% View()LPC_def_class <- LPC_def %>% # the list of variables under each class. filter(header_true == T) %>% select(header = V1, header_id) %>% left_join(LPC_def, by = "header_id") %>% select(header, header_id, variable = V1) %>% filter(header != variable) %>% mutate(variable = clean_strings(variable, remove_char = "&|$") %>% # remove the "and" words in the variable. str_replace(pattern = "sr", replacement = "senior"), # replace the word 'sr' to 'senior'. unique_key_2 = 1:nrow(.) ) all_names <- as.data.table(str_replace_all(names(DealScan_borrower), pattern = "_", replacement = " ") %>% clean_strings() %>% str_replace(pattern = "sr", replacement = "senior")) all_names$unique_key_1 <- 1:length(names(DealScan_borrower))## fuzzy matching for the non-matching items with constrained bars. fuzzy_result <- merge_plus(data1 = all_names, data2 = LPC_def_class, by.x = "V1", by.y = "variable", match_type = "fuzzy", fuzzy_settings = build_fuzzy_settings(maxDist = .1, nthread = 20), unique_key_1 = "unique_key_1", unique_key_2 = "unique_key_2")cat("Results from fuzzy matching the names from LPC DealScan and WRDS DealScan: \n")# fuzzy_result$match_evaluation# fuzzy_result$matches# fuzzy_result$matches %>% arrange(unique_key_1) %>% filter(grepl(pattern = "percentage", ignore.case = T, x = V1))# fuzzy_result$data1_nomatch# fuzzy_result$data2_nomatch # %>% filter(grepl(pattern = "deal", ignore.case = T, x = variable))## fuzzy matching for the non-matching items with relaxed bars. fuzzy_result2 <- merge_plus(data1 = fuzzy_result$data1_nomatch, data2 = fuzzy_result$data2_nomatch, by.x = "V1", by.y = "variable", match_type = "fuzzy", fuzzy_settings = build_fuzzy_settings(maxDist = .25, nthread = 20), unique_key_1 = "unique_key_1", unique_key_2 = "unique_key_2")# fuzzy_result2$matches# fuzzy_result2$data1_nomatch# fuzzy_result2$data2_nomatch %>% filter(header != "Lender ")## hand match the remaining ones: manual_results <- fuzzy_result2$data1_nomatch %>% mutate(header = c(rep("ID",3), "Spread/Fee"), header_id = c(rep(0, 3), 14) )## merge into one file > variable name ~ header class: dt.name_match <- rbind.data.frame( select(fuzzy_result$matches, unique_key_1, V1, header, header_id), select(fuzzy_result2$matches, unique_key_1, V1, header, header_id), select(manual_results, unique_key_1, V1, header, header_id)) %>% arrange(unique_key_1) %>% left_join(y = data.frame(orig_name = names(DealScan_borrower), unique_key_1 = 1:length(names(DealScan_borrower))), by = "unique_key_1") %>% mutate(group_header = paste(header_id, header, sep = ": ")) %>% select(unique_key_1, orig_name, group_header) dt.name_match %>% group_by(group_header) %>% summarise(Variables = paste(orig_name, collapse = ", "), Num_Vars = length(orig_name) # number of variables in the group ) %>% ungroup() %>% arrange(str_extract(group_header, pattern = "\\d+") %>% as.numeric()) %>% gt() %>% # tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(13)), locations = cells_body() ) %>% cols_width(ends_with("Variables") ~ px(1000)) save(dt.name_match, file = "DealScan_name_match.RData")```All variables containing `ID` are classified into the `"ID"` group.The majority of the covenants are in group `17:Financial` and it records the changes in the financial covenants. The group `19: General` also includes many restrictions on loan repayment policy.```{r variable_names3, echo=TRUE}#| column: screen-insetname_covenants_17 <- dt.name_match %>% filter(grepl(pattern = "17", x = group_header)) %>% select(unique_key_1) %>% unlist()name_covenants_19 <- dt.name_match %>% filter(grepl(pattern = "19", x = group_header)) %>% select(unique_key_1) %>% unlist()as_tibble(DealScan_borrower) %>% select(names(DealScan_borrower)[c(grep(pattern = "LPC|_O_A", x = names(DealScan_borrower), value = F), grep(pattern = "Amended|Refinan", x = names(DealScan_borrower), value = F), name_covenants_17, name_covenants_19)]) %>% filter(nchar(Covenant_Comment) > 0) %>% head(30) %>% gt() %>% tab_header(title = "Sample Preview for Financial Covenants") %>% tab_options(table.font.size = 13, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(12)), locations = cells_body() ) %>% tab_style( style = list( cell_fill(color = "#F9E3D6"), cell_text(style = "normal", align = "center") ), locations = cells_body( columns = starts_with("LPC_") ) ) %>% tab_style( style = list( cell_fill(color = "lightcyan"), cell_text(style = "normal", align = "center") ), locations = cells_body( columns = starts_with(c("Tranche", "Deal", "Amend")) ) ) %>% tab_style( style = list( cell_fill(color = "lightyellow"), cell_text(style = "normal", align = "center", color = "red") ), locations = cells_body( columns = contains(c("Coven")) ) ) %>% as_raw_html() %>% htmltools::HTML() %>% htmltools::div(style = "height: 1000px; overflow-y: auto;") %>% htmltools::browsable() ```Some remarks:1. The variable `Covenants` is a flag indicator for whether financial covenants are included in the contract.2. Relating to [Section s3.2](#sec-s3.2-amendaments-and-refinancing)/[s3.3c](#sec-s3.3c-will-this-affect-my-project), a renegotiation can be identified as having either `Tranche_O_A` $\not=$ `Origination` OR `Deal_Refinancing = Yes`. 3. [6-K]{style="color: red;"} rather than 8-K filing is an SEC filing submitted to the U.S. Securities and Exchange Commission used by certain foreign private issuers to provide information that is: Required to be made public in the country of its domicile. Filed with and made public by a foreign stock exchange on which its securities are traded. 4. Use `LPC_Tranche_ID = 215589` as an example: its 6-K filing can be found [here](https://www.sec.gov/Archives/edgar/data/1332639/000119312507121517/dex1.htm). - an interesting point is that at the start of the document, it states "... AS AMENDED AND RESTATED ...". Thus, this loan is renegotiated. - item 5 "REPAYMENT" and sub-item 5.1: repayment and the conditions for rolling over the loan. - item 6 "PREPAYMENT AND CANCELLATION": voluntary pre-payment is allowed. - sub-item 17.8 "Testing of Financial Covenants": specify the testing frequencies of each covenant. ### s3.5 Covenants Preview {#sec-s3.5-covenants-preview}Look into the type of covenants and still use the Aeroflex Inc. as the example. I can also compare to the information presented in Roberts (2015) to cross-validate.```{r covenants, echo=T}#| column: screen-inset #| layout-nrow: 1 # DealScan_Aeroflex %>% names()DealScan_Aeroflex %>% select(names(dt.Deal_Amend_Refin), Deal_Input_Date, Tranche_Type, Deal_Purpose, Phase, grep(pattern = "Remark", x = names(.), value = T)) %>% as_tibble() %>% mutate(Tranche_O_A_round = replace_na(as.numeric(str_extract(string = Tranche_O_A, pattern = "\\d+$")) , replace = 0 ), LPC_Deal_ID = paste("Deal: ", LPC_Deal_ID, sep = "") ) %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% arrange(Deal_Active_Date) %>% # check whether there exists tranche amendment in the dataset mutate(Amend_Flag_check = max(Tranche_O_A_round) > 0) %>% ungroup() %>% rename_with(~ str_replace(string = .x, pattern = "_", replacement = "\n")) %>% gt(id = 'table_id', groupname_col = "LPC\nDeal_ID") %>% # cols_label(fn = ~ str_replace(string = ., pattern = "_", replacement = "\n") ) %>% tab_header(title = "Table 2. Panel B: Aeroflex Inc. Deal-Tranche Level Loan Path") %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(10)), locations = cells_body() ) %>% tab_style( style = cell_text(style = "italic", color = 'red'), locations = cells_body( columns = "LPC\nTranche_ID", rows = `Amend\nFlag_check` > 0 ) ) %>% tab_style( style = cell_text(color = "red"), locations = cells_column_labels( columns = contains("Remark") ) ) %>% cols_width(ends_with("Remark") ~ px(300)) %>% cols_hide(columns = c("Tranche\nO_A_round", "Amend\nFlag_check") ) %>% # hide columns as_raw_html() %>% htmltools::HTML() %>% htmltools::div(style = "height: 1000px; overflow-y: auto;") %>% htmltools::browsable() DealScan_Aeroflex %>% select(grep(pattern = "LPC_", x = names(.)), grep(pattern = "Amended|Refin", x = names(.)), grep(pattern = "O_A", x = names(.)), Deal_Amount, Tranche_Amount, Deal_Active_Date, Tranche_Active_Date, names(.)[name_covenants_17] # covenants-related names ) %>% as_tibble() %>% mutate(Tranche_O_A_round = replace_na(as.numeric(str_extract(string = Tranche_O_A, pattern = "\\d+$")) , replace = 0 ), LPC_Deal_ID = paste("Deal: ", LPC_Deal_ID, sep = "") ) %>% group_by(LPC_Deal_ID, LPC_Tranche_ID) %>% arrange(Deal_Active_Date) %>% # check whether there exists tranche amendment in the dataset mutate(Amend_Flag_check = max(Tranche_O_A_round) > 0) %>% ungroup() %>% rename_with(~ str_replace(string = .x, pattern = "_", replacement = "\n")) %>% gt(id = 'table_id', groupname_col = "LPC\nDeal_ID") %>% # cols_label(fn = ~ str_replace(string = ., pattern = "_", replacement = "\n") ) %>% tab_header(title = "Table 2. Panel B: Aeroflex Inc. Covenants - Financial and General") %>% tab_options(table.font.size = 10, heading.align = 'left' ) %>% tab_style( # update the font size for table cells. style = cell_text(size = px(10)), locations = cells_body() ) %>% tab_style( style = cell_text(style = "italic", color = 'red'), locations = cells_body( columns = "LPC\nTranche_ID", rows = `Amend\nFlag_check` > 0 ) ) %>% cols_hide(columns = c("Tranche\nO_A_round", "Amend\nFlag_check") ) %>% # hide columns tab_style( style = list( cell_fill(color = "lightyellow"), cell_text(style = "normal", align = "center", color = "red") ), locations = cells_body( columns = contains(c("Coven")) ) ) %>% tab_style( style = cell_text(color = "red"), locations = cells_column_labels( columns = contains("Coven") ) ) %>% as_raw_html() %>% # code for "vertical scroller" htmltools::HTML() %>% htmltools::div(style = "height: 1000px; overflow-y: auto;") %>% htmltools::browsable() ```Some related questions:- [ ] What is variable `Phase`? These includes `r paste(x = unique(DealScan_borrower$Phase), collapse = ", ")`.### Definitions## S4. Future Notes {#sec-s4.-future-notes} The next step is to follow the procedure in Roberts (2015) to first identify whether the contract terms are changed. In particular, I need to identify whether covenants are changed and what type of covenants is updated, which the changing direction. Then, summarize the changing frequencies and get summary statistics. The most important one is Table 5. ## Reference {#sec-reference}- Roberts, M.R., 2015. The role of dynamic renegotiation and asymmetric information in financial contracting. Journal of Financial Economics 116, 61--81. [https://doi.org/10.1016/j.jfineco.2014.11.013](https://doi.org/10.1016/j.jfineco.2014.11.013)- [HTML Themes](https://quarto.org/docs/output-formats/html-themes.html#dark-mode) - [Callout Blocks](https://quarto.org/docs/authoring/callouts.html)\> e.g. [block](#imp-amend) - [Layout](https://quarto.org/docs/authoring/article-layout.html)- `gt()`: [Cell Style](https://gt.albert-rapp.de/styling#sec-theming)- `DiagrammeR`: [Network and Flowchat](https://rich-iannone.github.io/DiagrammeR/)- `downloadthis`[package](https://cran.r-project.org/web/packages/downloadthis/readme/README.html) to create a downloadable link for generated R data. ## To-do list:- [June 7, 2024](#sec-to-do-list)<!-- ## Notes --><!-- color: <span style="color: red;"> text </span> // {style="color: red;"} --><!-- ## Quarto --><!-- Quarto enables you to weave together content and executable code into a finished document. To learn more about Quarto see <https://quarto.org>. --><!-- ## Running Code --><!-- When you click the **Render** button a document will be generated that includes both content and the output of embedded code. You can embed code like this: --><!-- ```{r} --><!-- 1 + 1 --><!-- ``` --><!-- You can add options to executable code like this --><!-- ```{r} --><!-- #| echo: false --><!-- 2 * 2 --><!-- ``` --><!-- The `echo: false` option disables the printing of code (only output is displayed). --><!-- -------- --><!-- ### s3.6 Leverage Covenants {#sec-s3.6-leverage-covenants} --><!-- Look into the changes in covenants related to the leverage restrictions and cash flow related restrictions (e.g. ICR: interest rate coverage ratio). --><!-- ### s3.7 Spreads and Fees {#sec-s3.7-spreads-and-fees} --><!-- Look into the changes in spread and fees. -->