Coverage for HARK / models / consumer.py: 100%
10 statements
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-07 05:16 +0000
« prev ^ index » next coverage.py v7.12.0, created at 2025-12-07 05:16 +0000
1from HARK.distributions import Bernoulli, Lognormal, MeanOneLogNormal
2from HARK.model import Control, DBlock, RBlock
4"""
5Blocks for consumption saving problem (not normalized)
6in the style of Carroll's "Solution Methods for Solving
7Microeconomic Dynamic Stochastic Optimization Problems"
8"""
10calibration = {
11 "DiscFac": 0.96,
12 "CRRA": 2.0,
13 "R": 1.03, # note: this can be overriden by the portfolio dynamics
14 "Rfree": 1.03,
15 "EqP": 0.02,
16 "LivPrb": 0.98,
17 "PermGroFac": 1.01,
18 "BoroCnstArt": None,
19 "TranShkStd": 0.1,
20 "RiskyStd": 0.1,
21}
23consumption_block = DBlock(
24 **{
25 "name": "consumption",
26 "shocks": {
27 "live": (Bernoulli, {"p": "LivPrb"}), # Move to tick or mortality block?
28 "theta": (MeanOneLogNormal, {"sigma": "TranShkStd"}),
29 },
30 "dynamics": {
31 "b": lambda k, R: k * R,
32 "y": lambda p, theta: p * theta,
33 "m": lambda b, y: b + y,
34 "c": Control(["m"]),
35 "p": lambda PermGroFac, p: PermGroFac * p,
36 "a": lambda m, c: m - c,
37 },
38 "reward": {"u": lambda c, CRRA: c ** (1 - CRRA) / (1 - CRRA)},
39 }
40)
42consumption_block_normalized = DBlock(
43 **{
44 "name": "consumption normalized",
45 "shocks": {
46 "live": (Bernoulli, {"p": "LivPrb"}), # Move to tick or mortality block?
47 "theta": (MeanOneLogNormal, {"sigma": "TranShkStd"}),
48 },
49 "dynamics": {
50 "b": lambda k, R, PermGroFac: k * R / PermGroFac,
51 "m": lambda b, theta: b + theta,
52 "c": Control(["m"]),
53 "a": "m - c",
54 },
55 "reward": {"u": lambda c, CRRA: c ** (1 - CRRA) / (1 - CRRA)},
56 }
57)
59portfolio_block = DBlock(
60 **{
61 "name": "portfolio",
62 "shocks": {
63 "risky_return": (Lognormal, {"mean": "Rfree + EqP", "std": "RiskyStd"})
64 },
65 "dynamics": {
66 "stigma": Control(["a"]),
67 "R": lambda stigma, Rfree, risky_return: Rfree
68 + (risky_return - Rfree) * stigma,
69 },
70 }
71)
73tick_block = DBlock(
74 **{
75 "name": "tick",
76 "dynamics": {
77 "k": lambda a: a,
78 },
79 }
80)
82cons_problem = RBlock(blocks=[consumption_block, tick_block])
83cons_portfolio_problem = RBlock(blocks=[consumption_block, portfolio_block, tick_block])