← Files Stock & ETF Research PanelARCHIVED FILE
skills/screen-stocks-etfs/scripts/graham_growth.py
1.25 KB · Oct 2, 2026 · 00:30 UTC
#!/usr/bin/env python3
"""Calculate Graham revised growth-formula bear/base/bull values."""
import argparse
import json
def graham_value(eps: float, growth_percent: float, aaa_yield_percent: float) -> float:
if eps <= 0:
raise ValueError("EPS must be positive")
if aaa_yield_percent <= 0:
raise ValueError("AAA yield must be positive")
return eps * (8.5 + 2 * growth_percent) * 4.4 / aaa_yield_percent
def main() -> None:
parser = argparse.ArgumentParser()
parser.add_argument("--eps", type=float, required=True)
parser.add_argument("--aaa-yield", type=float, required=True)
parser.add_argument("--bear-growth", type=float, required=True)
parser.add_argument("--base-growth", type=float, required=True)
parser.add_argument("--bull-growth", type=float, required=True)
args = parser.parse_args()
growths = [args.bear_growth, args.base_growth, args.bull_growth]
if growths != sorted(growths):
raise ValueError("Growth assumptions must satisfy bear <= base <= bull")
values = {
label: round(graham_value(args.eps, growth, args.aaa_yield), 2)
for label, growth in zip(("bear", "base", "bull"), growths)
}
print(json.dumps(values, sort_keys=True))
if __name__ == "__main__":
main()
SHA-256: 5048c10c641ebfe7c6b7898a254ed990d924c4fe667ca3f8a7aa1526bb092774