grab 10 expirations
This commit is contained in:
parent
9d1d9470f9
commit
e7968ac88d
@ -9,6 +9,9 @@ import pandas as pd
|
|||||||
import yfinance as yf
|
import yfinance as yf
|
||||||
|
|
||||||
|
|
||||||
|
DEFAULT_EXPIRATION_LIMIT = 10
|
||||||
|
|
||||||
|
|
||||||
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
||||||
parser = argparse.ArgumentParser(
|
parser = argparse.ArgumentParser(
|
||||||
description="Export Yahoo Finance option chains for a symbol to CSV.",
|
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(
|
parser.add_argument(
|
||||||
"--all-expirations",
|
"--all-expirations",
|
||||||
action="store_true",
|
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(
|
parser.add_argument(
|
||||||
"--calls-only",
|
"--calls-only",
|
||||||
@ -43,7 +49,10 @@ def parse_args(argv: list[str] | None = None) -> argparse.Namespace:
|
|||||||
|
|
||||||
|
|
||||||
def pick_expirations(
|
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]]:
|
) -> tuple[list[str], list[str]]:
|
||||||
available = list(ticker.options or [])
|
available = list(ticker.options or [])
|
||||||
if not available:
|
if not available:
|
||||||
@ -58,7 +67,8 @@ def pick_expirations(
|
|||||||
elif include_all:
|
elif include_all:
|
||||||
targets = available
|
targets = available
|
||||||
else:
|
else:
|
||||||
targets = [available[0]]
|
limit = default_limit if default_limit is not None else 1
|
||||||
|
targets = available[:limit]
|
||||||
|
|
||||||
return targets, available
|
return targets, available
|
||||||
|
|
||||||
@ -99,12 +109,16 @@ def main(argv: list[str] | None = None) -> int:
|
|||||||
|
|
||||||
include_calls = not args.puts_only
|
include_calls = not args.puts_only
|
||||||
include_puts = not args.calls_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)
|
ticker = yf.Ticker(args.symbol)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
target_expirations, available_expirations = pick_expirations(
|
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:
|
except (ValueError, RuntimeError) as exc:
|
||||||
print(f"error: {exc}", file=sys.stderr)
|
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"Wrote {len(options_df)} rows across {len(target_expirations)} expiration(s) "
|
||||||
f"to {output_path}"
|
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
|
return 0
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user