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

1from HARK.distributions import Bernoulli, Lognormal, MeanOneLogNormal 

2from HARK.model import Control, DBlock, RBlock 

3 

4""" 

5Blocks for consumption saving problem (not normalized) 

6in the style of Carroll's "Solution Methods for Solving 

7Microeconomic Dynamic Stochastic Optimization Problems" 

8""" 

9 

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} 

22 

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) 

41 

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) 

58 

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) 

72 

73tick_block = DBlock( 

74 **{ 

75 "name": "tick", 

76 "dynamics": { 

77 "k": lambda a: a, 

78 }, 

79 } 

80) 

81 

82cons_problem = RBlock(blocks=[consumption_block, tick_block]) 

83cons_portfolio_problem = RBlock(blocks=[consumption_block, portfolio_block, tick_block])