diff --git a/options_scraper.py b/options_scraper.py index ddac477..c0bfe38 100644 --- a/options_scraper.py +++ b/options_scraper.py @@ -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