mergeron 2024.738936.0__py3-none-any.whl → 2024.738940.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of mergeron might be problematic. Click here for more details.
- mergeron/core/excel_helper.py +4 -2
- mergeron/core/guidelines_standards.py +368 -123
- mergeron/core/proportions_tests.py +9 -9
- mergeron/core/pseudorandom_numbers.py +1 -2
- mergeron/examples/concentration_as_diversion.py +96 -109
- mergeron/examples/investigations_stats_sim_tables.py +22 -29
- mergeron/examples/safeharbor_boundaries_for_mergers_with_asymmetric_shares.py +13 -13
- mergeron/examples/safeharbor_boundaries_for_symmetric_firm_mergers.py +3 -3
- mergeron/examples/sound_guppi_safeharbor.py +31 -28
- mergeron/examples/testIntrinsicClearanceRates.py +12 -12
- mergeron/examples/visualize_guidelines_tests.py +34 -29
- mergeron/gen/__init__.py +463 -0
- mergeron/gen/_data_generation_functions_nonpublic.py +626 -0
- mergeron/gen/data_generation.py +45 -992
- mergeron/gen/guidelines_tests.py +122 -99
- mergeron/gen/investigations_stats.py +10 -12
- mergeron/jinja_LaTex_templates/clrrate_cis_summary_table_template.tex.jinja2 +1 -1
- mergeron/jinja_LaTex_templates/ftcinvdata_summarypaired_table_template.tex.jinja2 +1 -1
- {mergeron-2024.738936.0.dist-info → mergeron-2024.738940.0.dist-info}/METADATA +1 -1
- {mergeron-2024.738936.0.dist-info → mergeron-2024.738940.0.dist-info}/RECORD +21 -20
- {mergeron-2024.738936.0.dist-info → mergeron-2024.738940.0.dist-info}/WHEEL +0 -0
|
@@ -19,13 +19,14 @@ import tables as ptb # type: ignore
|
|
|
19
19
|
from attrs import evolve
|
|
20
20
|
|
|
21
21
|
import mergeron.core.ftc_merger_investigations_data as fid
|
|
22
|
-
import mergeron.core.guidelines_standards as
|
|
22
|
+
import mergeron.core.guidelines_standards as gsl
|
|
23
23
|
import mergeron.gen.data_generation as dgl
|
|
24
24
|
import mergeron.gen.guidelines_tests as gtl
|
|
25
25
|
import mergeron.gen.investigations_stats as isl
|
|
26
26
|
from mergeron import DATA_DIR
|
|
27
27
|
from mergeron.core.guidelines_standards import GuidelinesStandards
|
|
28
28
|
from mergeron.core.proportions_tests import propn_ci
|
|
29
|
+
from mergeron.gen import PCMConstants, PCMSpec, RECConstants, ShareSpec, SHRConstants
|
|
29
30
|
|
|
30
31
|
if not sys.warnoptions:
|
|
31
32
|
warnings.simplefilter("ignore") # , category="RuntimeWarning")
|
|
@@ -41,7 +42,7 @@ def invres_stats_sim_setup(
|
|
|
41
42
|
_invdata: fid.INVData,
|
|
42
43
|
_data_period: str,
|
|
43
44
|
_merger_class: isl.INDGRPConstants | isl.EVIDENConstants,
|
|
44
|
-
_invres_parm_vec:
|
|
45
|
+
_invres_parm_vec: gsl.GuidelinesSTD,
|
|
45
46
|
_sample_spec: dgl.MarketSampleSpec,
|
|
46
47
|
_invres_stats_kwargs: Mapping[str, Any] | None = None,
|
|
47
48
|
/,
|
|
@@ -86,9 +87,9 @@ def invres_stats_sim_setup(
|
|
|
86
87
|
|
|
87
88
|
_sample_spec_here = evolve(
|
|
88
89
|
_sample_spec,
|
|
89
|
-
share_spec=
|
|
90
|
-
|
|
91
|
-
|
|
90
|
+
share_spec=ShareSpec(
|
|
91
|
+
RECConstants.INOUT,
|
|
92
|
+
SHRConstants.DIR_FLAT,
|
|
92
93
|
None,
|
|
93
94
|
_invres_cnts_obs_byfirmcount_array[:-1, 1],
|
|
94
95
|
),
|
|
@@ -96,11 +97,7 @@ def invres_stats_sim_setup(
|
|
|
96
97
|
|
|
97
98
|
# Generate simulated rates
|
|
98
99
|
_start_time = datetime.now()
|
|
99
|
-
(
|
|
100
|
-
_invres_cnts_sim_byfirmcount_array,
|
|
101
|
-
_invres_cnts_sim_bydelta_array,
|
|
102
|
-
_invres_cnts_sim_byconczone_array,
|
|
103
|
-
) = gtl.sim_invres_cnts_ll(
|
|
100
|
+
_upp_tests_counts = gtl.sim_invres_cnts_ll(
|
|
104
101
|
_invres_parm_vec, _sample_spec_here, _invres_stats_kwargs
|
|
105
102
|
)
|
|
106
103
|
_total_duration = datetime.now() - _start_time
|
|
@@ -118,7 +115,7 @@ def invres_stats_sim_setup(
|
|
|
118
115
|
"hcol_width": 54,
|
|
119
116
|
"notewidth": 0.63,
|
|
120
117
|
"obs_array": _invres_cnts_obs_byfirmcount_array,
|
|
121
|
-
"sim_array":
|
|
118
|
+
"sim_array": _upp_tests_counts.by_firm_count,
|
|
122
119
|
},
|
|
123
120
|
isl.StatsGrpSelector.DL: {
|
|
124
121
|
"desc": Rf"{_test_regime.capitalize()} rates by range of $\Delta HHI$",
|
|
@@ -137,7 +134,7 @@ def invres_stats_sim_setup(
|
|
|
137
134
|
isl.LTX_ARRAY_LINEEND,
|
|
138
135
|
)),
|
|
139
136
|
"obs_array": _invres_cnts_obs_bydelta_array,
|
|
140
|
-
"sim_array":
|
|
137
|
+
"sim_array": _upp_tests_counts.by_delta,
|
|
141
138
|
},
|
|
142
139
|
isl.StatsGrpSelector.ZN: {
|
|
143
140
|
"desc": f"{_test_regime.capitalize()} rates by Approximate Presumption Zone",
|
|
@@ -149,7 +146,7 @@ def invres_stats_sim_setup(
|
|
|
149
146
|
"hcol_width": 190,
|
|
150
147
|
"notewidth": 0.96,
|
|
151
148
|
"obs_array": _invres_cnts_obs_byconczone_array,
|
|
152
|
-
"sim_array":
|
|
149
|
+
"sim_array": _upp_tests_counts.by_conczone,
|
|
153
150
|
},
|
|
154
151
|
}
|
|
155
152
|
|
|
@@ -180,7 +177,7 @@ def invres_stats_sim_render(
|
|
|
180
177
|
_merger_class: isl.INDGRPConstants | isl.EVIDENConstants,
|
|
181
178
|
_stats_group: isl.StatsGrpSelector,
|
|
182
179
|
_stats_group_dict_sub: Mapping[str, Any],
|
|
183
|
-
_invres_parm_vec:
|
|
180
|
+
_invres_parm_vec: gsl.GuidelinesSTD,
|
|
184
181
|
_sim_test_regime: gtl.UPPTestRegime,
|
|
185
182
|
_stats_table_file: TextIOWrapper,
|
|
186
183
|
/,
|
|
@@ -192,9 +189,9 @@ def invres_stats_sim_render(
|
|
|
192
189
|
for _g, _h in (("obs_array", -2), ("sim_array", -5))
|
|
193
190
|
)
|
|
194
191
|
|
|
195
|
-
_invres_select
|
|
192
|
+
_invres_select = _sim_test_regime.resolution
|
|
196
193
|
(
|
|
197
|
-
_stats_table_content.
|
|
194
|
+
_stats_table_content.test_res,
|
|
198
195
|
_stats_table_content.obs_merger_class,
|
|
199
196
|
_stats_table_content.obs_period,
|
|
200
197
|
) = (_invres_select.capitalize(), _merger_class, _data_period.split("-"))
|
|
@@ -214,7 +211,7 @@ def invres_stats_sim_render(
|
|
|
214
211
|
R"estimated by the Wilson method, given the",
|
|
215
212
|
"reported numbers of investigated mergers and cleared mergers",
|
|
216
213
|
_stats_group_dict_sub["desc"].replace(
|
|
217
|
-
f"{_stats_table_content.
|
|
214
|
+
f"{_stats_table_content.test_res} rates ", ""
|
|
218
215
|
),
|
|
219
216
|
isl.LTX_ARRAY_LINEEND,
|
|
220
217
|
))
|
|
@@ -224,7 +221,7 @@ def invres_stats_sim_render(
|
|
|
224
221
|
propn_ci(0.50 * _eg_count, _eg_count, method="Exact")
|
|
225
222
|
)
|
|
226
223
|
_stats_sim_notestr = " ".join((
|
|
227
|
-
Rf"\(\cdot\) Simulated {_stats_table_content.
|
|
224
|
+
Rf"\(\cdot\) Simulated {_stats_table_content.test_res} rates are estimated by",
|
|
228
225
|
"Monte Carlo integration over generated data representing",
|
|
229
226
|
Rf"{_sim_sample_sz:,d} hypothetical mergers. Thus,",
|
|
230
227
|
R"for a subset of simulations with a relative frequency",
|
|
@@ -315,7 +312,7 @@ def invres_stats_sim_render(
|
|
|
315
312
|
f"{g} {isl.LTX_ARRAY_LINEEND}" for g in _invres_stats_hdr_list
|
|
316
313
|
])
|
|
317
314
|
_stats_table_content.stats_cis = "".join([
|
|
318
|
-
f"{
|
|
315
|
+
f"{" & ".join(g)} {isl.LTX_ARRAY_LINEEND}" for g in _invres_stats_dat_list
|
|
319
316
|
])
|
|
320
317
|
# Print to console
|
|
321
318
|
isl.stats_print_rows(_invres_stats_hdr_list, _invres_stats_dat_list)
|
|
@@ -333,7 +330,7 @@ def invres_stats_sim_render(
|
|
|
333
330
|
# Exclude results of IPR tests
|
|
334
331
|
_stats_sim_dat_list = [_f[:-1] for _f in _stats_sim_dat_list]
|
|
335
332
|
_stats_table_content.stats_sim = "".join([
|
|
336
|
-
f"{
|
|
333
|
+
f"{" & ".join(g)} {isl.LTX_ARRAY_LINEEND}" for g in _stats_sim_dat_list
|
|
337
334
|
])
|
|
338
335
|
# Print to console
|
|
339
336
|
isl.stats_print_rows(_stats_sim_hdr_list, _stats_sim_dat_list)
|
|
@@ -362,8 +359,7 @@ if __name__ == "__main__":
|
|
|
362
359
|
)
|
|
363
360
|
|
|
364
361
|
sample_sz_base = 10**7
|
|
365
|
-
|
|
366
|
-
pcm_dist_type, pcm_dist_parms = dgl.PCMConstants.EMPR, np.empty(2)
|
|
362
|
+
pcm_dist_type, pcm_dist_parms = PCMConstants.EMPR, None
|
|
367
363
|
|
|
368
364
|
save_data_to_file_flag = False
|
|
369
365
|
save_data_to_file: gtl.SaveData = False
|
|
@@ -379,8 +375,8 @@ if __name__ == "__main__":
|
|
|
379
375
|
save_data_to_file = (True, h5datafile, "/")
|
|
380
376
|
|
|
381
377
|
sim_test_regime = (
|
|
382
|
-
(isl.PolicySelector.CLRN, gtl.
|
|
383
|
-
(isl.PolicySelector.ENFT, gtl.
|
|
378
|
+
(isl.PolicySelector.CLRN, gtl.UPPAggrSelector.MAX, None),
|
|
379
|
+
(isl.PolicySelector.ENFT, gtl.UPPAggrSelector.OSD, None),
|
|
384
380
|
)[1]
|
|
385
381
|
invres_stats_kwargs = {"sim_test_regime": sim_test_regime}
|
|
386
382
|
|
|
@@ -406,17 +402,14 @@ if __name__ == "__main__":
|
|
|
406
402
|
mkt_sample_spec = dgl.MarketSampleSpec(
|
|
407
403
|
sample_sz_base,
|
|
408
404
|
invres_parm_vec.rec,
|
|
409
|
-
|
|
410
|
-
pcm_spec=dgl.PCMSpec(
|
|
411
|
-
pcm_dist_type, dgl.FM2Constants.MNL, pcm_dist_parms
|
|
412
|
-
),
|
|
405
|
+
pcm_spec=PCMSpec(pcm_dist_type, dgl.FM2Constants.MNL, pcm_dist_parms),
|
|
413
406
|
hsr_filing_test_type=dgl.SSZConstants.HSR_NTH,
|
|
414
407
|
)
|
|
415
408
|
|
|
416
409
|
# A file to write tables to, and a hierarchy under which to store the data
|
|
417
410
|
if save_data_to_file:
|
|
418
411
|
h5hier_pat = re.compile(r"\W")
|
|
419
|
-
h5hier = f"/{h5hier_pat.sub(
|
|
412
|
+
h5hier = f"/{h5hier_pat.sub("_", f"{merger_class} {study_period}")}"
|
|
420
413
|
save_data_to_file = (True, save_data_to_file[1], h5hier)
|
|
421
414
|
|
|
422
415
|
table_dottex_name = invres_stats_sim_setup(
|
|
@@ -24,7 +24,7 @@ from numpy import (
|
|
|
24
24
|
vstack,
|
|
25
25
|
)
|
|
26
26
|
|
|
27
|
-
import mergeron.core.guidelines_standards as
|
|
27
|
+
import mergeron.core.guidelines_standards as gsl
|
|
28
28
|
from mergeron import DATA_DIR
|
|
29
29
|
|
|
30
30
|
PROG_PATH = Path(__file__)
|
|
@@ -40,7 +40,7 @@ def plot_delta_boundaries(
|
|
|
40
40
|
raise ValueError(f"Recapture specification must be one of, {_recspecs!r}")
|
|
41
41
|
|
|
42
42
|
print("ΔHHI safeharbor boundary")
|
|
43
|
-
_plt, _my_fig1, _ax1, _ =
|
|
43
|
+
_plt, _my_fig1, _ax1, _ = gsl.boundary_plot()
|
|
44
44
|
|
|
45
45
|
_dh_bar, _r_bar, _guppi_bench, _divr_bench, _, _ = get_hmg_standards_by_key(
|
|
46
46
|
_guppi_bench_key
|
|
@@ -52,7 +52,7 @@ def plot_delta_boundaries(
|
|
|
52
52
|
if _dh_bound in (300, 500):
|
|
53
53
|
continue
|
|
54
54
|
|
|
55
|
-
_dh_safeharb, _dh_prob =
|
|
55
|
+
_dh_safeharb, _dh_prob = gsl.delta_hhi_boundary(_dh_bound / 1e4)
|
|
56
56
|
_dh_dat_x, _dh_dat_y = zip(*_dh_safeharb, strict=True)
|
|
57
57
|
if _dh_bound == 100:
|
|
58
58
|
_lwval, _lsval = 0.75, "-"
|
|
@@ -69,8 +69,8 @@ def plot_delta_boundaries(
|
|
|
69
69
|
)
|
|
70
70
|
|
|
71
71
|
if _print_guppi_max_bndry_envs_flag:
|
|
72
|
-
_symshr =
|
|
73
|
-
_dstar =
|
|
72
|
+
_symshr = gsl.round_cust(sqrt(_dh_bound / 2e4))
|
|
73
|
+
_dstar = gsl.round_cust(_symshr / (1 - _symshr))
|
|
74
74
|
_m_star = _guppi_bench / (_dstar * _r_bar)
|
|
75
75
|
print(_symshr, _dstar, _m_star, _r_bar, _guppi_bench, "...", end="")
|
|
76
76
|
|
|
@@ -150,10 +150,10 @@ def plot_guppi_boundaries( # noqa PLR0915
|
|
|
150
150
|
)
|
|
151
151
|
|
|
152
152
|
# First we get the data for the ΔHHI benchmark we want to plot
|
|
153
|
-
_dh_safeharb, _dh_prob =
|
|
153
|
+
_dh_safeharb, _dh_prob = gsl.delta_hhi_boundary(_dh_bar)
|
|
154
154
|
_dh_dat_x, _dh_dat_y = zip(*_dh_safeharb, strict=True)
|
|
155
155
|
|
|
156
|
-
_plt, _my_fig1, _ax1, _set_axis_def =
|
|
156
|
+
_plt, _my_fig1, _ax1, _set_axis_def = gsl.boundary_plot()
|
|
157
157
|
_plt.delaxes(_ax1)
|
|
158
158
|
del _my_fig1, _ax1
|
|
159
159
|
|
|
@@ -316,13 +316,13 @@ def plot_guppi_boundaries( # noqa PLR0915
|
|
|
316
316
|
# print("Diversion ratio bound")
|
|
317
317
|
if _divr_bench < _r_bar:
|
|
318
318
|
_m_star_bench = _guppi_bench / _divr_bench
|
|
319
|
-
_s_mid_bench =
|
|
319
|
+
_s_mid_bench = gsl.shr_from_gbd(
|
|
320
320
|
_guppi_bench, m_star=_m_star_bench, r_bar=_r_bar
|
|
321
321
|
)
|
|
322
|
-
_delta_star =
|
|
322
|
+
_delta_star = gsl.critical_shrratio(
|
|
323
323
|
_guppi_bench, m_star=_m_star_bench, r_bar=_r_bar
|
|
324
324
|
)
|
|
325
|
-
(guppi_boundary_data, guppi_boundary_area) =
|
|
325
|
+
(guppi_boundary_data, guppi_boundary_area) = gsl.shrratio_boundary_max(
|
|
326
326
|
_delta_star
|
|
327
327
|
)
|
|
328
328
|
_x_drt, _y_drt = zip(*guppi_boundary_data, strict=True)
|
|
@@ -451,16 +451,16 @@ def get_hmg_standards_by_key(_guppi_bench_key: str, /) -> tuple:
|
|
|
451
451
|
match _guppi_bench_key:
|
|
452
452
|
case "DOJATR":
|
|
453
453
|
return (
|
|
454
|
-
*(_tmp :=
|
|
454
|
+
*(_tmp := gsl.GuidelinesStandards(2010).safeharbor[:2]),
|
|
455
455
|
0.05,
|
|
456
456
|
_tmp[-1],
|
|
457
457
|
None,
|
|
458
458
|
None,
|
|
459
459
|
)
|
|
460
460
|
case "DH100":
|
|
461
|
-
return
|
|
461
|
+
return gsl.GuidelinesStandards(2010).safeharbor
|
|
462
462
|
case "DH50":
|
|
463
|
-
return
|
|
463
|
+
return gsl.GuidelinesStandards(1992).safeharbor
|
|
464
464
|
case _:
|
|
465
465
|
raise ValueError(
|
|
466
466
|
f"GUPPI benchmark key must be one of, {guppi_benchmark_keys!r}"
|
|
@@ -12,14 +12,14 @@ from matplotlib import cm as colormgr
|
|
|
12
12
|
from matplotlib import colors as mcolors
|
|
13
13
|
from matplotlib.ticker import AutoMinorLocator, MultipleLocator, StrMethodFormatter
|
|
14
14
|
|
|
15
|
-
import mergeron.core.guidelines_standards as
|
|
15
|
+
import mergeron.core.guidelines_standards as gsl
|
|
16
16
|
from mergeron import DATA_DIR
|
|
17
17
|
|
|
18
18
|
PROG_PATH = Path(__file__)
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def _main() -> None:
|
|
22
|
-
plt, _, _, set_axis_def =
|
|
22
|
+
plt, _, _, set_axis_def = gsl.boundary_plot()
|
|
23
23
|
# plt.delaxes(ax1)
|
|
24
24
|
# del my_fig1, ax1
|
|
25
25
|
# del ax1
|
|
@@ -45,7 +45,7 @@ def _main() -> None:
|
|
|
45
45
|
g_bar, r_bar, dr_bar = 0.06, 0.80, 0.20
|
|
46
46
|
|
|
47
47
|
step_size = 10**-5
|
|
48
|
-
sym_shr_vec = np.arange(
|
|
48
|
+
sym_shr_vec = np.arange(gsl.shr_from_gbd(g_bar), 0.5 + step_size, step_size)
|
|
49
49
|
mst_vec = (g_bar / r_bar) * (1 - sym_shr_vec) / sym_shr_vec
|
|
50
50
|
|
|
51
51
|
print("Setup basic figure and axes for plots of safe harbor boundaries.")
|
|
@@ -7,15 +7,28 @@ from typing import Literal
|
|
|
7
7
|
import numpy as np
|
|
8
8
|
import tables as ptb # type: ignore
|
|
9
9
|
|
|
10
|
-
import mergeron.core.guidelines_standards as
|
|
10
|
+
import mergeron.core.guidelines_standards as gsl
|
|
11
11
|
import mergeron.gen.data_generation as dgl
|
|
12
12
|
import mergeron.gen.guidelines_tests as gtl
|
|
13
13
|
import mergeron.gen.investigations_stats as isl
|
|
14
14
|
from mergeron import DATA_DIR
|
|
15
|
+
from mergeron.gen import (
|
|
16
|
+
EMPTY_ARRAY_DEFAULT,
|
|
17
|
+
FCOUNT_WTS_DEFAULT,
|
|
18
|
+
MarketSampleSpec,
|
|
19
|
+
PCMConstants,
|
|
20
|
+
PCMSpec,
|
|
21
|
+
ShareSpec,
|
|
22
|
+
SHRConstants,
|
|
23
|
+
)
|
|
15
24
|
|
|
16
25
|
tests_of_interest: tuple[gtl.UPPTestRegime, ...] = (
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
gtl.UPPTestRegime(
|
|
27
|
+
isl.PolicySelector.CLRN, gtl.UPPAggrSelector.MAX, gtl.UPPAggrSelector.MAX
|
|
28
|
+
),
|
|
29
|
+
gtl.UPPTestRegime(
|
|
30
|
+
isl.PolicySelector.ENFT, gtl.UPPAggrSelector.MIN, gtl.UPPAggrSelector.MIN
|
|
31
|
+
),
|
|
19
32
|
)
|
|
20
33
|
|
|
21
34
|
PROG_PATH = Path(__file__)
|
|
@@ -24,9 +37,7 @@ PROG_PATH = Path(__file__)
|
|
|
24
37
|
def analyze_invres_data(
|
|
25
38
|
_sample_size: int = 10**6,
|
|
26
39
|
_hmg_std_pub_year: Literal[1992, 2010, 2023] = 1992,
|
|
27
|
-
_test_sel:
|
|
28
|
-
str, gtl.GUPPIWghtngSelector, gtl.GUPPIWghtngSelector | None
|
|
29
|
-
] = tests_of_interest[1],
|
|
40
|
+
_test_sel: gtl.UPPTestRegime = tests_of_interest[1],
|
|
30
41
|
/,
|
|
31
42
|
*,
|
|
32
43
|
save_data_to_file_flag: bool = False,
|
|
@@ -50,7 +61,7 @@ def analyze_invres_data(
|
|
|
50
61
|
If True, simulated data are save to file (hdf5 format)
|
|
51
62
|
|
|
52
63
|
"""
|
|
53
|
-
_invres_parm_vec =
|
|
64
|
+
_invres_parm_vec = gsl.GuidelinesStandards(_hmg_std_pub_year).presumption
|
|
54
65
|
|
|
55
66
|
_save_data_to_file: gtl.SaveData = False
|
|
56
67
|
if save_data_to_file_flag:
|
|
@@ -61,10 +72,10 @@ def analyze_invres_data(
|
|
|
61
72
|
_h5_datafile = ptb.open_file(
|
|
62
73
|
DATA_DIR / PROG_PATH.with_suffix(".h5").name,
|
|
63
74
|
mode="w",
|
|
64
|
-
title=f"GUPPI Safeharbor {_test_sel
|
|
75
|
+
title=f"GUPPI Safeharbor {_test_sel.resolution.capitalize()} Rate Module",
|
|
65
76
|
filters=_blosc_filters,
|
|
66
77
|
)
|
|
67
|
-
_h5_hier = f"/{_h5_hier_pat.sub(
|
|
78
|
+
_h5_hier = f"/{_h5_hier_pat.sub("_", f"Standards from {_hmg_std_pub_year} Guidelines")}"
|
|
68
79
|
|
|
69
80
|
_save_data_to_file = (True, _h5_datafile, _h5_hier)
|
|
70
81
|
|
|
@@ -77,11 +88,7 @@ def analyze_invres_data(
|
|
|
77
88
|
[
|
|
78
89
|
tuple(
|
|
79
90
|
zip(
|
|
80
|
-
(
|
|
81
|
-
dgl.PCMConstants.UNI,
|
|
82
|
-
dgl.PCMConstants.BETA,
|
|
83
|
-
dgl.PCMConstants.EMPR,
|
|
84
|
-
),
|
|
91
|
+
(PCMConstants.UNI, PCMConstants.BETA, PCMConstants.EMPR),
|
|
85
92
|
(
|
|
86
93
|
np.array((0, 1), dtype=np.float64),
|
|
87
94
|
np.array((10, 10), dtype=np.float64),
|
|
@@ -106,24 +113,23 @@ def analyze_invres_data(
|
|
|
106
113
|
|
|
107
114
|
print()
|
|
108
115
|
print(
|
|
109
|
-
f"Simulated {_test_sel
|
|
116
|
+
f"Simulated {_test_sel.resolution.capitalize()} rates by range of ∆HHI",
|
|
110
117
|
f'recapture-rate calibrated, "{_recapture_spec_test}"',
|
|
111
118
|
f'Firm 2 margins, "{_pcm_dist_firm2_test}"',
|
|
112
119
|
f"and margins distributed {_pcm_dist_type_test}{_pcm_dist_parms_test}:",
|
|
113
120
|
sep="; ",
|
|
114
121
|
)
|
|
115
122
|
|
|
116
|
-
_ind_sample_spec =
|
|
123
|
+
_ind_sample_spec = MarketSampleSpec(
|
|
117
124
|
_sample_size,
|
|
118
125
|
_invres_parm_vec.rec,
|
|
119
|
-
|
|
120
|
-
share_spec=dgl.ShareSpec(
|
|
126
|
+
share_spec=ShareSpec(
|
|
121
127
|
_recapture_spec_test,
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
128
|
+
SHRConstants.UNI,
|
|
129
|
+
EMPTY_ARRAY_DEFAULT,
|
|
130
|
+
FCOUNT_WTS_DEFAULT,
|
|
125
131
|
),
|
|
126
|
-
pcm_spec=
|
|
132
|
+
pcm_spec=PCMSpec(
|
|
127
133
|
_pcm_dist_type_test, _pcm_dist_firm2_test, _pcm_dist_parms_test
|
|
128
134
|
),
|
|
129
135
|
)
|
|
@@ -134,11 +140,8 @@ def analyze_invres_data(
|
|
|
134
140
|
}
|
|
135
141
|
|
|
136
142
|
_start_time = datetime.now()
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
_invres_rate_sim_bydelta_array,
|
|
140
|
-
_invres_rate_sim_byconczone_array,
|
|
141
|
-
) = gtl.sim_invres_cnts_ll(
|
|
143
|
+
|
|
144
|
+
upp_test_counts = gtl.sim_invres_cnts_ll(
|
|
142
145
|
_invres_parm_vec, _ind_sample_spec, _invres_cnts_kwargs
|
|
143
146
|
)
|
|
144
147
|
_run_duration = datetime.now() - _start_time
|
|
@@ -149,7 +152,7 @@ def analyze_invres_data(
|
|
|
149
152
|
)
|
|
150
153
|
|
|
151
154
|
_stats_hdr_list, _stats_dat_list = isl.latex_tbl_invres_stats_1dim(
|
|
152
|
-
|
|
155
|
+
upp_test_counts.by_delta,
|
|
153
156
|
return_type_sel=isl.StatsReturnSelector.RPT,
|
|
154
157
|
sort_order=isl.SortSelector.REV,
|
|
155
158
|
)
|
|
@@ -24,28 +24,28 @@ d_bar = 0.2 # 0.2 # r_bar # g_bar # 0.8 * 0.125 / (1 - 0.125)
|
|
|
24
24
|
sample_sz = 10**8
|
|
25
25
|
|
|
26
26
|
|
|
27
|
-
def icr_gsh_sym(_ssz: int = sample_sz) -> NDArray[
|
|
27
|
+
def icr_gsh_sym(_ssz: int = sample_sz) -> NDArray[np.float64]:
|
|
28
28
|
"""With symmetric shares, margins, and prices; closed-form integrand."""
|
|
29
29
|
_m_lim = g_bar / d_bar
|
|
30
30
|
_m_star = _m_lim + (1.0 - _m_lim) * rng.uniform(size=(_ssz, 1))
|
|
31
31
|
_d_star = g_bar / (r_bar * _m_star)
|
|
32
32
|
_divr_limit_prob = 2 * g_bar / (r_bar + d_bar)
|
|
33
|
-
|
|
34
|
-
return np.array([_ssz, _divr_limit_prob +
|
|
33
|
+
_guppi_bound_prob = 2 * (1 - _m_lim) * (_d_star / (1 + _d_star)).mean()
|
|
34
|
+
return np.array([_ssz, _divr_limit_prob + _guppi_bound_prob, np.nan, np.nan])
|
|
35
35
|
|
|
36
36
|
|
|
37
|
-
def icr_gsh_asymmshr(_ssz: int = sample_sz) -> NDArray[
|
|
37
|
+
def icr_gsh_asymmshr(_ssz: int = sample_sz) -> NDArray[np.float64]:
|
|
38
38
|
"""With symmetric margins and prices, unequal shares; closed-form integrand."""
|
|
39
39
|
_m_lim = g_bar / d_bar
|
|
40
40
|
_m_star = _m_lim + (1.0 - _m_lim) * rng.random(size=(_ssz, 1))
|
|
41
41
|
|
|
42
42
|
_d_star = g_bar / (r_bar * _m_star)
|
|
43
43
|
_divr_limit_prob = 2 * (g_bar / r_bar) * d_bar / (r_bar + d_bar)
|
|
44
|
-
|
|
45
|
-
return np.array([_ssz, _divr_limit_prob +
|
|
44
|
+
_guppi_bound_prob = 2 * (1 - _m_lim) * (_d_star**2 / (1 + _d_star)).mean()
|
|
45
|
+
return np.array([_ssz, _divr_limit_prob + _guppi_bound_prob, np.nan, np.nan])
|
|
46
46
|
|
|
47
47
|
|
|
48
|
-
def gen_qtyshr(_ssz: int = sample_sz, *, sym_flag: bool = False) -> NDArray[
|
|
48
|
+
def gen_qtyshr(_ssz: int = sample_sz, *, sym_flag: bool = False) -> NDArray[np.float64]:
|
|
49
49
|
"""Unequal shares and margins, and symmetric prices; indicator-function integrand."""
|
|
50
50
|
if sym_flag:
|
|
51
51
|
# for symmetric shares
|
|
@@ -57,7 +57,7 @@ def gen_qtyshr(_ssz: int = sample_sz, *, sym_flag: bool = False) -> NDArray[floa
|
|
|
57
57
|
return _mktshr_array
|
|
58
58
|
|
|
59
59
|
|
|
60
|
-
def icr_gsh_asymmshrmgn(_ssz: int = sample_sz) -> NDArray[
|
|
60
|
+
def icr_gsh_asymmshrmgn(_ssz: int = sample_sz) -> NDArray[np.float64]:
|
|
61
61
|
"""With symmetric prices, unequal shares and margins; indicator-function integrand."""
|
|
62
62
|
|
|
63
63
|
_shr_sym_flag = False
|
|
@@ -98,17 +98,17 @@ def icr_gsh_asymmshrmgn(_ssz: int = sample_sz) -> NDArray[float]:
|
|
|
98
98
|
_divr_test = _divr_array.max(axis=1) < d_bar
|
|
99
99
|
_pcm_min_test = _pcm_array.min(axis=1) >= (g_bar / d_bar)
|
|
100
100
|
_divr_limit_test = _gbd_test & _divr_test & np.logical_not(_pcm_min_test)
|
|
101
|
-
|
|
101
|
+
_gbd_not_in_deltah = np.logical_not(_delta_test) & _gbd_test & _divr_test
|
|
102
102
|
|
|
103
103
|
_scount = len(_gbd_test)
|
|
104
|
-
|
|
104
|
+
_gbd_prob = len(_gbd_test[_gbd_test & _divr_test]) / _scount
|
|
105
105
|
_deltah_prob = len(_gbd_test[_delta_test]) / _scount
|
|
106
|
-
_cum_clr_prob = len(_gbd_test[_delta_test |
|
|
106
|
+
_cum_clr_prob = len(_gbd_test[_delta_test | _gbd_not_in_deltah]) / _scount
|
|
107
107
|
|
|
108
108
|
del _guppi_array, _divr_array, _pcm_array
|
|
109
109
|
del _gbd_test, _divr_test, _pcm_min_test, _divr_limit_test
|
|
110
110
|
|
|
111
|
-
return np.array([_scount,
|
|
111
|
+
return np.array([_scount, _gbd_prob, _deltah_prob, _cum_clr_prob])
|
|
112
112
|
|
|
113
113
|
|
|
114
114
|
if __name__ == "__main__":
|
|
@@ -12,6 +12,7 @@ from __future__ import annotations
|
|
|
12
12
|
|
|
13
13
|
import gc
|
|
14
14
|
from contextlib import suppress
|
|
15
|
+
from dataclasses import fields
|
|
15
16
|
from pathlib import Path
|
|
16
17
|
from typing import Final
|
|
17
18
|
|
|
@@ -21,12 +22,13 @@ from matplotlib import cm, colors
|
|
|
21
22
|
from matplotlib.ticker import StrMethodFormatter
|
|
22
23
|
from numpy.typing import NDArray
|
|
23
24
|
|
|
24
|
-
import mergeron.core.guidelines_standards as
|
|
25
|
+
import mergeron.core.guidelines_standards as gsl
|
|
25
26
|
import mergeron.gen.data_generation as dgl
|
|
26
27
|
import mergeron.gen.guidelines_tests as gtl
|
|
27
28
|
import mergeron.gen.investigations_stats as isl
|
|
28
29
|
from mergeron import DATA_DIR
|
|
29
30
|
from mergeron.core.pseudorandom_numbers import DIST_PARMS_DEFAULT
|
|
31
|
+
from mergeron.gen import ShareSpec
|
|
30
32
|
|
|
31
33
|
PROG_PATH = Path(__file__)
|
|
32
34
|
|
|
@@ -37,14 +39,10 @@ blosc_filters = ptb.Filters(
|
|
|
37
39
|
|
|
38
40
|
|
|
39
41
|
def gen_plot_data(
|
|
40
|
-
_market_data: dgl.
|
|
41
|
-
_std_vec:
|
|
42
|
-
_pcm_firm2_star: float
|
|
43
|
-
_test_regime: gtl.UPPTestRegime
|
|
44
|
-
isl.PolicySelector.CLRN,
|
|
45
|
-
gtl.GUPPIWghtngSelector.MAX,
|
|
46
|
-
None,
|
|
47
|
-
),
|
|
42
|
+
_market_data: dgl.MarketDataSample,
|
|
43
|
+
_std_vec: gsl.GuidelinesSTD,
|
|
44
|
+
_pcm_firm2_star: float,
|
|
45
|
+
_test_regime: gtl.UPPTestRegime,
|
|
48
46
|
/,
|
|
49
47
|
*,
|
|
50
48
|
h5handle: ptb.File | None = None,
|
|
@@ -59,14 +57,19 @@ def gen_plot_data(
|
|
|
59
57
|
))
|
|
60
58
|
del _m1
|
|
61
59
|
|
|
62
|
-
|
|
60
|
+
_upp_test_raw = gtl.gen_upp_arrays(
|
|
63
61
|
_std_vec,
|
|
64
|
-
dgl.
|
|
62
|
+
dgl.MarketDataSample(*[
|
|
63
|
+
_pcm_array.astype(_f.type)
|
|
64
|
+
if _f.name == "pcm_array"
|
|
65
|
+
else getattr(_market_data, _f.name)
|
|
66
|
+
for _f in fields(_market_data)
|
|
67
|
+
]),
|
|
65
68
|
_test_regime,
|
|
66
69
|
)
|
|
67
70
|
|
|
68
|
-
_gbd_test_rows = np.where(
|
|
69
|
-
del
|
|
71
|
+
_gbd_test_rows = np.where(_upp_test_raw.guppi_test_simple)[0]
|
|
72
|
+
del _upp_test_raw
|
|
70
73
|
|
|
71
74
|
_qtyshr_firm1_inv, _qtyshr_firm2_inv = (
|
|
72
75
|
_market_data.frmshr_array[_gbd_test_rows][:, [0]],
|
|
@@ -99,7 +102,7 @@ def gen_plot_data(
|
|
|
99
102
|
)
|
|
100
103
|
|
|
101
104
|
_pcm_sorter = np.argsort(_pcm_plotter, axis=0)
|
|
102
|
-
if
|
|
105
|
+
if test_regime.resolution != isl.PolicySelector.CLRN:
|
|
103
106
|
_pcm_sorter = _pcm_sorter[::-1, :]
|
|
104
107
|
_qtyshr_firm1_plotter = _qtyshr_firm1_inv[_pcm_sorter]
|
|
105
108
|
_qtyshr_firm2_plotter = _qtyshr_firm2_inv[_pcm_sorter]
|
|
@@ -118,14 +121,16 @@ def gen_plot_data(
|
|
|
118
121
|
|
|
119
122
|
# Generate market data
|
|
120
123
|
def _main(
|
|
121
|
-
_hmg_pub_year:
|
|
124
|
+
_hmg_pub_year: gsl.HMGPubYear,
|
|
122
125
|
_market_sample_spec: dgl.MarketSampleSpec,
|
|
123
126
|
_test_regime: gtl.UPPTestRegime,
|
|
124
127
|
_save_data_to_file: gtl.SaveData,
|
|
125
128
|
) -> None:
|
|
126
129
|
guidelins_std_vec = getattr(
|
|
127
|
-
|
|
128
|
-
"safeharbor"
|
|
130
|
+
gsl.GuidelinesStandards(_hmg_pub_year),
|
|
131
|
+
"safeharbor"
|
|
132
|
+
if test_regime.resolution == isl.PolicySelector.ENFT
|
|
133
|
+
else "presumption",
|
|
129
134
|
)
|
|
130
135
|
|
|
131
136
|
_, _r_bar, _g_bar, _divr_bar, *_ = guidelins_std_vec
|
|
@@ -140,14 +145,14 @@ def _main(
|
|
|
140
145
|
)
|
|
141
146
|
_fig_norm = colors.Normalize(0.0, 1.0)
|
|
142
147
|
_cmap_kwargs = {"cmap": "cividis", "norm": _fig_norm}
|
|
143
|
-
_plt, _, _, _set_axis_def =
|
|
148
|
+
_plt, _, _, _set_axis_def = gsl.boundary_plot()
|
|
144
149
|
|
|
145
150
|
_fig_2dsg = _plt.figure(figsize=(8.5, 9.5), dpi=600)
|
|
146
151
|
|
|
147
152
|
_fig_grid = _fig_2dsg.add_gridspec(
|
|
148
153
|
nrows=1, ncols=2, figure=_fig_2dsg, width_ratios=[6, 0.125], wspace=0.0
|
|
149
154
|
)
|
|
150
|
-
|
|
155
|
+
_fig_grid_gbd = _fig_grid[0, 0].subgridspec(
|
|
151
156
|
nrows=3, ncols=1, wspace=0, hspace=0.125
|
|
152
157
|
)
|
|
153
158
|
|
|
@@ -156,7 +161,7 @@ def _main(
|
|
|
156
161
|
_g_bar / _divr_bar,
|
|
157
162
|
_g_bar / _r_bar,
|
|
158
163
|
)):
|
|
159
|
-
_ax_now = _fig_2dsg.add_subplot(
|
|
164
|
+
_ax_now = _fig_2dsg.add_subplot(_fig_grid_gbd[_ax_row, 0])
|
|
160
165
|
_ax_now = _set_axis_def(_ax_now, mktshares_plot_flag=True)
|
|
161
166
|
_ax_now.set_xlabel(None)
|
|
162
167
|
_ax_now.set_ylabel(None)
|
|
@@ -237,10 +242,10 @@ def _main(
|
|
|
237
242
|
|
|
238
243
|
_base_name = DATA_DIR / "{}_{}Rate_{}gbar{}PCT_{}Recapture".format(
|
|
239
244
|
PROG_PATH.stem,
|
|
240
|
-
f"{
|
|
245
|
+
f"{test_regime.resolution}".capitalize(),
|
|
241
246
|
_hmg_pub_year,
|
|
242
247
|
f"{_g_bar * 100:02.0f}",
|
|
243
|
-
market_sample_spec.share_spec
|
|
248
|
+
market_sample_spec.share_spec.recapture_spec,
|
|
244
249
|
)
|
|
245
250
|
_my_fig_2dsg_savepath = DATA_DIR / f"{_base_name}_2DScatterGrid.pdf"
|
|
246
251
|
print(f"Save 2D plot to, {f'"{_my_fig_2dsg_savepath}"'}")
|
|
@@ -250,14 +255,14 @@ def _main(
|
|
|
250
255
|
if __name__ == "__main__":
|
|
251
256
|
# Get Guidelines parameter values
|
|
252
257
|
hmg_pub_year: Final = 2023
|
|
253
|
-
test_regime: gtl.UPPTestRegime = (
|
|
254
|
-
isl.PolicySelector.ENFT,
|
|
255
|
-
gtl.GUPPIWghtngSelector.MIN,
|
|
256
|
-
gtl.GUPPIWghtngSelector.MIN,
|
|
258
|
+
test_regime: gtl.UPPTestRegime = gtl.UPPTestRegime(
|
|
259
|
+
isl.PolicySelector.ENFT, gtl.UPPAggrSelector.MIN, gtl.UPPAggrSelector.MIN
|
|
257
260
|
)
|
|
258
261
|
r_bar = getattr(
|
|
259
|
-
|
|
260
|
-
"presumption"
|
|
262
|
+
gsl.GuidelinesStandards(hmg_pub_year),
|
|
263
|
+
"presumption"
|
|
264
|
+
if test_regime.resolution == isl.PolicySelector.ENFT
|
|
265
|
+
else "safeharbor",
|
|
261
266
|
).rec
|
|
262
267
|
|
|
263
268
|
sample_sz = 10**7
|
|
@@ -265,7 +270,7 @@ if __name__ == "__main__":
|
|
|
265
270
|
market_sample_spec = dgl.MarketSampleSpec(
|
|
266
271
|
sample_sz,
|
|
267
272
|
r_bar,
|
|
268
|
-
share_spec=
|
|
273
|
+
share_spec=ShareSpec(
|
|
269
274
|
dgl.RECConstants.INOUT, dgl.SHRConstants.UNI, DIST_PARMS_DEFAULT, None
|
|
270
275
|
),
|
|
271
276
|
)
|