diff --git a/README.md b/README.md index 7a48db2..d1d0d86 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ threshold: heavily. VAT registration is then assigned: mandatory above the threshold, voluntary below at the HMRC-calibrated rate. -The result is ~2.94M firm rows weighted to ~2.0M UK firms. Because the population +The result is ~2.94M firm rows weighted to ~2.5M UK firms. Because the population is calibrated **to** the HMRC aggregates, agreement with them is an internal consistency check, not external validation. diff --git a/paper/Appendix/a_data.tex b/paper/Appendix/a_data.tex index 53ceb12..0b8bbf5 100644 --- a/paper/Appendix/a_data.tex +++ b/paper/Appendix/a_data.tex @@ -33,7 +33,7 @@ \subsection{Data construction detail} counterfactual density of Section~\ref{sec:bunching} is fitted by polynomial regression on the observed density outside a manipulation window around the threshold. The baseline excludes $[T^{*}-15\text{k}, T^{*}+15\text{k}]$ and fits -a cubic. Widening the window guards against contamination of the counterfactual +a degree-7 polynomial. Widening the window guards against contamination of the counterfactual by the behavioural response but reduces the data available for the fit; raising the degree improves in-sample fit but risks over-fitting the tails. The sensitivity of the excess-mass and bunching-ratio estimates to window width and diff --git a/paper/Appendix/a_inference.tex b/paper/Appendix/a_inference.tex index 0cfad8c..2192090 100644 --- a/paper/Appendix/a_inference.tex +++ b/paper/Appendix/a_inference.tex @@ -63,7 +63,14 @@ \subsubsection*{Bootstrap standard errors} distribution, and the $95\%$ confidence interval is the $2.5$th--$97.5$th percentile interval. Resampling firms (rather than residuals) propagates both sampling variation and the variation induced by re-binning. Table~\ref{tab:boot} -reports the results. +reports the results. Because these replications resample the $\approx 2.94$ +million \emph{constructed} synthetic firm rows, whose number is itself a +modelling choice, the resulting standard errors and $95\%$ intervals quantify +only the estimator's dispersion under resampling of a synthetic file of +analyst-chosen size; they scale with that arbitrary row count and should +\emph{not} be read as population sampling error about the universe of UK firms. +They are reported for completeness and reproducibility, not as confidence +statements about UK firms. \begin{table}[t] \centering @@ -95,7 +102,16 @@ \subsubsection*{Non-identification: the elasticities are not behavioural} density step in the calibration targets rather than from any behavioural response (the placebo test below makes this precise). The elasticities are therefore reported only as a record of what the estimator returns when applied -to these data; the paper draws no behavioural conclusion from them. This is an +to these data; the paper draws no behavioural conclusion from them. A reader +should note that the iso-elastic turnover elasticities $e\in\{0.05,0.17,0.32\}$ +swept in the body (Section~\ref{sec:behavioural}) are a \emph{different} object +from the notch-width elasticity ($\approx 0.45$) and marginal-buncher elasticity +($\approx 0.66$) reported here: the former are the median and mean of a per-firm +marginal-buncher mapping under the iso-elastic firm specification, while the +latter are aggregate estimator outputs computed under different normalisations. +All of these numbers are mechanical artefacts of the calibration and are +non-identified on these synthetic data---they admit no precise numerical mapping +between the two sets---so none is used anywhere as a behavioural estimate. This is an instance of the general non-identification of bunching elasticities absent exogenous variation or strong functional-form assumptions \citep{blomquistetal2021, bertanhaetal2023}. @@ -125,12 +141,22 @@ \subsubsection*{Sensitivity to polynomial degree and exclusion window} \hline Degree & Window & $b$ & $E$ & $\sigma$ & Notch-width (median) \\ \hline +5 & \pounds10k & $0.150$ & $13{,}339$ & $5.62$ & $0.47$ \\ +5 & \pounds15k & $0.139$ & $18{,}823$ & $5.16$ & $0.71$ \\ +5 & \pounds20k & $0.141$ & $25{,}596$ & $4.95$ & $0.87$ \\ +5 & \pounds25k & $0.152$ & $34{,}172$ & $5.11$ & $1.04$ \\ 6 & \pounds10k & $0.077$ & $7{,}262$ & $5.42$ & $0.41$ \\ 6 & \pounds15k & $0.045$ & $6{,}575$ & $4.99$ & $0.44$ \\ 6 & \pounds20k & $0.015$ & $3{,}822$ & $4.21$ & $0.35$ \\ +6 & \pounds25k & $-0.028$ & $471$ & --- & $0.15$ \\ 7 & \pounds10k & $0.091$ & $8{,}539$ & $5.07$ & $0.47$ \\ \textbf{7} & \textbf{\pounds15k} & $\mathbf{0.060}$ & $\mathbf{8{,}712}$ & $\mathbf{4.85}$ & $\mathbf{0.45}$ \\ 7 & \pounds20k & $0.034$ & $7{,}313$ & $4.62$ & $0.43$ \\ +7 & \pounds25k & $-0.004$ & $3{,}089$ & --- & $0.25$ \\ +8 & \pounds10k & $0.118$ & $10{,}806$ & $4.92$ & $0.42$ \\ +8 & \pounds15k & $0.118$ & $16{,}329$ & $4.53$ & $0.59$ \\ +8 & \pounds20k & $0.166$ & $29{,}364$ & $4.96$ & $0.77$ \\ +8 & \pounds25k & $0.301$ & $59{,}931$ & $7.57$ & $0.95$ \\ \hline \end{tabular} \end{table} diff --git a/paper/Sections/behavioural.tex b/paper/Sections/behavioural.tex index 5c9483d..43f5edd 100644 --- a/paper/Sections/behavioural.tex +++ b/paper/Sections/behavioural.tex @@ -7,7 +7,7 @@ \section{Behavioural reform costs} Section~\ref{sec:bunching} then shows that the bunching in my synthetic data is mechanical, so a behavioural elasticity is not identified from it---the reduced-form response is a placebo. Section~\ref{sec:model} supplies the one object that needs -no behavioural calibration at all: the exact, model-free dominated region. What is +no behavioural calibration at all: the exact, elasticity-free dominated region. What is missing from this sequence is the behavioural layer itself---a costing that lets firms re-optimise turnover when a reform changes the effective rate they face. This section supplies that layer. I build an iso-elastic structural simulator that, for @@ -89,20 +89,27 @@ \subsection{An iso-elastic structural simulator} \subsection{Results} \label{ssec:behavioural-results} -I sweep $e\in\{0.05,\,0.17,\,0.32\}$ and take $e=0.17$ as the headline. The low +I sweep $e\in\{0.05,\,0.17,\,0.32\}$ and report the full sweep, treating +$e=0.17$ as an illustrative midpoint rather than a headline estimate. The low value $0.05$ is of the order reported by \citet{klevenwaseem2013}; $0.32$ is the mean implied by mapping the marginal-buncher condition through my notch; $0.17$ is -the median of that mapping. I flag the provenance plainly: the $0.17$ and $0.32$ +the median of that mapping. (These per-firm-mapping summaries are a different object +from the single aggregate marginal-buncher elasticity $\approx0.66$ tabulated in +Appendix~\ref{app:inference}, and differ from it numerically; both are mechanical, +non-identified artefacts of the calibration.) I flag the provenance plainly: the $0.17$ and $0.32$ values are read off the marginal-buncher condition applied to my notch geometry, which inherits the mechanical bunching that Section~\ref{sec:bunching} shows to be -non-behavioural, so they are model-implied, not data-identified; I use them only to -delimit a plausible sweep, anchored at the lower end by the external -\citet{klevenwaseem2013} value, and a reader preferring a fully external range may -substitute literature values for $e$ directly without changing the conditional -structure of the costing. The same mapping pins the marginal buncher +non-behavioural, so they are model-implied, not data-identified; the range's only +externally-anchored point is its lower end (the \citet{klevenwaseem2013} value of +$\approx 0.05$). I use them only to delimit a plausible sweep, and a reader +preferring a fully external range---for instance \citet{liuetal2021}'s UK VAT-base +elasticity---may substitute literature values for $e$ directly without changing the +conditional structure of the costing. The same mapping pins the marginal buncher $n_H(e)$---the highest ability that still finds it optimal to bunch at the -threshold---at \pounds112{,}795 for $e=0.05$ (a frictionless excess of -$\Delta y^{*}\approx\pounds27.8$k), \pounds127{,}382 for $e=0.17$ +threshold---at \pounds112{,}795 for $e=0.05$ (a frictionless excess +$\Delta y_{H}\equiv n_H-T^{*}\approx\pounds27.8$k, distinct from the empirical +bunching span $\Delta y^{*}=\pounds5.6$k of Appendix~\ref{app:inference}), +\pounds127{,}382 for $e=0.17$ ($\approx\pounds42.4$k), and \pounds143{,}527 for $e=0.32$ ($\approx\pounds58.5$k), consistent with the analytic dominated-region width $a=\pounds21{,}250$ of Section~\ref{sec:model}. @@ -118,7 +125,7 @@ \subsection{Results} static loss. The offset is substantial: at $e=0.17$ the raised threshold costs \(-\)\pounds292m against a static \(-\)\pounds508m, and the $10\%$ and $15\%$ bands cost \(-\)\pounds273m and \(-\)\pounds135m against static \(-\)\pounds343m and -\(-\)\pounds171m. At the headline $e=0.17$, the number of firms re-optimising is +\(-\)\pounds171m. At the illustrative midpoint $e=0.17$, the number of firms re-optimising is $50{,}155$ under the raised threshold, $61{,}187$ under the $10\%$ reduced rate, and $51{,}226$ under the $15\%$ reduced rate. Figure~\ref{fig:reform_dist} traces these costs across the full range of $e$, with each curve nesting onto its static value as @@ -152,7 +159,7 @@ \subsection{Results} ($e\to0$ limit) figure for comparison. Each behavioural figure re-solves every firm's iso-elastic optimum~\eqref{eq:isoelastic} under the reform schedule, holding recovered abilities and $e$ fixed. The final column reports the number of firms that -re-optimise at the headline $e=0.17$. Every behavioural figure is conditional on the +re-optimise at the illustrative midpoint $e=0.17$. Every behavioural figure is conditional on the assumed, non-identified $e$. The graduated taper is excluded from the behavioural costing; see the note below the table and the discussion that follows.} \label{tab:behavioural_costs} diff --git a/paper/Sections/bunching.tex b/paper/Sections/bunching.tex index c748ac1..4535e7e 100644 --- a/paper/Sections/bunching.tex +++ b/paper/Sections/bunching.tex @@ -20,7 +20,7 @@ \section{Bunching at the VAT threshold} \subsection{Methodology} Following \citet{liuetal2021}, I group firms into fine turnover bins of -\pounds100 and estimate a counterfactual density---the distribution that would +\pounds1{,}000 and estimate a counterfactual density---the distribution that would obtain absent the registration notch---by polynomial regression on bin counts, excluding a manipulation window around the threshold $y^{*}$: \[ @@ -53,7 +53,7 @@ \subsection{Results} the mass-conservation restriction that excess mass below the threshold equal missing mass above it---reported in Appendix~\ref{app:inference} and reproducible from the released code on the regenerated synthetic data. The observed -density displays a clear step at the threshold: more mass in the \pounds100 bins +density displays a clear step at the threshold: more mass in the \pounds1{,}000 bins immediately below the cutoff than just above it. I want to be precise about what this number is. It is the magnitude of a density diff --git a/paper/Sections/conclusion.tex b/paper/Sections/conclusion.tex index c3b6a0f..e4b38d4 100644 --- a/paper/Sections/conclusion.tex +++ b/paper/Sections/conclusion.tex @@ -43,7 +43,13 @@ \section{Conclusion} accounting identity rather than a new structural result, but one spanning a populous range of roughly $137{,}000$ firms. Setting cost against distortion is instructive: raising the threshold is the most expensive option yet merely -relocates the zone, whereas the taper removes it entirely for less. Third, the open +relocates the zone, and a banded reduced rate does not shrink the distortion +either---it lowers the largest single notch (from \pounds17{,}000 to \pounds12{,}750 +at a $15\%$ band) but, because the band reverts to the standard rate at its +\pounds105{,}000 top, adds a secondary notch, leaving the total dominated-turnover +width essentially unchanged (\pounds21{,}562 at $15\%$, \pounds22{,}569 at $10\%$, +both marginally above the \pounds21{,}250 baseline). Only the graduated taper, +being continuous, removes the distortion entirely, and for less. Third, the open data reproduce the published density step at the threshold, but a placebo test shows the apparent excess mass is inherited from the coarse HMRC band targets rather than firm behaviour---it collapses from $8{,}712$ to roughly $99$ weighted @@ -57,10 +63,13 @@ \section{Conclusion} identified on these synthetic data---the placebo shows the bunching is mechanical---I report the behavioural cost as an $e$-sensitivity range that nests the static cost as $e\to0$. Conditional on an assumed $e$, modelled responses partly -offset the static costs: at $e=0.17$ the raise to \pounds100{,}000 falls from -\pounds508m static to about \pounds292m, the $10\%$ band from \pounds343m to -\pounds273m, and the $15\%$ band from \pounds171m to \pounds135m, as firms broaden -the base when the effective rate falls. I report no behavioural cost for the +offset the static costs: at an illustrative midpoint $e=0.17$ the raise to +\pounds100{,}000 falls from \pounds508m static to about \pounds292m, the $10\%$ +band from \pounds343m to \pounds273m, and the $15\%$ band from \pounds171m to +\pounds135m, as firms broaden the base when the effective rate falls. The +$e$-range $\{0.05,0.17,0.32\}$ is a sensitivity range whose only externally +anchored point is the lower end $e=0.05$; the $0.17$ and $0.32$ values are implied +by the notch geometry, not identified from the data. I report no behavioural cost for the graduated taper: its behavioural response is not credibly identified, because its base-broadening and marginal-rate channels pull in opposite directions and the iso-elastic cost cannot net them, so only its static cost and dominated-region @@ -69,9 +78,18 @@ \section{Conclusion} \paragraph{Limitations and future work.} The model is a turnover-tax-notch approximation: it treats VAT as a cost on turnover, whereas real VAT is levied on -value added with input reclaim, and roughly half of below-threshold firms register +value added with input reclaim, and roughly 43\% of below-threshold firms register voluntarily \citep{liuetal2021}, so the effective notch is smaller than a flat -treatment implies. The microdata are synthetic and calibrated to coarse aggregate +treatment implies. The dominated-region width indexes the misallocation distortion +only and omits the compliance and administrative-cost saving that a \emph{higher} +threshold delivers by removing small firms from VAT---the classic rationale for a +high registration threshold \citep{keenmintz2004}---so the efficiency comparison is +partial; a full welfare/MVPF accounting would net these compliance costs against +the misallocation distortion. The menu reforms are also costed only in aggregate: +because VAT liability by sector is excluded from the calibration optimiser +(Section~\ref{sec:data}), the framework does not yet report the sectoral incidence +of a taper or reduced rate---which sectors gain and by how much---a cut of obvious +policy interest that I leave to future work. The microdata are synthetic and calibrated to coarse aggregate bands---which is why the behavioural magnitudes are reported only conditional on an assumed elasticity rather than as estimates---and the analysis is partial-equilibrium, abstracting from pass-through into prices \citep{benedek2015, diff --git a/paper/Sections/data.tex b/paper/Sections/data.tex index ac5c35c..50975ca 100644 --- a/paper/Sections/data.tex +++ b/paper/Sections/data.tex @@ -23,7 +23,9 @@ \section{Data} distribution. Each firm is given input expenditure $x_i = \rho_i\,y_i$, with the input--output ratio $\rho_i$ drawn from a rescaled Beta distribution with sector-specific shifts and bounded to $\rho_i \in [0.6,1.5]$; its value added, the -net VAT base, is $v_i = y_i - x_i$. Employment is assigned from the ONS +net VAT base, is $v_i = y_i - x_i$ (the upper bound $\rho_i=1.5$ permits $x_i>y_i$, +and hence negative value added, for a minority of input-heavy firms, representing +net input-VAT-reclaim positions). Employment is assigned from the ONS employment-band shares. The base population reproduces the ONS structure but not diff --git a/paper/Sections/intro.tex b/paper/Sections/intro.tex index e275de4..055bdfe 100644 --- a/paper/Sections/intro.tex +++ b/paper/Sections/intro.tex @@ -31,17 +31,17 @@ \section{Introduction}\label{sec:intro} Reform proposals change the threshold in one of three ways: its \emph{level} (raising or lowering it), its \emph{shape} (replacing the notch with a schedule that phases the rate in over a band), or its \emph{rate} (a reduced rate for firms in a band above the threshold). The three are not equivalent. Changing the level moves the notch along the turnover axis; changing the shape or the rate alters the size of the discrete jump itself. Costing the three on a common basis is the practical difficulty this paper addresses. A change in the level can be costed by mechanical accounting, but a change in the shape of the schedule cannot be evaluated with the reduced-form bunching methods used to study the threshold, because a continuous schedule leaves no single point of excess mass to exploit. The firm-level data needed to study turnover near the threshold is, in addition, not available in open form. -In this paper I build an open, reproducible firm-level microsimulation for costing UK VAT threshold reforms on a common static basis. I construct synthetic firm microdata calibrated to published HMRC aggregates---band-level firm counts and sector turnover totals---for the 2023--24 tax year, when the threshold was \pounds 85{,}000 (raised to \pounds 90{,}000 in April 2024); the synthetic data can be released openly and regenerated under any counterfactual schedule. On these data I do four things. I cost both level reforms and schedule reforms---a graduated taper and a reduced-rate band---statically, by applying each counterfactual schedule mechanically to the firm distribution. I show that the synthetic data reproduce the density step at the \pounds 85{,}000 notch documented in administrative data by \citet{liuetal2021}, and I use a placebo test to demonstrate that this step is mechanical---inherited from the coarse band-level counts that serve as calibration targets rather than generated by firm location choice---so I draw no behavioural elasticity from the synthetic bunching. And I characterise the notch's distortion through its \emph{dominated region}---the exact, model-free range of turnover above the threshold in which no firm locates---and how each reform changes it. I then additionally price the reforms behaviourally: a structural simulator re-optimises each firm under each counterfactual schedule---a forward solve that re-prices firms rather than applying the schedule to the observed distribution---conditional on an assumed turnover elasticity $e$ that I do not identify from the data, and I report the result as an $e$-sensitivity range that nests the static costing in its $e\to0$ limit. The static cost and the exact dominated region remain the elasticity-free robust anchors. +In this paper I build an open, reproducible firm-level microsimulation for costing UK VAT threshold reforms on a common static basis. I construct synthetic firm microdata calibrated to published HMRC aggregates---band-level firm counts and sector turnover totals---for the 2023--24 tax year, when the threshold was \pounds 85{,}000 (raised to \pounds 90{,}000 in April 2024); the synthetic data can be released openly and regenerated under any counterfactual schedule. On these data I do four things. I cost both level reforms and schedule reforms---a graduated taper and a reduced-rate band---statically, by applying each counterfactual schedule mechanically to the firm distribution. I show that the synthetic data reproduce the density step at the \pounds 85{,}000 notch documented in administrative data by \citet{liuetal2021}, and I use a placebo test to demonstrate that this step is mechanical---inherited from the coarse band-level counts that serve as calibration targets rather than generated by firm location choice---so I draw no behavioural elasticity from the synthetic bunching. And I characterise the notch's distortion through its \emph{dominated region}---the exact, elasticity-free range of turnover above the threshold in which no firm locates---and how each reform changes it. I then additionally price the reforms behaviourally: a structural simulator re-optimises each firm under each counterfactual schedule---a forward solve that re-prices firms rather than applying the schedule to the observed distribution---conditional on an assumed turnover elasticity $e$ that I do not identify from the data, and I report the result as an $e$-sensitivity range that nests the static costing in its $e\to0$ limit. The static cost and the exact dominated region remain the elasticity-free robust anchors. -Three findings follow. First, the static pipeline prices level and shape reforms on a common basis and reproduces HMRC's published anchor costing: my static costing of the April 2024 increase from \pounds 85{,}000 to \pounds 90{,}000 gives \pounds 175m in 2025--26 against HMRC's published \pounds 185m, agreeing within about \pounds 10m---an internal-consistency check on the costing rather than an external validation. Forward moves from the \pounds 90{,}000 base range from a gain of \pounds 665m at \pounds 70{,}000 to a cost of \pounds 1{,}205m at \pounds 120{,}000, against a base of about \pounds 203.8bn. +Three findings follow. First, the static pipeline prices level and shape reforms on a common basis and reproduces HMRC's published anchor costing: my static costing of the April 2024 increase from \pounds 85{,}000 to \pounds 90{,}000 gives \pounds 175m in 2025--26 against the Government's published \pounds 185m, agreeing within about \pounds 10m---an internal-consistency check on the costing rather than an external validation. Forward moves from the \pounds 90{,}000 base range from a gain of \pounds 665m at \pounds 70{,}000 to a cost of \pounds 1{,}205m at \pounds 120{,}000, against a base of about \pounds 203.8bn. -Second, the shape and rate reforms act on the notch's distortion in a way that a change in level does not. The notch creates a \emph{dominated region} of width $a = T^{*}\tau/(1-\tau) = \pounds 21{,}250$ above the threshold (\pounds 85{,}000--\pounds 106{,}250), a range of turnover in which no firm can locate without being strictly worse off than at the threshold. This region is an exact, model-free property of the schedule: it follows from the arithmetic of the notch alone and requires no behavioural calibration. It also spans a populous part of the firm distribution---about 137{,}000 weighted firms---so its width is an economically meaningful distortion index, not a theoretical curiosity. Raising the threshold relocates this region without removing it. A reduced rate shrinks it---to \pounds 9{,}444 at a 10\% band rate and \pounds 15{,}000 at 15\%---while a graduated taper, being continuous, removes it. Set against their static revenue costs, the reforms are not interchangeable: raising the threshold to \pounds 100{,}000 costs \pounds 508m, the most expensive option, yet removes none of the distortion; the taper removes the dominated region entirely for \pounds 336m; and the 10\% and 15\% reduced rates cost \pounds 343m and \pounds 171m while shrinking it. The level move is therefore the dearest and least efficient of the menu. I report, for each reform, its static cost together with the portion of the dominated region it removes. +Second, the shape and rate reforms act on the notch's distortion in a way that a change in level does not. The notch creates a \emph{dominated region} of width $a = T^{*}\tau/(1-\tau) = \pounds 21{,}250$ above the threshold (\pounds 85{,}000--\pounds 106{,}250), a range of turnover in which no firm can locate without being strictly worse off than at the threshold. This region is an exact, elasticity-free property of the schedule (conditional on the turnover-tax notch): it follows from the arithmetic of the notch alone and requires no behavioural calibration. It also spans a populous part of the firm distribution---about 137{,}000 weighted firms---so its width is an economically meaningful distortion index, not a theoretical curiosity. Raising the threshold relocates this region without removing it. A reduced rate does \emph{not} remove the distortion: it lowers the largest single notch (the jump at the threshold falls from \pounds 17{,}000 to \pounds 12{,}750 at a 15\% band) but, because the band reverts to the standard rate at its \pounds 105{,}000 top, it introduces a second notch and hence a second dominated region, so the \emph{total} dominated-turnover width is essentially unchanged---\pounds 21{,}562 at 15\% and \pounds 22{,}569 at 10\%, both marginally above the \pounds 21{,}250 baseline. Only a graduated taper, being continuous, removes the distortion entirely. Set against their static revenue costs, the reforms are not interchangeable: raising the threshold to \pounds 100{,}000 costs \pounds 508m on this common \pounds 85{,}000 data-year base (the \pounds 90{,}000-base sweep of the first finding puts the same move at \pounds 374m), the most expensive option, yet removes none of the distortion; the taper removes the dominated region entirely for \pounds 336m; and the 10\% and 15\% reduced rates cost \pounds 343m and \pounds 171m while merely splitting the dominated band in two rather than shrinking it. The level move is therefore the dearest and least efficient of the menu. I report, for each reform, its static cost together with the portion of the dominated region it removes. -Pricing the same reforms behaviourally---conditional on an assumed turnover elasticity $e$, which the synthetic data do not identify---implies that firm responses, if firms respond at all, would partly offset these static costs. As the effective rate falls, firms in the model scale their turnover up and broaden the base, so a larger assumed $e$ makes each reform cheaper. At a headline $e = 0.17$ the raise to \pounds 100{,}000 falls from \pounds 508m to about \pounds 292m, the 10\% rate from \pounds 343m to \pounds 273m, and the 15\% rate from \pounds 171m to \pounds 135m. I do not report a behavioural cost for the graduated taper: its two channels---base-broadening as the average rate falls, and a marginal-rate distortion as the taper's rate rises with turnover---cannot be credibly netted in this iso-elastic framework, so only its static cost and dominated-region removal are reported. These behavioural figures are conditional on the assumed $e$ and span a range over $e \in \{0.05, 0.17, 0.32\}$; because $e$ is not identified on the synthetic data, I treat them as a disciplined sensitivity analysis rather than a point estimate, with the static cost and the exact dominated region as the elasticity-free anchors. +Pricing the same reforms behaviourally---conditional on an assumed turnover elasticity $e$, which the synthetic data do not identify---implies that firm responses, if firms respond at all, would partly offset these static costs. As the effective rate falls, firms in the model scale their turnover up and broaden the base, so a larger assumed $e$ makes each reform cheaper. At an illustrative midpoint $e = 0.17$ the raise to \pounds 100{,}000 falls from \pounds 508m to about \pounds 292m, the 10\% rate from \pounds 343m to \pounds 273m, and the 15\% rate from \pounds 171m to \pounds 135m. I do not report a behavioural cost for the graduated taper: its two channels---base-broadening as the average rate falls, and a marginal-rate distortion as the taper's rate rises with turnover---cannot be credibly netted in this iso-elastic framework, so only its static cost and dominated-region removal are reported. These behavioural figures are conditional on the assumed $e$ and span a range over $e \in \{0.05, 0.17, 0.32\}$, of which only the lower end $e = 0.05$ has an external anchor \citep{klevenwaseem2013}; the $0.17$ and $0.32$ values are read off the notch geometry, not identified from the data. Because $e$ is not identified on the synthetic data, I treat the range as a disciplined sensitivity analysis rather than a point estimate, with the static cost and the exact dominated region as the elasticity-free anchors. Third, the open data carry a transparency lesson about bunching. The synthetic records reproduce the density step at \pounds 85{,}000 that \citet{liuetal2021} document in administrative data, which might tempt one to read a behavioural response off the synthetic distribution. A placebo test shows this would be a mistake: when the density step is removed from the calibration target, the apparent excess mass collapses from about 8{,}712 firms to roughly 99, revealing that the step is mechanical---a reflection of the two coarse turnover bands HMRC publishes across the threshold, baked into the calibration target---rather than a product of firm location choice, which the generator does not model. Behavioural bunching is thus not identified on the synthetic data, and I make no such claim from them; the behavioural evidence remains \citeauthor{liuetal2021}'s administrative estimate. I treat the reproduction of the published step as a credibility check on the data and the placebo as the appropriate caveat against over-reading it. \medskip -\textbf{Related literature.} The paper draws on and contributes to four strands of work. The first is the methodology of bunching and notches \citep{saez2010,klevenwaseem2013,chettyetal2011,kleven2016,best2015}, which provides the analytic notion of a dominated region; I use the dominated region to characterise a distortion that leaves no single point of excess mass to exploit. The second is the empirical literature on the VAT registration threshold \citep{liuetal2021,liulockwoodtam2024,onji2009,harju2019,asatryanpeichl2017,nandiwarwick2020,waseem2024}, which estimates the behavioural response and studies changes in the threshold's level. \citet{liuetal2021} is closest: it estimates bunching at the UK notch on administrative data and documents voluntary registration; I take its administrative estimate as the established behavioural fact, show that my open synthetic data reproduce the density step it documents, and cost shape and rate reforms statically on a common basis. The international evidence \citep{harju2019,onji2009,asatryanpeichl2017,nandiwarwick2020} notes that bunching at a VAT threshold can reflect compliance costs, firm-splitting, or reporting rather than real turnover responses. The third strand questions whether bunching identifies a structural elasticity at all: \citet{blomquistetal2021} show that the elasticity is not non-parametrically identified from bunching at a kink without strong functional-form assumptions, and \citet{bertanhaetal2023} make the analogous point for notches. This literature motivates my refusal to read a behavioural elasticity off the synthetic bunching: even setting aside the placebo evidence that the synthetic step is mechanical, the mapping from excess mass to an elasticity is not identified without assumptions I am unwilling to impose. The fourth strand is the structural literature on size-based thresholds \citep{garicano2016,gourioroys2014}, which identifies policy-invariant primitives at the French 50-employee threshold and computes welfare from them; the present paper makes no such structural claim, pricing reforms statically and, conditional on an assumed elasticity, behaviourally. This paper makes three contributions. First, it provides an open, reproducible firm-level microsimulation for costing UK VAT threshold reforms, where the existing firm-level evidence on the threshold rests on restricted administrative data; as part of this, I show transparently that the open data reproduce the published density step and use a placebo to establish that the step is mechanical, so no behavioural bunching is claimed from the synthetic data. Second, it characterises the notch's distortion through its exact, model-free dominated region and costs two schedule reforms---a graduated taper and a reduced-rate band---on the same static basis as level reforms, where prior work has neither costed these reforms nor measured this distortion. Third, it prices these reforms behaviourally with a structural simulator that re-optimises each firm under each schedule, conditional on an assumed turnover elasticity, reported as a sensitivity range that nests the static costing in its zero-elasticity limit. Because the synthetic data do not identify the turnover elasticity, identifying it from administrative micro-data is what remains for future work; a welfare and marginal-value-of-public-funds accounting---together with revenue-neutral designs and the treatment of voluntary registration---are also left for later. +\textbf{Related literature.} The paper draws on and contributes to four strands of work. The first is the methodology of bunching and notches \citep{saez2010,klevenwaseem2013,chettyetal2011,kleven2016,best2015}, which provides the analytic notion of a dominated region; I use the dominated region to characterise a distortion that leaves no single point of excess mass to exploit. The second is the empirical literature on the VAT registration threshold \citep{liuetal2021,liulockwoodtam2024,onji2009,harju2019,asatryanpeichl2017,nandiwarwick2020,waseem2024}, which estimates the behavioural response and studies changes in the threshold's level. \citet{liuetal2021} is closest: it estimates bunching at the UK notch on administrative data and documents voluntary registration; I take its administrative estimate as the established behavioural fact, show that my open synthetic data reproduce the density step it documents, and cost shape and rate reforms statically on a common basis. The international evidence \citep{harju2019,onji2009,asatryanpeichl2017,nandiwarwick2020} notes that bunching at a VAT threshold can reflect compliance costs, firm-splitting, or reporting rather than real turnover responses. The third strand questions whether bunching identifies a structural elasticity at all: \citet{blomquistetal2021} show that the elasticity is not non-parametrically identified from bunching at a kink without strong functional-form assumptions, and \citet{bertanhaetal2023} make the analogous point for notches. This literature motivates my refusal to read a behavioural elasticity off the synthetic bunching: even setting aside the placebo evidence that the synthetic step is mechanical, the mapping from excess mass to an elasticity is not identified without assumptions I am unwilling to impose. The fourth strand is the structural literature on size-based thresholds \citep{garicano2016,gourioroys2014}, which identifies policy-invariant primitives at the French 50-employee threshold and computes welfare from them; the present paper makes no such structural claim, pricing reforms statically and, conditional on an assumed elasticity, behaviourally. This paper makes three contributions. First, it provides an open, reproducible firm-level microsimulation for costing UK VAT threshold reforms, where the existing firm-level evidence on the threshold rests on restricted administrative data; as part of this, I show transparently that the open data reproduce the published density step and use a placebo to establish that the step is mechanical, so no behavioural bunching is claimed from the synthetic data. Second, it characterises the notch's distortion through its exact, elasticity-free dominated region and costs two schedule reforms---a graduated taper and a reduced-rate band---on the same static basis as level reforms, where prior work has neither costed these reforms nor measured this distortion. Third, it prices these reforms behaviourally with a structural simulator that re-optimises each firm under each schedule, conditional on an assumed turnover elasticity, reported as a sensitivity range that nests the static costing in its zero-elasticity limit. Because the synthetic data do not identify the turnover elasticity, identifying it from administrative micro-data is what remains for future work; a welfare and marginal-value-of-public-funds accounting---together with revenue-neutral designs and the treatment of voluntary registration---are also left for later. The remainder of the paper proceeds as follows. Section~\ref{sec:background} describes the institutional background of the UK VAT threshold. Section~\ref{sec:data} sets out the synthetic firm microdata and its calibration to HMRC aggregates. Section~\ref{sec:static} sets out the static costing of threshold changes and the schedule reforms. Section~\ref{sec:bunching} reports the reduced-form bunching evidence. Section~\ref{sec:model} develops the notch and its exact dominated region, and shows how each reform changes it. Section~\ref{sec:behavioural} prices the reforms behaviourally with a structural simulator conditional on an assumed elasticity, reported as a sensitivity range that nests the static costing. Section~\ref{sec:conclusion} concludes. diff --git a/paper/Sections/model.tex b/paper/Sections/model.tex index 2ab428e..9b84f5f 100644 --- a/paper/Sections/model.tex +++ b/paper/Sections/model.tex @@ -12,7 +12,7 @@ \section{The notch and its dominated region} \emph{notch}, not a kink: once turnover crosses the threshold the firm becomes liable for VAT on its \emph{entire} turnover, not merely on the increment above it. I model this notch exactly. The section's central deliverable is the notch's -\emph{dominated region}---an exact, model-free accounting identity that indexes the +\emph{dominated region}---an exact, elasticity-free accounting identity that indexes the distortion the threshold imposes (Section~\ref{ssec:dominated}), whose analytic response to each schedule reform complements the static reform costs of Section~\ref{ssec:schedule_costs}. The dominated region is a transparent, @@ -76,17 +76,29 @@ \subsection{The dominated region} $(T^{*},\,T^{*}+a)=(\pounds85{,}000,\ \pounds106{,}250)$, shown in Figure~\ref{fig:notch_fit}. Two properties make this $\sim\pounds21$k band a transparent, parameter-free index of the distortion. -First, it is \emph{exact}: it depends on $\tau$ and $T^{*}$ alone and is -independent of the cost specification, of any behavioural elasticity, and of any -smoothing parameter. Second, it is an order of magnitude wider than the -$\sim\pounds1$k region implied by a smoothed \emph{kink} approximation. The band -also spans a populous part of the firm distribution: about $137{,}000$ weighted -firms in the synthetic population lie in the $\pounds85{,}000$--$\pounds106{,}250$ -dominated band, so the identity ranges over a heavily populated stretch of -turnover rather than an empty tail. The $15\%$ and $10\%$ reduced-rate bands -shrink the dominated zone to ranges containing about $96{,}500$ and $66{,}100$ -firms respectively. The dominated region stands alone as a theoretical property of -the schedule, independent of any reduced-form pattern in the data. +First, it is \emph{exact and elasticity-free}: it depends on $\tau$ and $T^{*}$ +alone and is independent of the cost specification, of any behavioural elasticity, +and of any smoothing parameter. It is, however, \emph{conditional on the +statutory-rate turnover notch}: the $\pounds21{,}250$ width is computed at the +statutory $\tau=0.20$ applied to whole turnover, and so applies to the +limited-reclaim, consumer-facing firms that are the scope of this model (the +``Scope: a turnover-tax notch'' paragraph above). For firms with substantial input +reclaim the effective notch---and hence its dominated region---is correspondingly +smaller. The width is thus independent of any behavioural elasticity but +conditional on the turnover-tax-notch scope. Second, it is an order of magnitude +wider than the $\sim\pounds1$k region implied by a smoothed \emph{kink} +approximation. The band also spans a populous part of the firm distribution: about +$137{,}000$ weighted firms in the synthetic population lie in the +$\pounds85{,}000$--$\pounds106{,}250$ dominated band. Because the synthetic +generator has no location choice, this counts the firms the data \emph{place} in +the band---indexing the size of the population exposed to the distortion---rather +than firms that \emph{optimally locate} there; the identity thus ranges over a +heavily populated stretch of turnover rather than an empty tail. The precise count +is, moreover, conditional on the uniform within-band fill used to resolve turnover +inside the coarse HMRC bands (Section~\ref{sec:data}) and would shift under a +different within-band shape; it is the width $a$, not this count, that is exact. The dominated +region stands alone as a theoretical property of the schedule, independent of any +reduced-form pattern in the data. \begin{figure}[htbp]\centering \includegraphics[width=0.78\textwidth]{figures/dynamic_notch_fit_e017.png} @@ -97,18 +109,45 @@ \subsection{The dominated region} \paragraph{How each reform changes the dominated region.} Because the width $a=T^{*}\tau/(1-\tau)$ depends on the threshold and the rate alone, the effect of each schedule reform of Section~\ref{ssec:schedule_costs} on this misallocation -zone is exact and follows directly from~\eqref{eq:dominated}, with no dependence on +zone is exact and follows directly from the notch arithmetic +of~\eqref{eq:dominated} and~\eqref{eq:dominated-secondary}, with no dependence on the cost specification, any behavioural elasticity, or any simulated re-optimisation. Raising the threshold to \pounds100{,}000 leaves the rate unchanged and therefore \emph{relocates} the zone without altering its width: it is the same \pounds21{,}250 band, transported to the new cutoff. A banded reduced -rate \emph{shrinks} the zone, because $a$ falls with $\tau$: at -$T^{*}=\pounds85{,}000$, lowering the band rate to $15\%$ cuts it to -$\pounds85{,}000\times0.15/0.85=\pounds15{,}000$, and to $10\%$ cuts it to -$\pounds85{,}000\times0.10/0.90=\pounds9{,}444$. A graduated taper has \emph{no} +rate does \emph{not} remove the distortion. It reduces the \emph{largest single} +notch---the jump at $T^{*}$ falls from $\tau T^{*}=\pounds17{,}000$ to +$r\,T^{*}=\pounds12{,}750$ at a $15\%$ band rate---but, because the band reverts to +the standard rate $\tau$ at its upper edge $T_{1}=\pounds105{,}000$, it introduces a +\emph{secondary} notch there, and hence a second dominated region the simple +``$a$ shrinks with $\tau$'' reasoning omits. The primary region at $T^{*}$ (the +band rate $r$ on whole turnover) has the usual width +$a=T^{*}r/(1-r)$: $\pounds85{,}000\times0.15/0.85=\pounds15{,}000$ at $15\%$ and +$\pounds85{,}000\times0.10/0.90=\pounds9{,}444$ at $10\%$. The secondary region at +the band top---where the schedule steps from $r$ back to $\tau$ on whole +turnover---has width +\begin{equation} + a' \;=\; T_{1}\,\frac{\tau-r}{1-\tau}, + \label{eq:dominated-secondary} +\end{equation} +giving $\pounds105{,}000\times0.05/0.80=\pounds6{,}562$ at $15\%$ and +$\pounds105{,}000\times0.10/0.80=\pounds13{,}125$ at $10\%$. The \emph{total} +dominated-turnover width is therefore $a+a'=\pounds21{,}562$ at $15\%$ and +$\pounds22{,}569$ at $10\%$---both marginally \emph{above} the $\pounds21{,}250$ +baseline, not below it. The reduced rate splits one wide empty band into two +narrower ones rather than shrinking the total: it lowers the largest single notch +(to $\pounds12{,}750$ at $15\%$) at the price of adding a secondary notch of +$(\tau-r)\,T_{1}=\pounds5{,}250$. The firm counts confirm this. The roughly +$96{,}500$ and $66{,}100$ weighted firms previously reported for the $15\%$ and +$10\%$ bands are the mass of the \emph{primary} region alone; the secondary region +above $\pounds105{,}000$ restores comparable dominated mass, so the total dominated +mass is not materially reduced. A graduated taper, by contrast, has \emph{no} notch and hence no dominated region: marginal net revenue declines smoothly through the band rather than off a cliff, so the band of dominated turnover---and with it -the discrete incentive to suppress turnover---is removed entirely. The dominated -region is thus the paper's exact, model-free measure of the distortion the notch -imposes, and the analytic statement above is exactly how much of that distortion -each reform of Section~\ref{ssec:schedule_costs} removes. +the discrete incentive to suppress turnover---is removed entirely. On the +dominated-region metric, then, \emph{only} the taper removes the distortion; the +reduced rate and the level move both leave it essentially intact---split and +relocated, respectively---which sharpens the taper's advantage. The dominated +region is thus the paper's exact, elasticity-free measure of the distortion the +notch imposes, and the analytic statement above is exactly how much of that +distortion each reform of Section~\ref{ssec:schedule_costs} removes. diff --git a/paper/Sections/static.tex b/paper/Sections/static.tex index 9010ddc..bdc79bb 100644 --- a/paper/Sections/static.tex +++ b/paper/Sections/static.tex @@ -20,21 +20,28 @@ \section{Static costing of threshold reforms} where $T_{\min}=\min(T,T_0)$ and $T_{\max}=\max(T,T_0)$: lowering the threshold draws firms into the net and raises revenue, while raising it releases firms and loses revenue. The estimate is therefore the mechanical reclassification effect and -excludes the behavioural response of Section~\ref{sec:bunching}. The calibrated +excludes the behavioural response of Section~\ref{sec:behavioural}. The calibrated weights reproduce HMRC's net VAT-liability totals (Section~\ref{sec:data}), and I age the microdata to a given fiscal year by a cumulative nominal-growth factor. At the \pounds90{,}000 threshold this puts total VAT revenue at \pounds203.8bn in -2025--26 and \pounds210.0bn in 2026--27. +2025--26 and \pounds210.0bn in 2026--27.\footnote{This \pounds203.8bn aggregate is +the weighted sum of the synthetic registered population's net VAT liabilities +(output less input VAT) aged to 2025--26---a theoretical-liability (VTTL-style) +base, not the published cash-receipts line. It therefore sits above published net +cash VAT receipts (around \pounds169bn in 2023--24, and an OBR forecast near +\pounds180bn for 2025--26), which are reduced relative to the theoretical liability +by refunds and repayments, the VAT gap, and collection timing.} \paragraph{Consistency check against HMRC.} I first check the static pipeline against HMRC's own costing of the April~2024 increase from \pounds85{,}000 to -\pounds90{,}000. Because my microdata are calibrated to HMRC VAT aggregates +\pounds90{,}000, which was announced and costed at Spring Budget 2024 +\citep{hmt_spring_budget_2024}. Because my microdata are calibrated to HMRC VAT aggregates (Section~\ref{sec:data}), a close match confirms internal consistency rather than out-of-sample accuracy. Figure~\ref{fig:hmrc_validation} compares the two costings year by year: they share sign and profile throughout---a loss that narrows as fiscal drag lifts the frozen baseline towards the reformed threshold, turning to a small gain by 2028--29---and agree to within \pounds7m--\pounds21m per year (for -2025--26, \(-\)\pounds175m against HMRC's \(-\)\pounds185m). The model reproduces +2025--26, \(-\)\pounds175m against the published \(-\)\pounds185m). The model reproduces both the magnitude and the turning point of the official costing. \begin{figure}[htbp] @@ -59,16 +66,19 @@ \section{Static costing of threshold reforms} extrapolation of the clean above-threshold profile rather than the raw below-threshold mass. Lowering the threshold draws firms in and raises revenue; raising it loses revenue. The schedule is approximately linear, with a mild -convexity as the threshold sweeps into denser parts of the distribution---each -\pounds5{,}000 step changes revenue by roughly \pounds150m--\pounds220m, with the -marginal effect growing as the threshold sweeps across denser parts of the -distribution. Even a \pounds30{,}000 +convexity driven by the higher individual VAT liabilities of higher-turnover +firms---each \pounds5{,}000 step changes revenue by roughly +\pounds150m--\pounds220m, and the marginal revenue per step grows +(\pounds183.5m\,$\to$\,\pounds218.1m as the threshold rises) even though the number +of firms reclassified per step falls (from about $18{,}600$ to about $16{,}200$), +because each firm released at a higher threshold remits more VAT. Even a +\pounds30{,}000 rise to \pounds120{,}000 costs about \pounds1.2bn, under $0.6\%$ of the \pounds203.8bn base, because the threshold governs many small firms whose individual liabilities are small. Figure~\ref{fig:static_sweep} shows the sweep graphically. These are \emph{static} results: they bound the first-order fiscal effect of a threshold change but abstract from the behavioural response of -Section~\ref{sec:bunching}. +Section~\ref{sec:behavioural}. \begin{table}[htbp] \centering @@ -109,8 +119,10 @@ \section{Static costing of threshold reforms} \caption{Static effect of moving the VAT registration threshold, 2025--26, relative to the \pounds90{,}000 baseline (dashed line). Panel (a): revenue impact---lowering the threshold raises revenue, raising it loses revenue, and the schedule is -approximately linear, with a mild convexity as the threshold sweeps into denser -parts of the distribution, over the \pounds70{,}000--\pounds120{,}000 range. Panel (b): the +approximately linear, with a mild convexity driven by the higher individual VAT +liabilities of higher-turnover firms---the marginal revenue per \pounds5{,}000 step +grows even as the number of firms reclassified per step falls---over the +\pounds70{,}000--\pounds120{,}000 range. Panel (b): the change in the number of VAT-paying firms, tracking the local density of firms on each side of the threshold.} \label{fig:static_sweep} @@ -128,7 +140,9 @@ \subsection{Costing schedule reforms} differs from the \pounds203.8bn figure in the sweep above, which ages the same microdata to the 2025--26 fiscal year at the post-reform \pounds90{,}000 threshold; the schedule reforms are costed in the data year to match the bunching and -dominated-region analysis.) For each reform I recompute +dominated-region analysis. Both \pounds183.6bn and \pounds203.8bn are +theoretical-liability (VTTL-style) bases in the sense of the footnote above, not +cash-receipts lines.) For each reform I recompute the weighted sum of liabilities $R = \sum_i w_i\, v_i$ under the new schedule, holding each firm's turnover fixed, and difference it against the baseline. @@ -177,7 +191,7 @@ \subsection{Costing schedule reforms} \end{table} These static figures bound the first-order fiscal effect of each reform but -abstract from the behavioural response of Section~\ref{sec:bunching}. One feature +abstract from the behavioural response of Section~\ref{sec:behavioural}. One feature of the shape reforms is not visible in a static costing: unlike a threshold move, which simply transports the notch to a new cutoff, the taper and the reduced rate \emph{change the size of the notch itself}---the discrete drop in net revenue at the diff --git a/paper/body.tex b/paper/body.tex index 1e37c7d..d7bc20d 100644 --- a/paper/body.tex +++ b/paper/body.tex @@ -1,22 +1,24 @@ \input{Sections/intro} \input{Sections/background} % literature folded into the introduction (IJM weaves the literature into the intro); -% Sections/literature.tex retained in the repo if a standalone review is wanted later. -% \input{Sections/literature} +% a standalone review is kept in paper/future/literature.tex if wanted later. +% \input{future/literature} \input{Sections/data} \input{Sections/static} \input{Sections/bunching} \input{Sections/model} \input{Sections/behavioural} -% Deferred to future work (kept in paper/future/): the structural calibration -% (calibration.tex), the reform-menu/ranking results (results.tex), and -% the smooth-notch appendix (a_notch.tex). The paper keeps the open microsim, -% static costing, bunching evidence, the exact dominated region, and the -% conditional behavioural costing (Sections/behavioural). What remains for -% future work is identifying the turnover elasticity from administrative -% micro-data, since on the synthetic data it is assumed, not identified. -% \input{Sections/calibration} -% \input{Sections/results} +% Deferred to future work (kept in paper/future/): the standalone literature +% review (literature.tex), the structural calibration (calibration.tex), the +% reform-menu/ranking results (results.tex) and their counterfactuals +% (counterfactuals.tex), and the smooth-notch appendix (a_notch.tex). The paper +% keeps the open microsim, static costing, bunching evidence, the exact dominated +% region, and the conditional behavioural costing (Sections/behavioural). What +% remains for future work is identifying the turnover elasticity from +% administrative micro-data, since on the synthetic data it is assumed, not +% identified. +% \input{future/calibration} +% \input{future/results} \input{Sections/conclusion} \newpage diff --git a/paper/Sections/counterfactuals.tex b/paper/future/counterfactuals.tex similarity index 100% rename from paper/Sections/counterfactuals.tex rename to paper/future/counterfactuals.tex diff --git a/paper/Sections/literature.tex b/paper/future/literature.tex similarity index 100% rename from paper/Sections/literature.tex rename to paper/future/literature.tex diff --git a/paper/Sections/results.tex b/paper/future/results.tex similarity index 100% rename from paper/Sections/results.tex rename to paper/future/results.tex diff --git a/paper/main.pdf b/paper/main.pdf index c8399a5..ca25464 100644 Binary files a/paper/main.pdf and b/paper/main.pdf differ diff --git a/paper/references.bib b/paper/references.bib index 1666431..fa6f297 100644 --- a/paper/references.bib +++ b/paper/references.bib @@ -219,3 +219,10 @@ @article{keenmintz2004 pages = {559--576}, year = {2004} } + +@misc{hmt_spring_budget_2024, + author = {{HM Treasury}}, + title = {Spring Budget 2024: Policy Costings}, + howpublished = {HM Treasury, March 2024, \url{https://www.gov.uk/government/publications/spring-budget-2024-documents}}, + year = {2024} +} diff --git a/src/firm_microsim/analysis/dominated_region_mass.py b/src/firm_microsim/analysis/dominated_region_mass.py index a3f93e8..08908db 100644 --- a/src/firm_microsim/analysis/dominated_region_mass.py +++ b/src/firm_microsim/analysis/dominated_region_mass.py @@ -52,6 +52,11 @@ ("10% band", 0.10), ] +# Reduced-rate band runs [T*, T*+BAND_WIDTH]; at the band top it reverts to the +# standard rate tau, creating a SECOND notch whose dominated width is +# a' = T1 * (tau - r) / (1 - tau), T1 = T* + BAND_WIDTH. +REDUCED_RATE_BAND_WIDTH = 20.0 # £k (band [85k, 105k] in the paper) + def mass_in_band(centres, density, lo, hi, bin_width=BIN_WIDTH): """Integrate a binned density over [lo, hi) -> weighted firm count. @@ -106,6 +111,24 @@ def main() -> None: "net": cf - obs, # net missing (displaced) mass in band }) + # --- Secondary dominated region at the reduced-rate band top ------------ + # A banded reduced rate reverts to the standard rate tau at the band top + # T1, creating a SECOND notch with dominated width a' = T1*(tau-r)/(1-tau). + # The total dominated turnover under a reduced rate is primary + secondary. + band_top = t_star + REDUCED_RATE_BAND_WIDTH # £105k + sec_rows = [] + for label, tau_r in RATE_VARIANTS[1:]: # 15% and 10% only + a_sec = band_top * (TAU - tau_r) / (1.0 - TAU) + lo, hi = band_top, band_top + a_sec + obs = mass_in_band(centres, f_obs, lo, hi) + cf = mass_in_band(centres, f_cf, lo, hi) + prim = next(r for r in rows if r["tau"] == tau_r) + sec_rows.append({ + "label": label, "tau": tau_r, "a_sec": a_sec, + "lo": lo, "hi": hi, "obs": obs, "cf": cf, + "prim_obs": prim["obs"], "total_obs": prim["obs"] + obs, + }) + # Baseline (20%) is the paper's actual dominated region. base = rows[0] @@ -164,6 +187,17 @@ def main() -> None: W(f" 10% -> band width GBP {rows[2]['a']*1000:,.0f}: net displaced = {rows[2]['net']:,.0f} firms" f" (CF total {rows[2]['cf']:,.0f})") W("") + W(f"SECONDARY NOTCH at the reduced-rate band top (T1 = GBP {band_top*1000:,.0f}):") + W(" A banded reduced rate reverts to tau=20% at T1, adding a SECOND") + W(" dominated region a' = T1*(tau-r)/(1-tau). Total dominated turnover and") + W(" mass = primary [T*, T*+a] + secondary [T1, T1+a'].") + for s in sec_rows: + W(f" {s['label']:<9} secondary [{s['lo']:.0f}, {s['hi']:.3f}) " + f"width GBP {s['a_sec']*1000:,.0f} OBS = {s['obs']:,.0f}") + W(f" primary OBS {s['prim_obs']:,.0f} + secondary OBS {s['obs']:,.0f}" + f" = TOTAL {s['total_obs']:,.0f} (baseline {base['obs']:,.0f}," + f" {100*(s['total_obs']/base['obs']-1):+.1f}%)") + W("") W("CONSISTENCY CHECK vs paper's reduced-form bunching:") W(f" excess mass below T* E = {E:,.0f} firms") W(f" missing mass above T* Delta_R = {Delta_R:,.0f} firms") diff --git a/src/firm_microsim/calibration.py b/src/firm_microsim/calibration.py index fee8a49..2ec2c8f 100644 --- a/src/firm_microsim/calibration.py +++ b/src/firm_microsim/calibration.py @@ -25,7 +25,7 @@ import torch from torch import Tensor -from .config import Config +from .config import Config, STANDARD_VAT_RATE logger = logging.getLogger(__name__) @@ -203,8 +203,10 @@ def build_target_matrix( row = spec.employment_start + band_idx target_matrix[row, employment_band_indices == band_idx] = 1.0 - # VAT liability (£k) per firm = turnover - input. - vat_liability_values = turnover_values - input_values + # Net VAT liability (£k) per firm = standard rate * value added + # = STANDARD_VAT_RATE * (turnover - input). This matches the HMRC + # net-VAT-liability targets, which are net of input reclaim. + vat_liability_values = STANDARD_VAT_RATE * (turnover_values - input_values) # VAT-liability-by-sector targets (weight firms by their liability). for offset, (_, vat_row) in enumerate(vat_liability_sector_rows.iterrows()): diff --git a/src/firm_microsim/config.py b/src/firm_microsim/config.py index dd34b59..7196acc 100644 --- a/src/firm_microsim/config.py +++ b/src/firm_microsim/config.py @@ -68,6 +68,12 @@ def _default_repo_root() -> Path: } DEFAULT_VINTAGE: str = os.environ.get("DATA_VINTAGE", "2023-24") +# Standard UK VAT rate. A registered firm's net VAT liability is this rate +# applied to its value added (turnover less inputs): +# v_i = STANDARD_VAT_RATE * (turnover_i - inputs_i). +# This is the single place the rate is set. +STANDARD_VAT_RATE: float = 0.20 + # Processed input file names (placed in PROCESSED_DATA_DIR by an upstream # ETL process). These map onto the original ONS + HMRC official tables. INPUT_FILES: Dict[str, str] = { diff --git a/src/firm_microsim/dynamic/model.py b/src/firm_microsim/dynamic/model.py index f09ae67..c90fa53 100644 --- a/src/firm_microsim/dynamic/model.py +++ b/src/firm_microsim/dynamic/model.py @@ -51,9 +51,10 @@ REVENUE CONVENTION ------------------ -The stored net VAT remittance ``liab`` is NOT ``0.20 * turnover`` — it is -output-minus-input VAT (a firm-specific net rate ``liab/y_obs`` averaging ~3% -of turnover). Under a reform schedule that scales the standard rate by a +The stored net VAT remittance ``liab`` is NOT ``0.20 * turnover`` — it is the +standard rate applied to value added, ``0.20 * (turnover - input)`` (a +firm-specific net rate ``liab/y_obs`` of roughly 8% of turnover, i.e. +``0.20 * value-added-share``). Under a reform schedule that scales the standard rate by a fraction ``f(y) in [0,1]`` over the band, a registered firm's reform remittance is ``liab * (y_star / y_obs) * f(y_star)``: the firm's net VAT-to-turnover ratio is held fixed, turnover is re-optimised to ``y_star`` (iso-elastic response), diff --git a/src/firm_microsim/generate.py b/src/firm_microsim/generate.py index d47bce6..ba586e7 100644 --- a/src/firm_microsim/generate.py +++ b/src/firm_microsim/generate.py @@ -50,7 +50,7 @@ build_target_matrix, optimize_weights, ) -from .config import Config, DEFAULT_CONFIG +from .config import Config, DEFAULT_CONFIG, STANDARD_VAT_RATE from .data_loader import LoadedData, load_data from .validate import ValidationReport, validate @@ -138,9 +138,12 @@ def generate_input_values( ) -> Tensor: """Draw per-firm input expenditure (£k) from Beta input/output ratios. - Most firms get inputs at 60-95% of turnover (positive VAT liability); - sector-specific shifts allow some firms inputs > turnover (negative - liability), matching HMRC's negative net-liability sectors. + The input/output ratio is centred near 0.6 (value added ~40% of turnover, + in line with the UK non-financial business economy) with sector-specific + shifts, and clamped to [0.1, 0.95] so value added is always strictly + positive. Net VAT liability is then the standard rate applied to value + added (see :func:`generate_synthetic_firms`); the model is a standard-rate + turnover-tax approximation and does not represent net-repayment positions. Args: turnover_values: Per-firm turnover (£k). @@ -154,7 +157,7 @@ def generate_input_values( n_firms = len(turnover_values) base_ratios = torch.distributions.Beta(4.0, 2.0).sample((n_firms,)).to(device) - scaled = 0.3 + base_ratios * 1.0 # map [0,1] -> [0.3, 1.3] + scaled = 0.2 + base_ratios * 0.6 # map [0,1] -> [0.2, 0.8]; Beta(4,2) mean -> 0.6 sector_noise = torch.randn(n_firms, device=device) * 0.15 sic_np = sic_codes.cpu().numpy() @@ -166,21 +169,23 @@ def generate_input_values( scaled = scaled + neg_t.float() * (torch.rand(n_firms, device=device) * 0.3) scaled = scaled - high_t.float() * (torch.rand(n_firms, device=device) * 0.2) - # Floor the input/output ratio at 0.6 (value-added <= 40% of turnover). - # A lower floor lets a few firms get implausibly low input (VA up to 90% - # of turnover), which both produces unrealistic per-firm VAT liabilities - # and lets the weight optimiser concentrate huge weights on those outliers - # to hit the liability targets — distorting the near-threshold density and - # the static threshold sweep. 0.6 matches the documented 60-95% intent. - final_ratios = torch.clamp(scaled + sector_noise, 0.6, 1.5) + # Clamp the input/output ratio to [0.1, 0.95]: value added is always + # strictly positive (between 5% and 90% of turnover), so no firm has inputs + # exceeding turnover. The upper bound 0.95 rules out negative net VAT + # liability (the model is a standard-rate approximation that abstracts from + # net-repayment positions); the lower bound 0.1 prevents implausibly high + # value added that the weight optimiser could exploit with outlier weights. + final_ratios = torch.clamp(scaled + sector_noise, 0.1, 0.95) input_values = torch.where( turnover_values > 0, turnover_values * final_ratios, torch.zeros_like(turnover_values) ) logger.info( - "Input/output ratio: mean=%.2f std=%.2f; firms with negative VAT liability: %s", + "Input/output ratio: mean=%.2f std=%.2f; mean value-added share=%.2f; " + "firms with negative value added: %s", final_ratios.mean().item(), final_ratios.std().item(), + (1.0 - final_ratios).mean().item(), f"{int((final_ratios > 1.0).sum().item()):,}", ) return input_values @@ -427,7 +432,7 @@ def generate( "sic_code": [str(s).zfill(5) for s in sic_np], "annual_turnover_k": turnover_np, "annual_input_k": input_np, - "vat_liability_k": turnover_np - input_np, + "vat_liability_k": STANDARD_VAT_RATE * (turnover_np - input_np), "employment": employment.cpu().numpy().astype(int), "weight": final_weights.cpu().numpy(), "vat_registered": vat_flags.cpu().numpy().astype(bool), diff --git a/src/firm_microsim/validate.py b/src/firm_microsim/validate.py index 291660d..42f3d01 100644 --- a/src/firm_microsim/validate.py +++ b/src/firm_microsim/validate.py @@ -18,7 +18,7 @@ import pandas as pd from .calibration import EMPLOYMENT_BANDS, VAT_LIABILITY_BANDS -from .config import Config +from .config import Config, STANDARD_VAT_RATE from .data_loader import LoadedData logger = logging.getLogger(__name__) @@ -127,7 +127,7 @@ def validate( threshold = config.vat_threshold df = synthetic_df.copy() df["hmrc_band"] = df["annual_turnover_k"].apply(lambda t: _hmrc_band_name(t, threshold)) - df["vat_liability_k"] = df["annual_turnover_k"] - df["annual_input_k"] + df["vat_liability_k"] = STANDARD_VAT_RATE * (df["annual_turnover_k"] - df["annual_input_k"]) df["sic_numeric"] = df["sic_code"].astype(int) df["weighted_liability_m"] = df["vat_liability_k"] * df["weight"] / 1000.0 all_bands = df.groupby("hmrc_band")["weight"].sum()