首页 > 解决方案 > 如何将字符串百分比转换为浮点小数?

问题描述

如何将字符串百分比转换为浮点小数?我编写了这段代码,当我运行它时,我只得到了诸如“无法将系列转换为 <class 'int'>”和“TypeError: unsupported operand type(s) for /: 'str' and 'int'”之类的错误有问题的行似乎是 "sigma = chain["calls"]['Implied Volatility']" 因为我认为 Implied Volatility 是一个字符串,因为它是一个字符串,所以我不能用它做数学运算。这是我的代码:

from yahoo_fin import options
from yahoo_fin import stock_info as si
import numpy as np
from scipy.stats import norm

stock = input("Enter stock symbol: Ex:QQQ ") #this is the stock ticker
expiry = input("Enter option expiration: Ex:11/05/2021 ") # date of expiry

options.get_options_chain(stock)
chain = options.get_options_chain(stock,expiry)

si.get_live_price(stock)
chain["calls"]

r = .025 #risk free interest rate
S = si.get_live_price(stock) #current price of the underlying stock
K = chain["calls"].Strike #the strike price of the option
t = float(input("time until expiry in days  = ")) #days until expiry
T = t/365 #years until expiry
s = chain["calls"]['Implied Volatility'] 
sigma = chain["calls"]['Implied Volatility'] #the Implied Volatility
print(sigma)

def blackScholes(r, S, K, T, sigma): #using the Black-Scholes formula
    "Calculate BS option price for a call/put"
    d1 = (np.log(S/K)+(r+sigma**2/2)*T)/(sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    try:
            price = S*norm.cdf(d1, 0, 1) - K*np.exp(-r*T)*norm.cdf(d2, 0, 1) 
            #print("Option Delta is: ",norm.cdf(d1, 0, 1))
            return price
    except:
        print("Please confirm all option parameters above!!!")
print("Option Value is: ", round(blackScholes(r, S, K, T, sigma),2))

标签: pythonstringapifinanceyahoo-finance

解决方案


此代码不可读或不可测试,因为它引用了甚至尚未声明的变量。

但是,如果您的问题是“如何将字符串百分比转换为浮点小数?” 在处理系列时,您可以这样做:

import pandas

s = pandas.Series(["2%", "2.0%", ".09999%", "100%"]) // example series
s = s.apply(lambda x: float(x[:-1]) / 100)
print(s)

或者在你的情况下:

chain["calls"]["Implied Volatility"] = chain["calls"]["Implied Volatility"].apply(lambda x: float(x[:-1]) / 100)

这段代码在一个系列上运行pandas.Series.apply并传入一个函数(lambda x: [code] 指的是一个小的未命名函数,其中 x 是系列中的每个值),它砍掉 % 符号,转换为浮点数,并除以 100。

希望有帮助(第一个stackoverflow答案)。


推荐阅读