Announcement

Collapse
No announcement yet.
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Issues with Infinite Loop in Calculating Complex Ownership Structures (Pyramids, Cross-Holding, Circular, Dual Cross-Holding)

    Hello,
    I am a PhD student working on a project that involves identifying ownership structure patterns, which I will subsequently use to calculate cash flow rights and control rights. I am particularly following the methodology outlined in the paper

    Aslan, H., & Kumar, P. (2012). Strategic ownership structure and the cost of debt. The Review of Financial Studies, 25(7), 2257-2299.

    On page 15 of this paper, the authors categorize ownership structures into four distinct types: Pyramids, Cross-Holding, Circular, and Dual Cross-Holding. These classifications are precisely what I need for my research. Please refer to the accompanying image or the main text for further details.

    Click image for larger version

Name:	Ownership.PNG
Views:	1
Size:	226.7 KB
ID:	1757920


    I have a dataset that I'm working with, and I would like to share a few rows for your reference. Please let me know if these sample rows are sufficient or if you need additional data.
    I am using the dataset from the following paper, which is available on their website:
    Schwartz-Ziv, Miriam, and Ekaterina Volkova. "Is blockholder diversity detrimental?." Management Science (2024).

    Code:
    * Example generated by -dataex-. For more info, type help dataex
    clear
    input long blockholder_cik str149 blockholder_name long company_cik str110 company_name int year float position
       9015 "BABSON DAVID L & CO INC"                     20 "K TRON INTERNATIONAL INC" 1997 10.69
       9015 "BABSON DAVID L & CO INC"                     20 "K TRON INTERNATIONAL INC" 1998 10.69
       9015 "BABSON DAVID L & CO INC"                     20 "K TRON INTERNATIONAL INC" 1999 11.29
       9015 "BABSON DAVID L & CO INC"                     20 "K TRON INTERNATIONAL INC" 2000   4.9
      50341 "FLEETBOSTON FINANCIAL CORP"                  20 "K TRON INTERNATIONAL INC" 2000   5.8
      50341 "FLEETBOSTON FINANCIAL CORP"                  20 "K TRON INTERNATIONAL INC" 2001  6.03
      50341 "FLEETBOSTON FINANCIAL CORP"                  20 "K TRON INTERNATIONAL INC" 2002  5.97
      50341 "FLEETBOSTON FINANCIAL CORP"                  20 "K TRON INTERNATIONAL INC" 2003  6.06
      70858 "BANK OF AMERICA CORP /DE/"                   20 "K TRON INTERNATIONAL INC" 2004     5
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 1995   6.4
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 1996   7.9
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 1997   7.8
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 1998   8.2
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 1999   9.1
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2000  10.5
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2001  10.5
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2002  10.5
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2003  10.5
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2004  10.4
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2005   9.9
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2006   9.9
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2007   9.4
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2008   9.4
      80255 "PRICE T ROWE ASSOCIATES INC /MD/"            20 "K TRON INTERNATIONAL INC" 2009     9
     354204 "DIMENSIONAL FUND ADVISORS INC"               20 "K TRON INTERNATIONAL INC" 1998  5.04
     354204 "DIMENSIONAL FUND ADVISORS INC"               20 "K TRON INTERNATIONAL INC" 1999  4.82
     354204 "DIMENSIONAL FUND ADVISORS INC"               20 "K TRON INTERNATIONAL INC" 2000  5.72
     354204 "DIMENSIONAL FUND ADVISORS INC"               20 "K TRON INTERNATIONAL INC" 2001  5.71
     354204 "DIMENSIONAL FUND ADVISORS INC"               20 "K TRON INTERNATIONAL INC" 2002     5
     354204 "DIMENSIONAL FUND ADVISORS INC"               20 "K TRON INTERNATIONAL INC" 2003     5
     888002 "AXA FINANCIAL INC"                           20 "K TRON INTERNATIONAL INC" 2007   5.2
     904571 "GOLDMAN SACHS GROUP LP"                      20 "K TRON INTERNATIONAL INC" 1998   7.8
     906304 "ROYCE & ASSOCIATES LLC"                      20 "K TRON INTERNATIONAL INC" 2007  4.84
     929372 "PARADIGM CAPITAL MANAGEMENT INC /NY/ /ADV"   20 "K TRON INTERNATIONAL INC" 1998   5.7
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 1999   6.7
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 2000  11.4
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 2001  11.3
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 2002  11.4
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 2003  11.3
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 2004  7.73
     937394 "HEARTLAND ADVISORS INC"                      20 "K TRON INTERNATIONAL INC" 2005   5.7
     944808 "LIBERTY INVESTMENT MANAGEMENT INC/"          20 "K TRON INTERNATIONAL INC" 1997  6.15
    1037792 "PARADIGM CAPITAL MANAGEMENT INC/NY"          20 "K TRON INTERNATIONAL INC" 2001   9.7
    1037792 "PARADIGM CAPITAL MANAGEMENT INC/NY"          20 "K TRON INTERNATIONAL INC" 2002     8
    1037792 "PARADIGM CAPITAL MANAGEMENT INC/NY"          20 "K TRON INTERNATIONAL INC" 2003   7.2
    1037792 "PARADIGM CAPITAL MANAGEMENT INC/NY"          20 "K TRON INTERNATIONAL INC" 2004   7.3
    1037792 "PARADIGM CAPITAL MANAGEMENT INC/NY"          20 "K TRON INTERNATIONAL INC" 2005   6.7
    1037792 "PARADIGM CAPITAL MANAGEMENT INC/NY"          20 "K TRON INTERNATIONAL INC" 2006     5
    1088084 "GOLDMAN SACHS ASSET MANAGEMENT/"             20 "K TRON INTERNATIONAL INC" 1999  10.5
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2001   7.5
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2002   8.8
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2003   9.5
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2004   9.5
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2005   9.4
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2006   9.4
    1105838 "ROBOTTI ROBERT"                              20 "K TRON INTERNATIONAL INC" 2007   7.8
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2001   9.3
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2002   9.3
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2003   9.3
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2004   9.5
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2005   9.5
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2006  11.1
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2007  11.1
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2008  11.1
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2009   8.9
    1145949 "CLOUES EDWARD B II"                          20 "K TRON INTERNATIONAL INC" 2010   7.5
    1328618 "Nichols James William"                       20 "K TRON INTERNATIONAL INC" 2005   6.2
    1620275 "Paradice Investment Management LLC"          63 "FNW BANCORP INC"          2020   5.3
      38777 "FRANKLIN RESOURCES INC"                    1750 "AAR CORP"                 2012   9.8
      38777 "FRANKLIN RESOURCES INC"                    1750 "AAR CORP"                 2013   9.3
      38777 "FRANKLIN RESOURCES INC"                    1750 "AAR CORP"                 2014   9.7
      38777 "FRANKLIN RESOURCES INC"                    1750 "AAR CORP"                 2015  10.3
      38777 "FRANKLIN RESOURCES INC"                    1750 "AAR CORP"                 2016  12.3
      38777 "FRANKLIN RESOURCES INC"                    1750 "AAR CORP"                 2017  10.9
      70858 "BANK OF AMERICA CORP /DE/"                 1750 "AAR CORP"                 2009   6.4
      70858 "BANK OF AMERICA CORP /DE/"                 1750 "AAR CORP"                 2010     5
      72971 "NORWEST CORP"                              1750 "AAR CORP"                 1994   6.7
      72971 "NORWEST CORP"                              1750 "AAR CORP"                 1995   8.7
      72971 "NORWEST CORP"                              1750 "AAR CORP"                 1996     5
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2011  5.04
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2012  5.75
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2013  5.93
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2014  6.23
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2015  7.06
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2016  8.06
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2017  8.85
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2018  9.58
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2019  9.96
     102909 "VANGUARD GROUP INC"                        1750 "AAR CORP"                 2020  9.45
     315066 "FMR CORP"                                  1750 "AAR CORP"                 2003 10.11
     315066 "FMR CORP"                                  1750 "AAR CORP"                 2004 10.11
     315066 "FMR CORP"                                  1750 "AAR CORP"                 2005  8.35
     315066 "FMR CORP"                                  1750 "AAR CORP"                 2006 10.85
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 1999  7.06
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 2000  7.56
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 2001  7.69
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 2002     5
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 2003   6.7
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 2004  8.25
     354204 "DIMENSIONAL FUND ADVISORS INC"             1750 "AAR CORP"                 2005  8.48
    end
    Listed 100 out of 518009 observations

    and I found the following Statalist posts very helpful:
    https://www.statalist.org/forums/for...s-observations
    https://www.statalist.org/forums/for...d-observations

    Based on these discussions, I tried using the following code to identify the ownership structures in my dataset:

    Code:
    clear all
    import delimited "C:\Users\Downloads\ownership.csv"
    * Create a temporary file for the data
    tempfile data
    save `data'
    * Generate list of largest owner by company
    bys company_name (position): gen level1 = blockholder_name[_N]
    * Tag ties
    bys company_name (position): gen tie = position[_N] == position[_N-1]
    * Data set of largest shareholders
    contract company_name level1
    drop _freq
    tempfile level1
    sort level1
    save `level1'
    clear
    use `data'
    merge m:1 company_name using `level1'
    drop if _merge == 2
    drop _merge
    sort level1
    save `data', replace
    * Initialize the iteration
    local continue = 1
    local iter = 1
    while `continue' {
        local next_iter = `iter' + 1
        
        * Identify next level of ownership
        use `level1'
        rename (*) (level`iter' level`next_iter')
        sort level`iter'
        save `level1', replace
        
        use `data'
        merge m:1 level`iter' using `level1'
        drop if _merge == 2
        drop _merge
        
        * Check if any new levels were added
        count if !missing(level`next_iter')
        local new_levels = r(N)
        
        * Save the updated data
        save `data', replace
        
        * Update iteration counter
        local iter = `next_iter'
        
        * Stop if no new levels were added
        if `new_levels' == 0 local continue = 0
    }
    * Generate the ultimate parent variable
    gen ultimate_parent = level`iter'
    * Replace missing ultimate parents with the highest known level
    forval i = `=`iter'-1'(-1)1 {
        replace ultimate_parent = level`i' if missing(ultimate_parent)
    }
    * Save the results
    save "calculated_cash_flow_control_rights_pyramidal.dta", replace


    However, my code is still running because it appears that each firm holds another, leading to an extensive and far-reaching chain of ultimate parents. I am concerned that I may be stuck in an infinite loop and not producing the desired results. I need to identify all four types of ownership structures: Pyramids, Cross-Holding, Circular, and Dual Cross-Holding. it would be appreciated if I can have an indicator (flag) for each so I can use afterwards whn computing cash flow rights and control rights!

    Can anyone please help me resolve this issue?


    these are the current results of the code:
    Code:
       Result                      Number of obs
        -----------------------------------------
        Not matched                       499,088
            from master                   464,200  (_merge==1)
            from using                     34,888  (_merge==2)
    
        Matched                            53,809  (_merge==3)
        -----------------------------------------
    (34,888 observations deleted)
      53,809
    file C:\Users\Thea\AppData\Local\Temp\ST_535c_000001.tmp saved as .dta format
    file C:\Users\Thea\AppData\Local\Temp\ST_535c_000002.tmp saved as .dta format
    
        Result                      Number of obs
        -----------------------------------------
        Not matched                       499,088
            from master                   464,200  (_merge==1)
            from using                     34,888  (_merge==2)
    
        Matched                            53,809  (_merge==3)
        -----------------------------------------
    (34,888 observations deleted)
      53,809
    file C:\Users\Thea\AppData\Local\Temp\ST_535c_000001.tmp saved as .dta format
    file C:\Users\Thea\AppData\Local\Temp\ST_535c_000002.tmp saved as .dta format
    I feel the code keeps repeating the output, but I'm not sure.



    Regards,
    Thea

  • #2
    It's good to see that you offered sample data, but understanding and using it would be much easier if we knew the meanings of your variable names and more about the conceptual sense of that data. In other words, the volume of your data example is likely sufficient, but the clarity of it is not. I'd have to look at the sources you cited to understand it better, but that's more effort than I and other people here are likely to be willing to offer. So, I'd say that some more explanation would be helpful.

    Also, it's generally difficult for people to look at a relatively large block of code for a complex problem, so if you could break your problem and code into pieces, that would likely help. I'm thinking that seeing separate codes for each of the kinds of firm to firm relationships you're interested in would make it easier for people to help you. I'd also encourage you to emphasis clarifying *what* you want, leaving it to potential helpers to suggest the *how.* In that regard, my impression is that a considerable description of your code would be needed for someone to try to fix it, and that effort would likely be better devoted to more description of the problem and the data.


    All that being said: You're likely inadvertently "reinventing the wheel" here. The kinds of linkages you're interested in fall squarely within the field of social network analysis ("SNA"), where there is extensive research and methodology on the kind of linkages you are trying describe and work with. There is a user-written SNA package for Stata called -nwcommands-, which is documented extensively at and available from https://nwcommands.wordpress.com/ To use that package, you'd have to learn something about SNA and its methods and terminology, but I think that kind of knowledge might be more generally useful to you. I'm not personally very knowledgeable about SNA or this package, I regret to say.

    Comment


    • #3
      Thank you for your feedback and suggestions. Here is a more detailed description of my data and the specific problem I am trying to solve: Here are the variables in my dataset:

      • blockholder_cik: The unique identifier for the blockholder (where the blockholder is the investor who holds shares in the company >=5%, could be individual, company, investment funds, etc.).
      • blockholder_name: The name of the blockholder.
      • company_cik: The unique identifier for the company.
      • company_name: The name of the company.
      • year: The year of the observation.
      • position: The percentage of ownership the blockholder has in the company.
      My goal is to identify and categorize the ownership structures into four types:

      1. Pyramids: in which Firm X owns shares of Firm Y ==> and Firm Y owns shares of Firm Z ==> etc., in a vertical way.
      2. Cross-Holding: in which Firm W owns shares of Firm X ==> Firm X owns shares of Firm Y ==> Firm Y owns shares of Firm Z ==> and Firm X also owns shares of Firm Z.
      3. Circular: in which Firm X owns shares of Firm Y ==> Firm Y owns shares of Firm Z ==> and Firm Z owns shares of Firm X.
      4. Dual-Class Holdings: in which there are different classes of shares, each with different voting rights and ownership percentages ==> Firm X owns 60% of Firm Y ==> Firm Y owns 30% of Firm Z, but due to the dual-class structure, this 30% ownership gives it 80% of the voting rights in Firm Z.==> might not be clear in the dataset provided!
      This classification will help in calculating cash flow rights and control rights.

      As for the network calculation, I used to use that in identifying the common link (managers, investors...)between the source and the target (both could be firms) using joinby, but in the dataset provided, where is the link? How is firm A linked to firm B if I can't find the four types of ownership previously identified? If anyone knows anything helpful, that would be useful!

      Regards,
      Thea

      Comment


      • #4
        I am guessing that you can reduce your data set to a list of pairs of entities characterized by being connected by a relation of ownership, that is, "id_owner" and "id_owned." If you can do that, representing your data set as a social network with so-called "directed" ties between entities should be possible. Analyzing that kind of data to find various types of linkages (including indirect links and chains such as you describe) is a common problem in SNA, and I would be willing to guess that -nwcommands- has built-in commands to do what you want. Within SNA, such ties are commonly treated as present/absent (0/1), but there also can be networks with real-valued ties, which might well work for your classes of shares.

        My apologies if you're already familiar with SNA and know that it's not applicable to your problem, but if that's not true, some cursory reading about it (e.g., even Wikipedia or the -nwcommands- website) might offer a relatively quick way to figure out if a network approach to your data might help. Again, I'm writing as someone with only casual interest in SNA and who has used -nwcommands- just a few times. So, if you can't get help from StataList, there is an online forum/user list for -nwcommands- with a link on the URL I gave you, and someone there might be able to solve your problem.

        Comment

        Working...
        X