grab 10 expirations
This commit is contained in:
parent
9d1d9470f9
commit
e7968ac88d
@ -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
|
||||
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user