options-automation/options_chain.py

58 lines
2.3 KiB
Python

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 spread_mid_price(self, near_strike: float, far_strike: float, option_type: OptionType):
options = self.options_by_type(option_type)
near_leg = options[options['Strike'] == near_strike]
far_leg = options[options['Strike'] == far_strike]
near_leg_mid = (near_leg['Ask'] + near_leg['Bid'].clip(lower = 0)) / 2.0
far_leg_mid = (far_leg['Ask'] + far_leg['Bid'].clip(lower = 0)) / 2.0
spread_mid = near_leg_mid.iloc[0] - far_leg_mid.iloc[0]
return spread_mid
def __repr__(self) -> str:
return self.options_chain.to_string()
if __name__ == '__main__':
options_chain = OptionsChain('$SPXW.X', datetime.now())
print(options_chain)
print(options_chain.closest_contract_by_credit(5.0, OptionType.PUT))