From afd33102bd489bd96fdaad9f45bda3dd3cbd8894 Mon Sep 17 00:00:00 2001 From: moshferatu Date: Thu, 8 Feb 2024 03:22:31 -0800 Subject: [PATCH] Add helper utility for retrieving and interacting with an options chain --- options_chain.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 options_chain.py diff --git a/options_chain.py b/options_chain.py new file mode 100644 index 0000000..6c3d2f7 --- /dev/null +++ b/options_chain.py @@ -0,0 +1,38 @@ +from datetime import datetime +from dotenv import load_dotenv +from os import getenv + +from tradestation import TradeStationClient + +from option_type import OptionType + +load_dotenv() + +class OptionsChain: + + def __init__(self, symbol, expiration): + self.symbol = symbol + self.expiration = expiration + self.options_chain = self.get_options_chain(symbol, expiration) + + def get_options_chain(self, symbol: str, expiration: datetime): + tradestation_client = TradeStationClient(getenv('TRADESTATION_REFRESH_TOKEN')) + return tradestation_client.get_options_chain(symbol, expiration) + + def options_by_type(self, option_type: OptionType): + return self.options_chain[self.options_chain['Type'] == option_type.value].copy() + + def closest_contract_by_credit(self, target_credit: float, option_type: OptionType): + options = self.options_by_type(option_type) + options['Credit Distance'] = abs(options['Bid'] - target_credit) + return options.loc[options['Credit Distance'].idxmin()] + + def closest_contract_by_delta(self, target_delta: float, option_type: OptionType): + options = self.options_by_type(option_type) + options['Delta Distance'] = abs(options['Delta'] - target_delta) + return options.loc[options['Delta Distance'].idxmin()] + + def closest_contract_by_strike(self, target_strike: float, option_type: OptionType): + options = self.options_by_type(option_type) + options['Strike Distance'] = abs(options['Strike'] - target_strike) + return options.loc[options['Strike Distance'].idxmin()] \ No newline at end of file