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()] def __repr__(self) -> str: return str(self.options_chain) if __name__ == '__main__': options_chain = OptionsChain('$SPXW.X', datetime.now()) print(options_chain) print(options_chain.closest_contract_by_credit(5.0, OptionType.PUT))