No evidence of no-grounds reform impacting housing investment: A difference-in-difference analysis

20/09/2024

Disclaimer: This research is ongoing, and the findings are preliminary. This page will be updated as the work progresses.

In a recent blog, we inspected mortgage data to see if there was any obvious relationship with tenancy reform. Here, we take a more in-depth approach by using a common statistical method called difference-in-difference to measure the impact, if any, of the "no grounds" reform on investment.

Difference-in-difference is a method used to measure the impact of an intervention. It works by looking at a treatment group that experiences a change (in our case Victoria after April 2021) and comparing it to a control group that does not. This approach is especially useful for studying natural experiments, like when one region adopts a new policy while another similar region does not.

We use a number of variations of the following twoway fixed effects model to estimate the effect of this policy on investment:

$$ \text{Investment}_{i,t} = \alpha_0 + \lambda  \text{Reform}_{i,t} + \sum_i \beta_i \text{State}_i + \sum_t \beta_t \text{Time}_t + \boldsymbol{\gamma} \pmb{X}_{i,t} + \boldsymbol{\omega} \pmb{W}_{t} +  \epsilon_{i,t} $$

  • \(i\) refers to different states, and \(t\) represents months.
  • \(\text{Investment}_{i,t}\) is the log of monthly investor mortgages in state \(i\) at time \(t\), adjusted for inflation.
  • \(\text{Reform}_{i,t}\) is a variable that equals 1 if the reform is in place in state \(i\) at time \(t\) , and 0 otherwise (i.e. Victoria after August 2021- when no-grounds evictions were removed). The coefficient \(\lambda\) measures how this policy change affected investor lending in Victoria.
  • \(\text{State}_i\) and \(\text{Time}_t\) are fixed effects, which help account for differences between states and changes over time, making sure these factors don't influence the results.
  • \(\pmb{X}_{i,t}\) includes state and time specific explanatory variables while \(\pmb{W}_{t}\) contains only time specific explanatory variables.

In short, this equation is designed to assess whether the 2021 policy change in Victoria influenced investor lending, while also controlling for other variables, differences between states, and changes over time.

The state and time specific explanatory variables we tested were:

  • State population growth
  • Median asking property price growth in each capital city

We replace the asking property price variable with its 6 month lagged value to avoid the risk of simultaneity. The time specific explanatory variables we tested were:

  • Cash rate
  • CPI
  • National population growth
  • National median asking property price growth

When introducing \(\pmb{W}_{t}\) - time specific explanatory variables \(\text{Time}_t\) was replaced with \(\text{Year}_y\), a dummy variable equal to 1 if time \(t\) falls in the given year, due to collinearity problems between the time dummy \(\text{Time}_t\) and all the above time specific explanatory variables.

We tried three separate regressions, all three had no significant effect of the removal of no grounds in Victoria on Investor lending. We have used clustered errors at the state level to avoid the effects of autocorrelated data minimising the standard error.

 

You can replicate the results with the following Python script:


import pandas as pd
from statsmodels.formula.api import wls

file = '2024-10-02-no-grounds-reform-impact-analysis.csv'
data_url = f'https://files.tenants.org.au/policy/{file}'

df = pd.read_csv(data_url)
df['Year_category'] = df['Year'].astype(str)

formula1 = "log_Investment ~ Reform + Group + Year_month"

formula2 = "log_Investment ~ Reform + Group + Year_month"
formula2 += "+ Population_growth_12 + Sale_growth_12_lag_6"

formula3 = "log_Investment ~ Reform + Group + Year_category"
formula3 += "+ Population_growth_12 + Sale_growth_12_lag_6"
formula3 += "+ Cash_rate + CPI"

for formula in [formula1, formula2, formula3]:
    model = wls(formula, data=df).fit(
        cov_type="cluster",
        cov_kwds={"groups": np.array(df[["Group_int"]])},
        weights = df['Investment'],
        use_t=True,
    )
    print(model.summary())