def format_value(value: int) -> str:
"""Format a dollar value in thousands (as reported in 13F)."""
if value >= 1_000_000:
return f"${value / 1_000_000:,.1f}B"
if value >= 1_000:
return f"${value / 1_000:,.1f}M"
return f"${value:,}K"
def format_shares(shares: int) -> str:
"""Format a share count for display."""
if shares >= 1_000_000:
return f"{shares / 1_000_000:,.2f}M"
if shares >= 1_000:
return f"{shares / 1_000:,.1f}K"
return f"{shares:,}"
def generate_report(
manager_name: str,
cik: str,
current_period: str,
previous_period: str,
changes: dict[str, list[dict]],
) -> str:
"""Generate a markdown report of holdings changes."""
lines = []
now = datetime.now().strftime("%Y-%m-%d %H:%M UTC")
lines.append(f"# 13F Holdings Report: {manager_name}")
lines.append(f"")
lines.append(f"**CIK:** {cik} ")
lines.append(f"**Current period:** {current_period} ")
lines.append(f"**Previous period:** {previous_period} ")
lines.append(f"**Generated:** {now}")
lines.append("")
# Summary
lines.append("## Summary")
lines.append("")
lines.append(f"| Metric | Count |")
lines.append(f"|--------|-------|")
lines.append(f"| New positions | {len(changes['new_positions'])} |")
lines.append(f"| Closed positions | {len(changes['closed_positions'])} |")
lines.append(f"| Increased | {len(changes['increased'])} |")
lines.append(f"| Decreased | {len(changes['decreased'])} |")
lines.append(f"| Unchanged | {len(changes['unchanged'])} |")
lines.append("")
# New positions
if changes["new_positions"]:
lines.append("## New Positions")
lines.append("")
table = [
[p["issuer"], p["cusip"], format_shares(p["shares"]), format_value(p["value"])]
for p in changes["new_positions"][:20]
]
lines.append(
tabulate(
table,
headers=["Issuer", "CUSIP", "Shares", "Value"],
tablefmt="github",
)
)
lines.append("")
# Closed positions
if changes["closed_positions"]:
lines.append("## Closed Positions")
lines.append("")
table = [
[p["issuer"], p["cusip"], format_shares(p["shares"]), format_value(p["value"])]
for p in changes["closed_positions"][:20]
]
lines.append(
tabulate(
table,
headers=["Issuer", "CUSIP", "Shares", "Value"],
tablefmt="github",
)
)
lines.append("")
# Increased positions
if changes["increased"]:
lines.append("## Increased Positions")
lines.append("")
table = [
[
p["issuer"],
format_shares(p["prev_shares"]),
format_shares(p["curr_shares"]),
f"+{format_shares(abs(p['share_change']))}",
f"+{p['pct_change']:.1f}%",
]
for p in changes["increased"][:20]
]
lines.append(
tabulate(
table,
headers=["Issuer", "Previous", "Current", "Change", "% Change"],
tablefmt="github",
)
)
lines.append("")
# Decreased positions
if changes["decreased"]:
lines.append("## Decreased Positions")
lines.append("")
table = [
[
p["issuer"],
format_shares(p["prev_shares"]),
format_shares(p["curr_shares"]),
f"-{format_shares(abs(p['share_change']))}",
f"{p['pct_change']:.1f}%",
]
for p in changes["decreased"][:20]
]
lines.append(
tabulate(
table,
headers=["Issuer", "Previous", "Current", "Change", "% Change"],
tablefmt="github",
)
)
lines.append("")
lines.append("---")
lines.append(
"*Data sourced from SEC EDGAR via SEC API. "
"Values in 13F are reported in thousands of dollars.*"
)
return "\n".join(lines)