Abstract¶
Derivations and code for graphs.
This notebook contains code to replicate and simulate different parameterizations of the model framework presented in our paper.
Abstract: We propose a framework for understanding how social investors’ who seek to maximize a combination of private and social returns from investments in a portfolio of new and established microfinance institutions. The model takes into account the endogeneity of loan contract terms and the capital structure of the financial institutions that may emerge to target groups of borrowers differentiated primarily by their levels of initial average net worth. We study how social investments might transform those patterns, and how social investors might target their limited resources to balance depth and breadth of outreach objectives. We build upon one of the workhorse models of modern corporate finance (Tirole, 2007) which features limited liability, multiple layers of moral hazard and costly monitoring to explain patterns of financial intermediation, and in our framework, the role and modes of social investment. We pinpoint the role of the subsidies and guarantees implicit in social investors’ equity and quasi-equity investments and the role they play in attracting private capital investors and sustaining productivity-enhancing financial intermediation that might otherwise not have taken place.
Introduction¶
... We tackle the logic and tensions inherent in social finance--the support, with philanthropic objectives, of nonprofits, social businesses like the Grameen Bank, and profit-maximizing businesses serving the poor. The principles behind the new world of philanthropy and social action have not been well-explored by economists. We develop a theory of “social finance” to parallel the modern theory of corporate finance...
Model Overview & Foundations¶
We extend the delegated financial intermediation frameworks of Holmstrom and Tirole (1997) and Conning (1999) to examine how an intermediary’s capital structure and monitoring intensity vary endogenously with the wealth profile of its target borrowers.
Our framework is built upon a standard credit-rationing model featuring borrower moral hazard and limited liability. This is the “workhorse” model of Tirole’s (2006) The Theory of Corporate Finance. Risk-neutral entrepreneurs require a lump-sum investment to undertake a project. Lacking liquid wealth, they must borrow the entire amount. To align incentives under moral hazard, an optimal contract must reward project success and penalize failure. Lenders will ration out any borrower whose pledgeable wealth falls below a threshold minimum collateral requirement, . A standalone interactive visualization of this basic credit-rationing model is available here.
To expand credit access, local intermediaries can engage in active monitoring to directly lower the borrower’s private benefit of shirking, thereby reducing the minimum collateral requirement. However, monitoring is costly and unobservable to outside investors. To align the intermediary’s own incentives, the optimal contract requires the MFI to hold sufficient “skin in the game” by investing its own scarce equity capital alongside outside uninformed lenders.
A Core Innovation: We assume that local monitoring capacity is neighborhood-specific, and that neighborhoods are segregated by their residents’ average wealth. This allows us to determine the endogenous optimal capital structure and monitoring intensity of different financial institutions based entirely on the asset profiles of the communities they serve.
The Players in the Economy¶
There are up to four types of active agents in the model:
Households (Entrepreneurs): Local residents who seek to borrow a lump-sum to fund a risky productive project.
Local Microfinance Intermediaries (MFIs): Informed intermediaries who originate and monitor loans. They invest their own equity capital and may leverage outside funds. They may be driven by commercial or social missions.
Uninformed Investors (Depositors): Outside commercial creditors who provide low-cost debt capital to the MFI but cannot monitor.
Social Investors: Altruistic actors who strategically deploy subsidies, guarantees, or soft equity to expand credit access and leverage private capital.
Empirical & Institutional Predictions¶
Each neighborhood is characterized by the average pledgeable assets of its households. Depending on this asset level , the model endogenously predicts four distinct credit regimes:
Excluded (Unbanked): Poorer households ( is very low) cannot attract any funding. Monitoring is too expensive relative to their pledgeable wealth.
Monitored, Non-Leveraged MFI: Households borrow from an MFI funded entirely by its own scarce equity capital (). Heavy monitoring is required, and no outside debt can be attracted.
Monitored, Leveraged MFI: Intermediary capital is leveraged with lower-cost outside debt (). The MFI retains a smaller, incentive-compatible equity stake per loan.
Unmonitored, Highly-Leveraged Bank: Wealthier households obtain cheap, unmonitored loans () backed entirely by their own collateral, maximizing outside commercial leverage.
By closing the model, we can endogenously predict the economy-wide equilibrium rates of return, bank capital structures, interest rates, and loan contract terms across the entire wealth distribution.
Model code¶
Many of the functions used to simulate and visualize the model below are written in a socialfinance python module in the src folder that we import here.
Source
import sys
import os
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import interact
# Path configuration to find local package
sys.path.append(os.path.abspath('..'))
# Autoreload settings useful while developing socialfinance.py library
%load_ext autoreload
%autoreload 2
# Matplotlib styling
plt.rcParams['figure.figsize'] = (7.5, 5.5)
plt.rcParams['text.usetex'] = False
# Import core classes
from socialfinance.socialfinance import Bank
We imagine a continuum of neighborhoods indexed by the level of pledgeable assets of its residents. We order these from low to high values.
An mfi or microfinance institution serves the neighborhood. Represented as a Bank object in the code.
Source
A = np.linspace(0, 150, 500)
mfi = Bank(A, beta = 1.2)
Intermediary fixed cost per borrower
Borrower Moral Hazard & The Agency Problem¶
Each risk-neutral household has access to a project requiring a lump-sum investment . If they are diligent (exerting effort and utilizing funds properly), the project succeeds with probability , yielding return , and fails with probability , yielding .
If the entrepreneur is non-diligent (shirking or diverting resources), they capture a private benefit , but the success probability falls to . Because the entrepreneur’s effort and private benefits are unobservable to the lender, a classic borrower moral hazard problem arises.
To align incentives, a loan contract must be outcome-contingent. The contract is designed to maximize the borrower’s expected return subject to the lender’s break-even (participation) constraint.
For now, all borrowers are homogenous which means that every household in the neighborhood will have the same loan demand. In a model extension we will allow for heterogeneity in borrower characteristics, which will make loan demand slope down with the cost of borrowing.
Active Monitoring & Delegated Governance¶
Lenders can mitigate this agency friction by acting as active monitors (e.g., a local MFI). By spending on monitoring and oversight (e.g., site visits, training, or audits), the MFI reduces the borrower’s private shirk benefit:
where represents the monitoring efficiency parameter.
However, monitoring is itself costly and unobservable. If the MFI leverages outside commercial funds to expand, a second layer of moral hazard emerges: outside investors must ensure that the MFI’s managers have sufficient “skin in the game” to monitor diligently.
We assume a linear monitoring cost here to keep the results tractable, though we could also model monitoring with a non-linear cost function (for example, initially falling and then rising marginal cost).
Neighborhoods & Capital Markets¶
There are segregated neighborhoods. To get started, assume residents in neighborhood hold identical pledgeable assets
Loan Demand: Each of the residents per neighborhood has access to the investment project requiring . Total potential loan demand is .
Funding & Intermediation: Local MFI monitoring capital is scarce. To expand, MFIs must leverage unlimited outside uninformed debt at a gross market cost of . We later analyze how scarce intermediary capital is allocated in equilibrium when aggregate demand exceeds supply.
Microfinance Lending Contracts¶
A diligent borrower-entrepreneur’s project generates a return with probability and a return with probability . A financial contract divides the project returns between returns to the monitoring intermediary , returns to the entrepreneur , and the uninformed lender gets what’s left or .
Baseline: Zero-Monitoring Loan ()¶
If a lender does not, or cannot, monitor then a feasible contract must satisfy two key constraints:
Borrower Incentive Compatibility (IC): To induce diligence, the success payout must exceed the failure payout :
Borrower Limited Liability (LL): The borrower cannot pledge to pay more than their pledgeable collateral :
Combining both binding constraints yields the borrower’s minimum expected economic rent:
Notice that entrepreneurs with lower levels of pledgeable assets must earn higher expected rents to maintain incentives and satisfy limited liability. Intuitively, since limited liability limits how much they can be punished for failure outcomes, the only way to maintain incentives is by offering rewards. This requires keeping the return to the entrepreneur high enough in the success states, to give them an incentive to remain diligent. But this is costly to the lender, since they can now not demand very much repayment in the success state or in the failure state.
The microfinance lender must be able to cover this rent and her opportunity cost of funds and fixed costs per loan .
Fixed costs: such as staff salaries, travel, and local setup expenses—are upfront operational costs that are entirely sunk and cannot be liquidated or recovered by depositors in the event of a default. We think of these as unrecoverable costs that must be financed out of own equity capital, whether the MFI is leveraged or not. Funding from scarce equity (at opportunity cost β) aligns with corporate finance reality and acts as a natural skin-in-the-game buffer, limiting the MFI’s maximum leverage to .
The lender is just able to break even and be willing to participate when:
Solving for the as a function of where this exactly holds gives us the minimum collateral requirement for an equity-only local MFI who has opportunity cost of funds but sets monitoring intensity to zero. We label this . The superscript refers to the fact that the MFI is lending exclusively from its own equity capital.
If a borrower has pledgeable assets in excess of this minimum collateral requirement then they’ll pledge and borrow at cost
Entrepreneurs with will have to turn to more expensive monitored loans which we will analyze next.
We will later contrast this to a leveraged MFI that can leverage outside capital at a lower rate . The intermediary may have to put some of their own capital at risk, but the end result is that they will be able to lend at a rate lower than but larger or equal to .
For our example, the minimum collateral requirement is A^e(0) = 144.0
This is an example of an `over-collateralized’ loan. The bank is asking for $140 security for a $100 loan. Many asset poor borrowers will not have this level of pledgeable assets. These people would be excluded from these loans but may have access to more expensive monitored loans as we analyze next.
We will next explore three strategies for reducing the minimium collateral requirement for loans: 1) by increasing the monitoring intensity my the MFI, 2) by using the MFI as an intermediary who is able to leverage lower cost funds from outside commercial investors; and 3) by introducing social investors who may provide subsidies to the MFI organization or their cost of funds.
Minimum collateral for a monitoring lender¶
A monitoring intermediary has the advantage of being able to monitor to directly lower the scope for moral hazard via but they charge a higher cost of funds because (a) they face a higher opportunity cost of funds and because (b) they must also be compensated for the cost of monitoring .
Monitoring lowers the private benefit from non-diligence:
but monitoring adds a cost that must now be paid for:
The expression below shows how monitoring intensity can lower the collateral requirement for a monitoring intermediary when they are the only lender:
Non-leveraged or Equity-only MFI
Note that as monitoring must be paid for out of available project surplus, which reduces what is left to the entrepreneur after making all necessary repayments. Competition in a competitive market will lead to contracts with the minimum required monitoring, to keep costs to the borrower down. That is they’ll choose a monitoring intensity that brings the monitoring minimum collateral requirement down to match the borrower’s available pledgeable assets and make the loan feasible:

Figure 1:Monitoring intensity lowers the minimum collateral requirement for a loan. Pledgeable asset determines lowest cost loan.
Leveraged MFI
If the local intermediary MFI can leverage outside capital it can potentially substitute cheaper outside financing for more expensive local intermediary (equity) financing.
An outside lender will however only participate in a financing structure if it can be sure the monitoring intermediary has enough ‘skin in the game’ to have incentives to carry out the unobservable monitoring on the loan at this minimum intensity required for expected repayments to cover the uninformed lender’s costs.
A contract allocates claims as to the entrepreneur, to the monitoring lender and to the uninformed lender where . The monitor’s incentive compatibility constraint requires that they earn more from being diligent in monitoring at expense than from not monitoring:
The lowest cost way to satisfy the monitor’s incentive constraint (to have it bind) implies leaving a monitoring rent of:
to the intermediary. This is analogous to the limited liability rent to the borrower.
Scarce Intermediary Capital
Suppose there is only on intermediary in the neighborhood. Then they will put nothing at risk () and earn an economic rent of
Now the
Competition for intermediary services
Assume instead now there is free entry into intermediation services. in the neighborhood. Intermediaries will now compete to lend to borrowers and leverage outside funds from uninformed lenders by putting up capital of their own. This is “skin in the game” but it also reduces the rent.
Competition will insure that the untermediary earns zero profits (alternatively, we could assume intermediaries have a social mission to reach as many entrepreneurs as possible, and earn zero profits). If the intermediary puts up of each loan and takes first losses then they stand to capture if the project fails and if the project succeeds. Competition drives intermediary profits down to zero. The expected returns from the contract (left hand side below) must cover the cost of monitoring plus the fixed cost per borrower:
$$p \cdot \frac{m}{p-q} \ge \beta I^m + m
We can use this to find the size of the stake (or skin in the game) the monitoring intermediary must have in the project in order to have incentive to monitor:
which is rising with the required amount of monitoring (to be determined).
The uninformed lender puts up , and the monitor/MFI funds the required incentive equity plus the fixed administrative cost out of equity (totaling ). The ‘poorest’ entrepreneur (i.e. the one with the lowest level of pledgeable assets A that can be reached) will be determined by the contract where what is left of expected project returns after paying the borrower the limited liability rent (required to make sure they choose the high probability of success project) is just enough to pay off both the uniformed and the informed lenders:
rearranging and using our earlier finding that we can solve for the minimum collateral requirement for the leveraged MFI:
If this collapses to the no-leverage minimum collateral requirement above. If , the premium paid for scarce intermediary capital adds to the cost.
Financing Fixed Costs and Borrower-Specific WACC¶
Fixed operational costs () typically enter as an unscaled constant. However, since MFI financing combines equity (cost ) and debt (cost ), we can define a borrower-specific Weighted Average Cost of Capital (WACC):
Applying this to the MFI’s total assets per loan () yields the total financing cost: . Since the required MFI equity stake is determined strictly by incentive compatibility, any marginal operational fixed cost is financed by debt. The total cost simplifies to . Thus, operational costs are priced at the cost of debt, .
Financing Nuances:
Tangible Fixed Assets (Debt-Financed): If fixed costs consist of tangible, recoverable assets (e.g., equipment or vehicles) that depositors can recover in default, they are financed at the debt rate , yielding in the formula. This preserves tractability in the simulations.
Sunk Operational Costs (Equity-Financed): If the MFI operates in a debt-starved environment or if fixed costs are sunk (e.g., staff training or local setup), they must be funded out of scarce equity. Here, the fixed cost carries the equity premium, scaling to , which restricts MFI entry.
Optimal (minimum required) monitoring¶
Monitoring is costly so only so much will be used as needed to lower the minimum collateral requirement to the entrepreneur’s pledgeable asset level >
The minimum collateral requirement above can be rewritten as a function where higher monitoring reduces the collateral requirement from the no-monitoring collateral level. Using the fact that we can write the minimum collateral requirement as a function of monitoring intensity as:
In this competitive setting the lender(s) earns zero profits. But the borrower will only participate if they can expect a positive return (borrower participation constraint). This determines the maximum feasible level of monitoring.
The two lines cross at \beta$) or at:
At zero monitoring it’s obviously cheaper to use uninformed capital which has lower cost rather than borrow from an local intermediary capital which has opportunity cost . Since the latter type of loans are more expensive, they’ll also be associated with higher minimum collateral requirements. Suppose , then:
mfi.print_params()Amax = 140, B0 = 30, F = 0, I = 100, K = 10000, X = 200
alpha = 0.5, beta = 1.2, f = 20, gamma = 1.0, p = 0.97, q = 0.82
mfi.beta = 1.2
print('Ame(0) = {:5.1f} Am(0) = {:5.1f} '.format(mfi.AMe(0), mfi.AM(0)))
Ame(0) = 144.0 Am(0) = 124.0
mfi.mmax()50.0(NOTE the following expression assume ) For any entrepreneur with pledgeable assets we can find optimal (minimum) amount of monitoring):
solve for to get:
mfi.plotIm()
mfi.AM(0), mfi.AM(0)(123.99999999999997, 123.99999999999997)mfi.beta = 1.2
mfi.plotDE(mfi.beta)

The borrower/entrepreneur’s expected return¶
Is what is left after all others have been paid.
If it is an equity only loan then the expected return is:
If it’s a leveraged loan then the expected return is:
MFI Outreach and Borrower Returns across the Asset Distribution¶
To understand how borrower wealth affects credit access and MFI scale, we look at the MFI’s capacity to serve a neighborhood of identical borrowers with asset level .
Very importantly: we wassume a fixed amount of equity capital in each neighborhood. In a later notebook we will allow to move and vary by neighborhood.
Neighborhood Capital & Leverage Assumptions¶
For any given neighborhood where residents have identical pledgeable assets :
The MFI Capacity/Outreach (): We assume the MFI has a fixed pool of startup/intermediary equity capital (with setup costs here).
Leverage and Monitoring Equity ():
Unmonitored Region (): Borrowers are wealthy enough that they need no monitoring. They get funded directly by commercial lenders; the MFI plays no role.
Leveraged Region (): Borrowers need some monitoring, but can attract outside debt. The MFI must put up a monitoring equity stake per loan to be incentive-compatible. By leveraging outside funds, the MFI can reach a larger number of borrowers: . As decreases, the needed monitoring increases, requiring more MFI equity per loan, which compresses MFI leverage and reduces .
Equity-Only Region (): Borrowers need heavy monitoring. No outside investor will fund them, so the MFI must fund them using 100% equity (). The MFI’s reach is capped at its raw equity capacity: loans.
Source
# Initialize the MFI's capacity parameter
mfi.K = 10000.0 # MFI startup capital parameter
# Calculate borrower capacity outreach N(A) and net returns
nr = mfi.nreach(A)
br = mfi.breturn(A)
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8.5, 9.5))
# Plot 1: Outreach Capacity
ax1.plot(A, nr, color='teal', linewidth=3, label='Outreach Capacity $N(A)$')
ax1.axvline(x=mfi.Amin(), linestyle=':', color='grey', label='Excluded threshold')
ax1.axvline(x=mfi.Across(), linestyle=':', color='blue', label='Leverage threshold')
ax1.axvline(x=mfi.AM(0), linestyle=':', color='green', label='Direct banking threshold')
ax1.set_title("MFI Outreach Capacity by Borrower Asset Level", fontsize=11, weight='bold')
ax1.set_xlabel("Borrower pledgeable assets $A$", fontsize=9)
ax1.set_ylabel("Number of loans funded ($N$)", fontsize=9)
ax1.set_xlim(0, 140)
ax1.set_ylim(0, 350)
ax1.legend(fontsize=9)
# Plot 2: Borrower returns
ax2.plot(A, br, color='orange', linewidth=3, label='Borrower net return')
ax2.axvline(x=mfi.Amin(), linestyle=':', color='grey')
ax2.axvline(x=mfi.Across(), linestyle=':', color='blue')
ax2.axvline(x=mfi.AM(0), linestyle=':', color='green')
ax2.set_title("Borrower Returns by Asset Level", fontsize=11, weight='bold')
ax2.set_xlabel("Borrower pledgeable assets $A$", fontsize=9)
ax2.set_ylabel("Expected Net Surplus", fontsize=9)
ax2.set_xlim(0, 140)
ax2.set_ylim(0, 120)
ax2.legend(fontsize=9)
plt.tight_layout()
plt.savefig('figs/fig-credit-landscape.png', dpi=300)
plt.show()
The effect of subsidizing fixed costs¶
There are four groups distinguished by the type of borrowing they can access:
| Group | Definition |
|---|---|
| 1 | no access to lending |
| 2 | equity-only MFI |
| 3 | leveraged MFI |
| 4 | direct banking |
Let us look at the effect of a fixed cost subsidy (reduce f = 20 to f = 10) on borrower returns.
| Impact Group | Definition | notes |
|---|---|---|
| A | Group 1 --> Group 2 | new MFI emerges where none before |
| B | Group 2 --> Group 2 | support existing MFIs , but no new leverage |
| C | Group 2 --> Group 3 | transforms equity-only to leveraged MFI |
| D | Group 3 --> Group 3 or 4 | increase leverage at already leveraged |
Let us look at the effect of a fixed cost subsidy (reduce f = 20 to f = 10) on borrower returns.
br1 = mfi.breturn(A) # borrower return in MFIs with f=20
mfi2 = Bank(A, mfi.beta)
mfi2.f = mfi.f - 10
br2 = mfi2.breturn(A) # borrower return in MFIs with f=10
plt.plot(A, br1, label=f'return when f={mfi.f}')
plt.plot(A, br2, label=f'return when f={mfi2.f}')
plt.title('Borrower returns at f=20, f=10')
plt.xlabel('A -- pledgeable assets')
plt.ylabel('Returns')
plt.axvline(x=mfi.Amin(), linestyle=':', color='grey')
plt.axvline(x=mfi.Across(), linestyle=':', color='grey')
plt.axvline(x=mfi.AM(0), linestyle=':', color='grey')
plt.legend()
plt.tight_layout()
plt.xlim(0, max(A));

plt.figure(figsize=(6, 4))
plt.plot(A, br2-br1, label='Difference', color='blue')
plt.title('Impact on Borrower Returns')
plt.xlabel('A -- pledgeable assets')
plt.ylabel('Difference')
plt.axvline(x=mfi.Amin(), linestyle=':', color='grey')
plt.axvline(x=mfi.Across(), linestyle=':', color='grey')
plt.axvline(x=mfi.AM(0), linestyle=':', color='grey')
plt.axhline(y=mfi.f-mfi2.f, linestyle=':', color='red') # dashed line at subsidy level (20=20-10)
plt.legend()
plt.tight_layout()
plt.xlim(0, max(A));

Analysis:
| Impact Group | description | notes |
|---|---|---|
| A | previously excluded borrowers | only those with higher A get benefits > subsidy |
| B | existing no-leverage borrowers | benefit>subsidy |
| C | borrowers in transformed MFI | leverage gives extra kick to subsidy, increasing with A |
| D | leveraged to direct borrowing | impact greater than subsidy but declining with A |
| E | Group 4 --> Group 4 | subsidy passed through 1 for 1 |
Subsidy impact on number of borrowers:¶
We are looking at fixed-cost per loan .
$$ N = \frac{K}{I^m + f}
Source
nr1 = mfi.nreach(A) #number borrowers in MFIs with f=20
nr2 = mfi2.nreach(A) #number borrowers in MFIs with f=10
#plt.plot(A,nr1)
#plt.plot(A,nr2)
plt.plot(A, nr2-nr1) # change in borrower return
plt.title('Change in number of borrowers when subsidize f=20 to f=10 and difference')
plt.xlabel('A -- pledgeable assets')
plt.axvline(x=mfi.Amin(), linestyle =':')
plt.axvline(x=mfi.Across(), linestyle =':')
plt.axvline(x=mfi.AM(0), linestyle =':')
plt.axhline(y=mfi.f-mfi2.f,linestyle=':'); # dashed line at subsidy level (20-10)
plt.grid()
plt.ylim(0, 500)
(0.0, 500.0)
Interpretations:
Subsidy to fixed costs will bring new MFIs into the market on the lower end, increasing the number of borrowers served. This is the A impact group.
Subsidy to fixed costs will increase the number of borrowers served by existing MFIs, but not bring new MFIs into the market. This is the B impact group.
plt.plot(A,nr1)
plt.plot(A,nr2)
#plt.plot(A,nr2)
plt.xlabel('A -- pledgeable assets')
plt.xlim(0,110), plt.ylim(0,400)
plt.axvline(x=mfi.Amin(), linestyle =':')
plt.axvline(x=mfi.Across(), linestyle =':')
plt.axvline(x=mfi.AM(0), linestyle =':')
plt.axhline(y=mfi.f-mfi2.f,linestyle=':'); # dashed line at subsidy level (20-10)
plt.grid()

mfi2.K10000Analysis: Recall that K = 10000. So a non-leveraged lender can reach . When they can reach 83.3 borrowers. When they can reach 90.9 borrowers.
Analysis:
| Impact Group | description | notes |
|---|---|---|
| A | previously excluded borrowers | 90.9 new borrowers in each of these new MFIs |
| B | existing no-leverage borrowers | just 7.6 new borrowers per MFI |
| C, D | borrowers in transformed MFI | increase leverage gets many new, increasing with A |
200*255000prod = (nr2 - nr1) * (br2 - br1)
plt.figure(figsize=(7.5, 5.5))
plt.plot(A, prod, color='purple', linewidth=3, label=r'Combined Impact $(N_2 - N_1) \times (Return_2 - Return_1)$')
# Add threshold lines for baseline MFI
plt.axvline(x=mfi.Amin(), linestyle=':', color='grey', label=r'Exclusion threshold $A_{{min}}$ ({:.1f})'.format(mfi.Amin()))
plt.axvline(x=mfi.Across(), linestyle=':', color='blue', label=r'Leverage threshold $A_{{cross}}$ ({:.1f})'.format(mfi.Across()))
plt.axvline(x=mfi.AM(0), linestyle=':', color='green', label=r'Direct banking threshold $A_{{M}}(0)$ ({:.1f})'.format(mfi.AM(0)))
plt.title('Combined Subsidy Impact: Outreach Change x Return Change\n(Subsidy: f=20 to f=10)', fontsize=12, weight='bold')
plt.xlabel('Borrower pledgeable assets $A$', fontsize=10)
plt.ylabel(r'Combined Welfare Impact ($dN \times dReturn$)', fontsize=10)
plt.xlim(0, max(A))
plt.ylim(0, 3000)
plt.grid(True, linestyle=':', alpha=0.6)
plt.legend(fontsize=9, loc='upper right')
plt.tight_layout()
# Save the plot
import os
os.makedirs('figs', exist_ok=True)
plt.savefig('figs/fig-subsidy-combined.png', dpi=300)
plt.show()

3. The Commercial MFI: Selfish Equity & Leverage Rationing¶
In the preceding analysis, we assumed that microfinance intermediaries operate in a highly competitive or altruistic market, earning a rate of return on their informed equity capital exactly equal to the cost of uninformed debt capital ().
However, in many developing economies, informed intermediary capital is highly scarce. Managers and loan officers who possess the specialized skills to screen and monitor borrowers are rare. In a purely commercial landscape, these scarce equity investors will demand an expected rate of return on their equity capital in excess of the cost of debt ().
The Impact of Commercial ROE Hurdles¶
When profit-maximizing equity investors demand a high rate of return :
Wasteful Over-Monitoring: To deliver the higher return to the monitor while maintaining borrower incentives, the offered contract shifts. Borrowers are subjected to more intensive active monitoring than they would choose in a competitive or social finance environment.
Leverage Rationing: From the monitor’s incentive compatibility constraint:
As the hurdle rate rises, the MFI is forced to retain a deeper equity stake in each project to keep their monitoring incentives credible. This restricts their ability to leverage outside funds, reducing their debt-to-equity ratio and limiting their total borrower reach ().
# Let's explore the effect of scarce commercial capital on our MFI
print("--- Baseline Social Finance vs. Commercial Hurdles ---")
print(f"Baseline Social Finance (beta = gamma = {mfi.beta:.1f}):")
print(f" Crossing monitoring mcross = {mfi.mcross():.4f}")
print(f" Crossing collateral Across = {mfi.Across():.4f}")
print(f" Lowest collateral Amin = {mfi.Amin():.4f}")
# Loop through beta steps from 1.1 to 1.5
for b in [1.1, 1.2, 1.3, 1.4, 1.5]:
mfi_temp = Bank(A, beta=b)
print(f"\nCommercial MFI (beta = {b:.1f}):")
print(f" Crossing monitoring mcross = {mfi_temp.mcross():.4f}")
print(f" Crossing collateral Across = {mfi_temp.Across():.4f}")
print(f" Lowest collateral Amin = {mfi_temp.Amin():.4f}")
--- Baseline Social Finance vs. Commercial Hurdles ---
Baseline Social Finance (beta = gamma = 1.2):
Crossing monitoring mcross = 21.9512
Crossing collateral Across = 94.9756
Lowest collateral Amin = 32.3333
Commercial MFI (beta = 1.1):
Crossing monitoring mcross = 20.1220
Crossing collateral Across = 87.0610
Lowest collateral Amin = -6.4667
Commercial MFI (beta = 1.2):
Crossing monitoring mcross = 21.9512
Crossing collateral Across = 94.9756
Lowest collateral Amin = 32.3333
Commercial MFI (beta = 1.3):
Crossing monitoring mcross = 23.7805
Crossing collateral Across = 102.8902
Lowest collateral Amin = 71.1333
Commercial MFI (beta = 1.4):
Crossing monitoring mcross = 25.6098
Crossing collateral Across = 110.8049
Lowest collateral Amin = 109.9333
Commercial MFI (beta = 1.5):
Crossing monitoring mcross = 27.4390
Crossing collateral Across = 118.7195
Lowest collateral Amin = 148.7333
Visualizing the Contract Frontier and Over-monitoring¶
The plot below demonstrates how shifting from a social investor () to a commercial monitor () raises the minimum collateral requirement curve for the leveraged MFI. This pushes the crossing point to the right, meaning that for any given asset level, commercial borrowers are subjected to significantly higher monitoring intensity (and therefore higher interest rates) than they would pay under a social lender.
# Plot minimum collateral requirements comparing baseline and ROE steps
fig, ax = plt.subplots(figsize=(8.5, 6))
mm = np.linspace(0, 80, 500)
# Use a colormap to plot beta steps from 1.1 to 1.5
import matplotlib.cm as cm
betas = [1.1, 1.2, 1.3, 1.4, 1.5]
colors = cm.Reds(np.linspace(0.4, 1.0, len(betas)))
for b, color in zip(betas, colors):
mfi_temp = Bank(A, beta=b)
mmax_temp = mfi_temp.mmax()
if mmax_temp > 0:
mm_env = np.linspace(0, mmax_temp, 500)
ax.plot(mm_env, mfi_temp.Abest(mm_env), linewidth=1.8, color=color, linestyle='--',
label=rf'Commercial $\beta = {b:.1f}$ (ROE = {(b-1.0)*100:.0f}%)')
ax.set_title("Minimum Collateral Requirements: Over-Monitoring under Hurdle ROE", fontsize=12, weight='bold')
ax.set_xlabel("Monitoring intensity $m$", fontsize=10)
ax.set_ylabel("Pledgeable assets $A(m)$", fontsize=10)
ax.set_xlim(0, 80)
ax.set_ylim(0, 160)
ax.legend(fontsize=9, loc='upper right')
plt.tight_layout()
plt.savefig('figs/fig-commercial-AM.png', dpi=300)
plt.show()

Leverage Rationing and Debt-to-Equity Collapsation¶
As grows, the required equity stake per loan must rise to satisfy the monitor’s incentives. Consequently, the debt-to-equity ratio collapses. The plot below maps the debt-to-equity ratio across different pledgeable asset levels. Note how the commercial MFI’s leverage curve (red) sits significantly below the social MFI’s leverage curve (blue), demonstrating how commercial profit-maximizing hurdles restrict leverage and limit the scale of financial inclusion.
To prevent the leverage ratio from rising to infinity as required monitoring goes to zero for wealthy borrowers, we assume that the fixed administrative cost of operation must always be financed out of MFI equity (at opportunity cost ). The debt-to-equity ratio is therefore:
Since , this naturally bounds the maximum leverage ratio at:
# Plot Debt-to-Equity ratios comparing baseline and ROE steps
fig, ax = plt.subplots(figsize=(8.5, 6))
# Baseline (beta = 1.2) - leverage is capped at I/f under equity-financed operational cost f
# Plot the leverage curves for beta steps from 1.1 to 1.5
import matplotlib.cm as cm
betas = [1.1, 1.2, 1.3, 1.4, 1.5]
colors = cm.Reds(np.linspace(0.4, 1.0, len(betas)))
for b, color in zip(betas, colors):
mfi_temp = Bank(A, beta=b)
amin_temp = mfi_temp.Amin()
A_temp = np.linspace(amin_temp, mfi_temp.AM(0), 100)[:-1]
Im_temp = np.array([mfi_temp.Im(m) for m in mfi_temp.minmon(A_temp)])
de_temp = np.divide(mfi_temp.I - Im_temp, Im_temp + mfi_temp.f, out=np.zeros_like(Im_temp), where=(Im_temp + mfi_temp.f)>0)
ax.plot(A_temp, de_temp, label=rf'Commercial $\beta = {b:.1f}$ (ROE = {(b-1.0)*100:.0f}%)', color=color, linewidth=2)
ax.axvline(x=mfi_temp.Across(), linestyle=':', color=color, alpha=0.6)
# Draw the natural leverage limit line
max_de = mfi.I / mfi.f
ax.axhline(y=max_de, color='red', linestyle='--', linewidth=2, alpha=0.7, label=f'Max Leverage I/f ({max_de:.1f})')
ax.set_title(r"Debt-to-Equity Ratio $\frac{I - I^m}{I^m + f}$ under Equity-Financed Operational Cost $f$", fontsize=12, weight='bold')
ax.set_xlabel("A -- pledgeable assets", fontsize=10)
ax.set_ylabel("Leverage Ratio", fontsize=10)
ax.set_xlim(20, 140)
ax.set_ylim(0, max_de * 1.25) # dynamically sets y-limit to exactly 1.25 times the cap (12.5)
ax.legend(fontsize=9, loc='upper right')
plt.tight_layout()
plt.savefig('figs/fig-commercial-DE.png', dpi=300)

4. Interactive Contract Space Simulator¶
Use the interactive sliders below to dynamically explore the contract space! You can vary the cost of equity (), the cost of uninformed debt (), and the monitoring slope () to see in real time how:
The minimum collateral boundaries and shift.
The crossing point and leverage boundaries adapt.
# Define the interactive simulator function
def simulate_contract_space(beta=1.2, gamma=1.0, alpha=0.5, f=20, B_0=30, q=0.82):
# Close all previous matplotlib figures to prevent duplication/memory leaks
import matplotlib.pyplot as plt
plt.close('all')
# Clear the previous cell output in the notebook
from IPython.display import clear_output
clear_output(wait=True)
# Create a dynamic bank instance
sim_mfi = Bank(A, beta=beta)
sim_mfi.gamma = gamma
sim_mfi.alpha = alpha
sim_mfi.f = f
sim_mfi.B0 = B_0
sim_mfi.q = q
mc = sim_mfi.mcross()
Amc = sim_mfi.AM(mc)
mmax_val = sim_mfi.mmax()
fig, ax = plt.subplots(figsize=(8, 6))
mm = np.linspace(0, 100, 500)
# Plot baseline curves as thin dotted/dashed lines
ax.plot(mm, sim_mfi.AMe(mm), label=r'Equity-only MFI $A^e(m)$', linestyle=':', color='green', alpha=0.4)
ax.plot(mm, sim_mfi.AM(mm), label=r'Leveraged MFI $A(m)$', linestyle='--', color='purple', alpha=0.4)
# Plot the thick solid envelope if feasible
if mmax_val > 0:
mm_env = np.linspace(0, mmax_val, 200)
ax.plot(mm_env, sim_mfi.Abest(mm_env), linewidth=3.3, color='blue', label='Feasible Frontier')
# Mark mmax
Ammax = sim_mfi.Abest(mmax_val)
ax.plot(mmax_val, Ammax, 'ro', markersize=8, label=f'Max Monitoring (m={mmax_val:.1f})')
ax.vlines(mmax_val, ymin=0, ymax=Ammax, linestyle='--', color='red', alpha=0.6)
else:
ax.text(40, 80, "No Feasible Contract Space\n(Market Collapsed)",
color='red', fontsize=14, ha='center', va='center', weight='bold')
# Add key crossings
ax.plot(mc, Amc, 'go', markersize=8, label=f'Crossover Point (m={mc:.1f})')
ax.vlines([mc], ymin=0, ymax=Amc, linestyle=':', color='green', alpha=0.6)
# Format plot
ax.set_title(rf"Dynamic Contract Space ($\beta={beta:.2f}$, $\gamma={gamma:.2f}$, $\alpha={alpha:.2f}$, $f={f:.0f}$, $B_0={B_0:.0f}$, $q={q:.2f}$)")
ax.set_xlabel("Monitoring intensity $m$")
ax.set_ylabel("Pledgeable assets $A(m)$")
ax.set_xlim(0, 80)
ax.set_ylim(0, 160)
ax.legend(loc='upper right')
ax.grid(True, linestyle=':', alpha=0.6)
plt.tight_layout()
plt.show()
# Setup interactive dashboard
interact(simulate_contract_space,
beta=(1.0, 1.8, 0.05),
gamma=(1.0, 1.2, 0.05),
alpha=(0.1, 0.9, 0.05),
f=(0, 30, 5),
B_0=(15, 45, 5),
q=(0.70, 0.95, 0.01));