Match Borrowing Choices to Formal Grid
back to Fan's Dynamic Assets Repository Table of Content.
Contents
function [ar_a_grid_ceil_principle, ar_a_grid_ceil_wthr, ... ar_a_grid_floor_principle, ar_a_grid_floor_wthr] = ffs_for_br_block_match(varargin)
FFS_FOR_BR_BLOCK_MATCH formal borrowing blocks
Find Value just below or above each element of ar_a from ar_forbrblk. a vector of grid points, find for each element of ar_a the element of ar_forbrblk that is just above or just below.
- ar_a: where
- ar_forbrblk: where
is the level of formal borrowing if joint formal + informal borrowing is chosen.
is the level of formal borrowing if joint formal borrowing + informal savings is chosen.
@param ar_a boolean N by 1 single formal borrowing levels, could include interest rate or principle only depending on bl_b_is_principle
@param ar_forbrblk 1 by M array array of formal borrowing grid points. This always is just the formal borrowing levels principles only without interest rate.
@param ar_forbrblk_r array interest rates associated with equal-length ar_forbrblk.
@param bl_b_is_principle boolean solving with aggregate savings as savings + debt principles + interests, or just principles no interests. if true, principels only, no interests. Specifically:
- bl_b_is_principle = false: this means that the asset choices include both principle and interest rate. For here, that means ar_a vector elements include both principle and interest rate, but the ar_forbrblk vector always only include principles. So when matching, need to translate ar_forbrblk by appending interest rates on.
- bl_b_is_principle = false for abz, bl_b_is_principle = true for ipwkbz.
@return ar_a_grid_ceil_principle array N by 1 Solution to:
@return ar_a_grid_ceil_wthr array ar_a_grid_ceil_principle with interest rates specified to each borrowing formal level added
@return ar_a_grid_floor_principle array N by 1 element of the ar_forbrblk vector that are the elements right above each eelemnt of ar_a. Solution to:
@return ar_a_grid_floor_principle array ar_a_grid_floor_principle with interest rates specified to each borrowing formal level added
@example
[ar_a_grid_ceil, ar_a_grid_floor] = ...
ffs_for_br_block_match(ar_a, ar_forbrblk, ar_forbrblk_r, bl_b_is_principle);
@seealso
- Formal Borrowing Grid: ffs_for_br_block_gen
- Informal Interest Rates: ffs_r_inf
- Match Borrowing to Formal Grid: ffs_for_br_block_match
- Optimize Formal and Informal, Borrowing and Savings Joint Choices: ffs_fibs_min_c_cost
- Bridge Loan: ffs_fibs_inf_bridge
- Overall Optimization: ffs_fibs_min_c_cost_bridge
- Discrete Choices: ffs_fibs_identify_discrete
Default
% array of a choices % ar_a could be principles + interests, or principles only ar_a = -sort(rand([10,1])*20); % use defaults from block gen [ar_forbrblk, ar_forbrblk_r] = ffs_for_br_block_gen(); % if bl_b_is_principle is true, b is principles only, no interests. % bl_b_is_principle = false is the case for models like *abz* without % interpolation over cash-on-hand bl_b_is_principle = true; % Display if (isempty(varargin)) bl_display_brblockmatch = true; else bl_display_brblockmatch = false; end default_params = {ar_a ar_forbrblk ar_forbrblk_r bl_b_is_principle bl_display_brblockmatch};
Parse Parameters
% numvarargs is the number of varagin inputted
[default_params{1:length(varargin)}] = varargin{:};
[ar_a, ar_forbrblk, ar_forbrblk_r, bl_b_is_principle, bl_display_brblockmatch] = default_params{:};
Adjust Inputs t
if bl_b_is_principle, then principle, with the assumption that ar_forbrblk. If bl_b_is_principle is false, that means the ar_a vector is principle and interest rates. Hence, need to convert ar_forbrblk which are principles to interests plus principles to be on the same scale as ar_a.
if (bl_b_is_principle) ar_forbrblk_use = ar_forbrblk; else ar_forbrblk_use = ar_forbrblk.*(1+ar_forbrblk_r); end
Show Details Step by Step
if (bl_display_brblockmatch) % show borrowing array disp('ar_a') disp(ar_a) % show borrowing formal blocks/grids disp('ar_forbrblk_use and ar_forbrblk'); disp([ar_forbrblk_use;ar_forbrblk]'); % all combination division disp('mt_a_dvd_grid = (ar_a./ar_forbrblk_use)'); mt_a_dvd_grid = (ar_a./ar_forbrblk_use); % ceiling for each disp('(mt_a_dvd_grid >= 1)'); (mt_a_dvd_grid >= 1) % If ceiling exists and cloest ceiling index % min_{j}( ar_forbrblk[j] - ar_a[i] | ar_forbrblk[j] > ar_a[i]) disp('[~, ar_max_a_on_grid_idx] = max((mt_a_dvd_grid >= 1),[], 2)'); [~, ar_max_a_on_grid_idx] = max((mt_a_dvd_grid >= 1),[], 2) % ar_forbrblk[argmin_{j}( ar_forbrblk[j] - ar_a[i] | ar_forbrblk[j] > ar_a[i])] disp('ar_a_grid_ceil = ar_forbrblk_use(ar_max_a_on_grid_idx)'); ar_a_grid_ceil = ar_forbrblk_use(ar_max_a_on_grid_idx) % ar_a_grid_ceil(ar_max_a_on_grid_idx == 1) = ar_forbrblk(0) % now floor, just one index less disp('ar_a_grid_floor = ar_forbrblk_use(max(ar_max_a_on_grid_idx - 1, 1))'); ar_a_grid_floor = ar_forbrblk_use(max(ar_max_a_on_grid_idx - 1, 1)) % ar_a_grid_floor(ar_max_a_on_grid_idx == 1) = % Dispaly tab_matched_grid = table(ar_a, ar_a_grid_floor', ar_a_grid_ceil'); tab_matched_grid.Properties.VariableNames = {'ar_a','ar_a_grid_floor','ar_a_grid_ceil'}; disp('ar_a_grid_floor: for borrow + for save'); disp('ar_a_grid_ceil: for + inf borrow'); disp(tab_matched_grid); end
ar_a -0.1193 -0.4659 -0.7142 -3.3894 -5.3466 -12.3617 -12.4052 -17.8726 -18.2702 -19.3514 ar_forbrblk_use and ar_forbrblk -19.0000 -19.0000 -18.5000 -18.5000 -18.0000 -18.0000 -17.5000 -17.5000 -17.0000 -17.0000 -16.5000 -16.5000 -16.0000 -16.0000 -15.5000 -15.5000 -15.0000 -15.0000 -14.5000 -14.5000 -14.0000 -14.0000 -13.5000 -13.5000 -13.0000 -13.0000 -12.5000 -12.5000 -12.0000 -12.0000 -11.5000 -11.5000 -11.0000 -11.0000 -10.5000 -10.5000 -10.0000 -10.0000 -9.5000 -9.5000 -9.0000 -9.0000 -8.5000 -8.5000 -8.0000 -8.0000 -7.5000 -7.5000 -7.0000 -7.0000 -6.5000 -6.5000 -6.0000 -6.0000 -5.5000 -5.5000 -5.0000 -5.0000 -4.5000 -4.5000 -4.0000 -4.0000 -3.5000 -3.5000 -3.0000 -3.0000 -2.5000 -2.5000 -2.0000 -2.0000 -1.5000 -1.5000 -1.0000 -1.0000 0 0 mt_a_dvd_grid = (ar_a./ar_forbrblk_use) (mt_a_dvd_grid >= 1) ans = 10×38 logical array Columns 1 through 19 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 Columns 20 through 38 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 [~, ar_max_a_on_grid_idx] = max((mt_a_dvd_grid >= 1),[], 2) ar_max_a_on_grid_idx = 38 38 38 33 29 15 15 4 3 1 ar_a_grid_ceil = ar_forbrblk_use(ar_max_a_on_grid_idx) ar_a_grid_ceil = Columns 1 through 7 0 0 0 -3.0000 -5.0000 -12.0000 -12.0000 Columns 8 through 10 -17.5000 -18.0000 -19.0000 ar_a_grid_floor = ar_forbrblk_use(max(ar_max_a_on_grid_idx - 1, 1)) ar_a_grid_floor = Columns 1 through 7 -1.0000 -1.0000 -1.0000 -3.5000 -5.5000 -12.5000 -12.5000 Columns 8 through 10 -18.0000 -18.5000 -19.0000 ar_a_grid_floor: for borrow + for save ar_a_grid_ceil: for + inf borrow ar_a ar_a_grid_floor ar_a_grid_ceil ________ _______________ ______________ -0.11933 -1 0 -0.46588 -1 0 -0.71421 -1 0 -3.3894 -3.5 -3 -5.3466 -5.5 -5 -12.362 -12.5 -12 -12.405 -12.5 -12 -17.873 -18 -17.5 -18.27 -18.5 -18 -19.351 -19 -19
Standard Quicker Solve
% Get Index [~, ar_max_a_on_grid_idx] = max(((ar_a./ar_forbrblk_use) >= 1),[], 2); % Get Values if (bl_b_is_principle) % Borrowing borrowing points, following formal grids, but add interests ar_a_grid_ceil_wthr = ... (ar_forbrblk_use(ar_max_a_on_grid_idx).*(1+ar_forbrblk_r(ar_max_a_on_grid_idx)))'; ar_a_grid_floor_wthr = ... (ar_forbrblk_use(max(ar_max_a_on_grid_idx - 1, 1)).*(1+ar_forbrblk_r(max(ar_max_a_on_grid_idx - 1, 1))))'; % Principles only, note ar_forbrblk_use = ar_forbrblk ar_a_grid_ceil_principle = ar_forbrblk_use(ar_max_a_on_grid_idx)'; ar_a_grid_floor_principle = ar_forbrblk_use(max(ar_max_a_on_grid_idx - 1, 1))'; else % Borrowing borrowing points, following formal grids, but add interests ar_a_grid_ceil_wthr = ar_forbrblk_use(ar_max_a_on_grid_idx)'; ar_a_grid_floor_wthr = ar_forbrblk_use(max(ar_max_a_on_grid_idx - 1, 1))'; % Principles only ar_a_grid_ceil_principle = ar_forbrblk(ar_max_a_on_grid_idx)'; ar_a_grid_floor_principle = ar_forbrblk(max(ar_max_a_on_grid_idx - 1, 1))'; end
Display
if (bl_display_brblockmatch) disp('ar_a_grid_ceil_principle'); disp(ar_a_grid_ceil_principle); disp('ar_a_grid_ceil_wthr'); disp(ar_a_grid_ceil_wthr); disp('ar_a_grid_floor_principle'); disp(ar_a_grid_floor_principle); disp('ar_a_grid_floor_wthr'); disp(ar_a_grid_floor_wthr); end
ar_a_grid_ceil_principle 0 0 0 -3.0000 -5.0000 -12.0000 -12.0000 -17.5000 -18.0000 -19.0000 ar_a_grid_ceil_wthr 0 0 0 -3.1350 -5.2250 -12.5400 -12.5400 -18.2875 -18.8100 -19.8550 ar_a_grid_floor_principle -1.0000 -1.0000 -1.0000 -3.5000 -5.5000 -12.5000 -12.5000 -18.0000 -18.5000 -19.0000 ar_a_grid_floor_wthr -1.0450 -1.0450 -1.0450 -3.6575 -5.7475 -13.0625 -13.0625 -18.8100 -19.3325 -19.8550
end
ans = 0 0 0 -3.0000 -5.0000 -12.0000 -12.0000 -17.5000 -18.0000 -19.0000