我最近一直在使用 yahoofinance 来回测我制定的交易算法。问题是,我试图在算法中编写某些元素,这些元素应该很容易实现,但谷歌、文档、堆栈溢出、媒体等都没有告诉我如何编码。
我似乎不知道该怎么做的问题: 从执行前 30 天的角度获取执行价格为 X 的股票的历史期权价格。
我可以做第一半,但不能做第二个。
以下是我尝试过但没有成功的一些事情:
# option_price = option_chain[option_chain['contractSymbol'] == "AAPL231020C00140000"]["lastPrice"].iloc[0]
expiration_date = indicatordf['Date'] + dt.timedelta(days=30)
print(expiration_date)
option_price = get_historical_option_price(tickerName, expiration_date)
def get_historical_option_priceAtExp(ticker, expiration_date, option_type="call", strike="at-the-money"):
df = yf.download(ticker, period="1d", interval="1m", expiration_date=expiration_date)
df = df.loc[(df["Option Type"] == option_type) & (df["Strike"] == strike)]
df = df.loc[df["Expiration Date"] == expiration_date]
return df.iloc[-1, 0]
我已经进行了多次实验、尝试和错误,看看什么有效,什么无效。有谁知道如何编码吗?
代码:
import yfinance as yf
import datetime
def get_option_data(stock_symbol, expiration_date, option_type, strike):
stock = yf.Ticker(stock_symbol)
option_chain = stock.option_chain(expiration_date)
options = getattr(option_chain, "calls" if option_type.startswith("call") else "puts")
option_data = options[options["strike"] == strike]
return option_data
def get_option_history_data(contract_symbol, days_before_expiration=30):
option = yf.Ticker(contract_symbol)
option_info = option.info
option_expiration_date = datetime.datetime.fromtimestamp(option_info["expireDate"])
start_date = option_expiration_date - datetime.timedelta(days=days_before_expiration)
option_history = option.history(start=start_date)
return option_history
def main(*args):
# Example:
stock_symbol = "AAPL"
expiration_date = "2023-10-27"
expiration_date = None
option_type = "call"
strike = 170.0
option_data = get_option_data(stock_symbol, expiration_date, option_type, strike)
for i, od in option_data.iterrows():
contract_symbol = od["contractSymbol"]
option_history = get_option_history_data(contract_symbol)
first_option_history = option_history.iloc[0]
first_option_history_date = option_history.index[0]
first_option_history_close = first_option_history["Close"]
print("For {}, the closing price was ${:.2f} on {}.".format(
contract_symbol,
first_option_history_close,
first_option_history_date
))
if __name__ == "__main__":
main()
结果:
AAPL231027C00170000,2023年9月27日收盘价为5.40美元 00:00:00-04:00.