如何获取相对于Python中X日设定的执行价格Y的期权历史价格?

问题描述 投票:0回答:1

我最近一直在使用 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]

我已经进行了多次实验、尝试和错误,看看什么有效,什么无效。有谁知道如何编码吗?

python yahoo-finance algorithmic-trading
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.

© www.soinside.com 2019 - 2024. All rights reserved.