PriceRaw=EIA(PET.F000000__3.M) OutputRaw=EIA(PET.MCRFPUS2.M) StocksRaw=EIA(PET.MCRSTUS1.M) Raw=SAME_DATE_RANGE(OutputRaw,INDPRO,PriceRaw,StocksRaw,CPIAUCSL) Output=SET_NAME(GET_SERIES(Raw,0),"US crude production") Activity=SET_NAME(GET_SERIES(Raw,1),"US industrial production") RealPrice=SET_NAME(GET_SERIES(Raw,2)/GET_SERIES(Raw,4),"Real US crude price") Stocks=SET_NAME(GET_SERIES(Raw,3),"US crude stocks including SPR") USLevels=SERIES_BETWEEN(SAME_DATE_RANGE(LOG(Output),LOG(Activity),LOG(RealPrice),LOG(Stocks)),19750101,20191231) EC=VECM_MODEL(USLevels,13,1) EC12=VECM_MODEL(USLevels,12,1) FitSlides=EXTRACT(EC,"slideshow") Rank13=EXTRACT(EC,"rank_test") Rank12=EXTRACT(EC12,"rank_test") UnitRoots=EXTRACT(EC,"unit_root") LagSearch=EXTRACT(EC,"lag_selection:24") ResidualCheck=EXTRACT(EC,"autocorrelation:36") RootCheck=EXTRACT(EC,"stability") EQ=DSGE_MODEL() EQ=ADD_DSGE_SHOCK(EQ,"EPS_SUPPLY") EQ=ADD_DSGE_SHOCK(EQ,"EPS_ACTIVITY") EQ=ADD_DSGE_SHOCK(EQ,"EPS_DEMAND") EQ=ADD_DSGE_SHOCK(EQ,"EPS_INVENTORY") EQ=ADD_DSGE_EQUATION(EQ,"KS=0.962*LAG(KS,1)+0.01938*LAG(RS,1)") EQ=ADD_DSGE_EQUATION(EQ,"KD=0.967*LAG(KD,1)+0.00627*LAG(RD,1)") EQ=ADD_DSGE_EQUATION(EQ,"Q=0.01*P+KS+ZS") EQ=ADD_DSGE_EQUATION(EQ,"C=Y-0.26*P-KD+ZD") EQ=ADD_DSGE_EQUATION(EQ,"V=0.46*(0.87*LEAD(P,1)-P)+ZV") EQ=ADD_DSGE_EQUATION(EQ,"V-LAG(V,1)=Q-C") EQ=ADD_DSGE_EQUATION(EQ,"Y=0.9*LAG(Y,1)-0.005*P+ZA") EQ=ADD_DSGE_EQUATION(EQ,"ZS=0.9*LAG(ZS,1)-0.01*EPS_SUPPLY") EQ=ADD_DSGE_EQUATION(EQ,"ZA=0.9*LAG(ZA,1)+0.01*EPS_ACTIVITY") EQ=ADD_DSGE_EQUATION(EQ,"ZD=0.9*LAG(ZD,1)+0.01*EPS_DEMAND") EQ=ADD_DSGE_EQUATION(EQ,"ZV=0.9*LAG(ZV,1)+0.01*EPS_INVENTORY") EQ=ADD_DSGE_EQUATION(EQ,"RS=0.04121741533708234*LEAD(P,1)+0.9587825846629177*LEAD(RS,1)") EQ=ADD_DSGE_EQUATION(EQ,"RD=0.03623413787001928*LEAD(P,1)+0.9637658621299807*LEAD(RD,1)") EQ=COMPILE_DSGE(EQ) EQ=CONFIGURE(EQ,"IMPULSE_HORIZON",120) EQ=SOLVE_DSGE(EQ) EQFlat=DSGE_MODEL() EQFlat=ADD_DSGE_SHOCK(EQFlat,"EPS_SUPPLY") EQFlat=ADD_DSGE_SHOCK(EQFlat,"EPS_ACTIVITY") EQFlat=ADD_DSGE_SHOCK(EQFlat,"EPS_DEMAND") EQFlat=ADD_DSGE_SHOCK(EQFlat,"EPS_INVENTORY") EQFlat=ADD_DSGE_EQUATION(EQFlat,"KS=0.962*LAG(KS,1)+0*LAG(RS,1)") EQFlat=ADD_DSGE_EQUATION(EQFlat,"KD=0.967*LAG(KD,1)+0.00627*LAG(RD,1)") EQFlat=ADD_DSGE_EQUATION(EQFlat,"Q=0.01*P+KS+ZS") EQFlat=ADD_DSGE_EQUATION(EQFlat,"C=Y-0.26*P-KD+ZD") EQFlat=ADD_DSGE_EQUATION(EQFlat,"V=0.46*(0.87*LEAD(P,1)-P)+ZV") EQFlat=ADD_DSGE_EQUATION(EQFlat,"V-LAG(V,1)=Q-C") EQFlat=ADD_DSGE_EQUATION(EQFlat,"Y=0.9*LAG(Y,1)-0.005*P+ZA") EQFlat=ADD_DSGE_EQUATION(EQFlat,"ZS=0.9*LAG(ZS,1)-0.01*EPS_SUPPLY") EQFlat=ADD_DSGE_EQUATION(EQFlat,"ZA=0.9*LAG(ZA,1)+0.01*EPS_ACTIVITY") EQFlat=ADD_DSGE_EQUATION(EQFlat,"ZD=0.9*LAG(ZD,1)+0.01*EPS_DEMAND") EQFlat=ADD_DSGE_EQUATION(EQFlat,"ZV=0.9*LAG(ZV,1)+0.01*EPS_INVENTORY") EQFlat=ADD_DSGE_EQUATION(EQFlat,"RS=0.04121741533708234*LEAD(P,1)+0.9587825846629177*LEAD(RS,1)") EQFlat=ADD_DSGE_EQUATION(EQFlat,"RD=0.03623413787001928*LEAD(P,1)+0.9637658621299807*LEAD(RD,1)") EQFlat=COMPILE_DSGE(EQFlat) EQFlat=CONFIGURE(EQFlat,"IMPULSE_HORIZON",120) EQFlat=SOLVE_DSGE(EQFlat) Opening=TEXT_SLIDE("Replication improves the tools","A selective exercise inspired by Houssa and Mohimont, Oil Prices and Global Activity in a General Equilibrium Model with Dynamic Elasticities, 15 October 2026.","The data models below use US substitutes over January 1975 to December 2019. The calibrated oil-market subsystem is an educational scenario model; it does not reproduce the authors' full RBC model, Bayesian estimation or historical shock decomposition.") Methods=TEXT_SLIDE("VECM: levels, changes and diagnostics","EC uses four log-level variables and rank one. Its levels VAR order 13 includes 12 lagged differences. EC12 uses 11 lagged differences; compare the rank tests.","Fitted values are in-sample monthly log changes, not fitted price levels or out-of-sample forecasts. The data use current revisions. EIA oil series are not seasonally adjusted; INDPRO and CPI are.","Native tests select rank one at order 13 and rank two at order 12. At order 13 residual whiteness is rejected (p about 0.000832), despite stable transient roots. Inventory integration, seasonality and structural change need further study.") ScenarioNotes=TEXT_SLIDE("How to read the shocks","P is real oil price, Q production, C consumption, V inventories and Y a simplified activity measure. Responses are log deviations; 0.01 is approximately one percent. Month zero is the impact month.","Supply, consumption-demand, activity and inventory shifters each have persistence 0.9. Shock magnitudes are 0.01 in their own shifter units. They are not equally sized observed GDP or production changes.","Supply elasticity rises from 0.01 to 0.52; demand moves from -0.26 to -0.45. The flat-supply comparison keeps supply elasticity at 0.01. The activity equation is our simplifying closure, not the paper's household-and-capital block.","Equal-sized supply and consumption-demand shifters have the same price path in this simplified model. The solver checks a stable solution but does not test Blanchard-Kahn determinacy. These are illustrative mechanisms, not identified historical shocks.") Solver=EXTRACT(EQ,"solver_summary") SupplyShock=SET_TITLE(EXTRACT(EQ,"impulse_response_chart_EPS_SUPPLY"),"Illustrative adverse supply shock") DemandShock=SET_TITLE(EXTRACT(EQ,"impulse_response_chart_EPS_DEMAND"),"Illustrative consumption-demand shock") ActivityShock=SET_TITLE(EXTRACT(EQ,"impulse_response_chart_EPS_ACTIVITY"),"Illustrative activity-driver shock") InventoryShock=SET_TITLE(EXTRACT(EQ,"impulse_response_chart_EPS_INVENTORY"),"Illustrative inventory-demand shock") FlatSupplyShock=SET_TITLE(EXTRACT(EQFlat,"impulse_response_chart_EPS_SUPPLY"),"Adverse supply shock with flat supply elasticity") SLIDE(Opening,Methods,Rank12,Rank13,UnitRoots,LagSearch,ResidualCheck,RootCheck,FitSlides,ScenarioNotes,Solver,SupplyShock,DemandShock,ActivityShock,InventoryShock,FlatSupplyShock)