简体   繁体   中英

How do you convert a string percent to a float decimal?

How do you convert a string percent to a float decimal? I wrote this code and when I run it I just get back errors like "cannot convert the series to <class 'int'>" and "TypeError: unsupported operand type(s) for /: 'str' and 'int'" the problematic line seems to be "sigma = chain["calls"]['Implied Volatility']" because I think the Implied Volatility is a string and because its a string I can't do mathematical operations with it. here's my code:

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))

This code is unreadable or testable as it references variables that haven't even been declared.

However, if you're question is "How do you convert a string percent to a float decimal?" when dealing with a series, you can do this:

import pandas

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

Or in your case:

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

This code runs pandas.Series.apply on a series with a function passed in (lambda x: [code] refers to a small unnamed function where x is each value in the Series) that chops off the % sign, converts to a float, and divides by 100.

Hope that helps (first stackoverflow answer).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM