grab 10 expirations

This commit is contained in:
Peter Hajas 2025-11-27 13:32:53 -07:00
parent 9d1d9470f9
commit e7968ac88d

View File

@ -9,6 +9,9 @@ import pandas as pd
import yfinance as yf
DEFAULT_EXPIRATION_LIMIT = 10
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser = argparse.ArgumentParser(
description="Export Yahoo Finance option chains for a symbol to CSV.",
@ -22,7 +25,10 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
parser.add_argument(
"--all-expirations",
action="store_true",
help="Download every listed expiration (default is the nearest).",
help=(
"Download every listed expiration (default is the first 10 when"
" no --expiration is provided)."
),
)
parser.add_argument(
"--calls-only",
@ -43,7 +49,10 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
def pick_expirations(
ticker: yf.Ticker, requested: str | None, include_all: bool
ticker: yf.Ticker,
requested: str | None,
include_all: bool,
default_limit: int | None,
) -> tuple[list[str], list[str]]:
available = list(ticker.options or [])
if not available:
@ -58,7 +67,8 @@ def pick_expirations(
elif include_all:
targets = available
else:
targets = [available[0]]
limit = default_limit if default_limit is not None else 1
targets = available[:limit]
return targets, available
@ -99,12 +109,16 @@ def main(argv: list[str] | None = None) -> int:
include_calls = not args.puts_only
include_puts = not args.calls_only
include_all_expirations = args.all_expirations
default_limit = (
DEFAULT_EXPIRATION_LIMIT if args.expiration is None and not args.all_expirations else None
)
ticker = yf.Ticker(args.symbol)
try:
target_expirations, available_expirations = pick_expirations(
ticker, args.expiration, args.all_expirations
ticker, args.expiration, include_all_expirations, default_limit
)
except (ValueError, RuntimeError) as exc:
print(f"error: {exc}", file=sys.stderr)
@ -135,10 +149,6 @@ def main(argv: list[str] | None = None) -> int:
f"Wrote {len(options_df)} rows across {len(target_expirations)} expiration(s) "
f"to {output_path}"
)
if args.expiration is None and not args.all_expirations:
print(
f"Tip: use --all-expirations to fetch every date. Available: {', '.join(available_expirations)}"
)
return 0