Recent Posts

Wednesday, October 26, 2016

Building A SFC Model In Python

This article demonstrates the first basic application of my Stock-Flow Consistent (SFC) models package in Python: sfc_models. The code is under construction, and needs to be extended in many directions. However, with the core functionality built, adding new analytic capabilities should be straightforward. In this article, I explain how to implement the simplest SFC model -- Model SIM ("SIMplest") -- from Chapter 3 of Godley and Lavoie's Monetary Economics. The key advantage of my library is that the user just specifies the high level description of the sectors of the economy, and the package generates the underlying equations.

Model SIM


Flows in Model SIM.
The model SIM is the simplest of the models in Godley and Lavoie. I needed to find external validation of the equations generated by my package, and so this was the first real test. (I have extensive unit tests of the code of the individual sectors, but we need to validate that the framework stitches the sectors together in a way that generates equations that can be solved numerically.)

The model consists of three sectors. The Household and Business sectors are tied together by the labour and goods (final output) markets, while government activity just consists of an externally set ("exogenous") demand for goods.

I have already used this model as an example multiple times, so I will not repeat the background information.If you are unfamiliar with this model, please see:


sfc_models Package Installation

Installation instructions are found here.  (If you are familiar with Python, pip install sfc_models works.)

Model Creation

The code to set up model SIM is as follows:

The package generates a rather impressive set of equations for such a simple model.

GOV_F = GOV_LAG_F +GOV_T -GOV_DEM_GOOD    
GOV_FISC_BAL = GOV_T -GOV_DEM_GOOD   
GOV_LAG_F = GOV_F (k -1 )          
GOV_T = TF_T          .
HH_AfterTax = HH_PreTax -HH_T          
HH_AlphaFin = 0.4000       
HH_AlphaIncome = 0.6000     
HH_DEM_GOOD = HH_AlphaIncome *HH_AfterTax +HH_AlphaFin *HH_LAG_F   
HH_F = HH_LAG_F -HH_T +HH_SUP_LAB -HH_DEM_GOOD  
HH_LAG_F = HH_F (k -1 )     
HH_PreTax = HH_SUP_LAB         
HH_SUP_LAB = BUS_DEM_LAB   
HH_T = TF_TaxRate *HH_PreTax   
BUS_DEM_LAB = GOOD_SUP_GOOD 
BUS_F = BUS_LAG_F -BUS_DEM_LAB +BUS_SUP_GOOD 
BUS_LAG_F = BUS_F (k -1 )            
BUS_SUP_GOOD = GOV_DEM_GOOD +HH_DEM_GOOD    
TF_T = TF_TaxRate *HH_PreTax   
TF_TaxRate = 0.2000                    
LAB_DEM_LAB = BUS_DEM_LAB    
LAB_SUP_LAB = LAB_DEM_LAB        
GOOD_DEM_GOOD = GOV_DEM_GOOD +HH_DEM_GOOD   
GOOD_SUP_GOOD = GOOD_DEM_GOOD    
# Exogenous variable
GOV_DEM_GOOD =  [20. ,]*105  # (=20. for time 0 -> 104)

The beauty of the sfc_models package is that the algorithm generates the equations, and not the user. This greatly reduces the tedium and risk of error when generating a large SFC model. For example, a multi-country SFC model will have multiple goods and sectors, which creates an extremely large number of variables that look similar, but have to be carefully tracked.

Equation Solution



The chart above is generated by running following code (which requires the matlibplot package):


import out_SIM_Machine_Model
from sfc_models.examples.Quick2DPlot import Quick2DPlot

obj = out_SIM_Machine_Model.SFCModel()
obj.main()
obj.WriteCSV('out_SIM_Machine_Model.csv')
Quick2DPlot(obj.t, obj.GOOD_SUP_GOOD, 'Goods supplied (national production Y)')

The model solution is done within another file ("out_SIM_Machine_Model.py") which was machine-generated. Although this is somewhat eccentric, it was the safest (and most efficient) way of allowing for fairly general equation forms.

The module sfc_models.examples.scripts.build_SIM_model.py does all the steps involved in building the model.

Next Steps

In order to be more interesting, the sfc_models package will need to add support for more complicated interactions between sectors. I want to finish off my next book ("Abolish Money!"), and will then turn more attention to that task.

(c) Brian Romanchuk 2016

No comments:

Post a Comment

Note: Posts may be moderated, and there may be a considerable delay before they appear.

Although I welcome people who disagree with me, please be civil.

Please note that my spam comment filter appears to dislike long "anonymous" posts. I get no warning about this, and only go through my "spambox" infrequently. The best bet it to keep comments short, and if you think the spam filter struck, let me know with a short comment.