Python 金融预测

Python 金融预测,python,fft,option,prediction,Python,Fft,Option,Prediction,我尝试用FFT方法预测期权看跌期权和看涨期权,但我的代码中有一些问题: options = pd.read_csv("/Users/***/Documents/relevantoptions2",sep =',',header = 0) def oneorzero(): L=[] for i in range( 0,options.shape[0]): if (options.optiontype[i]=='put'): L.append(1) else :

我尝试用FFT方法预测期权看跌期权和看涨期权,但我的代码中有一些问题:

options = pd.read_csv("/Users/***/Documents/relevantoptions2",sep =',',header = 0)

def oneorzero():
L=[]
for i in range( 0,options.shape[0]):
    if (options.optiontype[i]=='put'):
        L.append(1)
    else :
        L.append(0)
options.optiontype=L        
oneorzero()

options=options.drop_duplicates(subset=None, keep='first', inplace=False)


prices=pd.DataFrame()
prices['settledate']= options.settledate.drop_duplicates(keep='first', 
inplace=False)
prices['settle_sp_price']= 
options.settle_sp_price.drop_duplicates(keep='first', inplace=False)
prices['return'] = prices.settle_sp_price.pct_change().dropna()


prices['settleVol'] =prices['return'].rolling( window=17).std() * 
np.sqrt(17)




prices = prices.fillna(method='ffill').fillna(method='bfill')

prices = prices.reset_index(drop=True)
prices.head()

n=prices.settle_sp_price.size
x=np.arange(0,n)

p1 =sp.polyfit(x, prices.settle_sp_price,3)
pp1 =np.polyval(p1, x)


diff = prices.settle_sp_price-pp1

Y=[]
#for i in range(1,prices.settle_sp_price.size):
# if Y[i] > .1*Y[i]:
#  Y[i] = 0
#  print(Y[i])

Y=np.fft.fft(diff)
PP=np.fft.ifft(Y)

YY=[0]*(prices.settle_sp_price.size+30)
a=[0]*prices.settle_sp_price.size
b=[0]*prices.settle_sp_price.size


#interpolate the difference for 90days
for n in range(prices.settle_sp_price.size,prices.settle_sp_price.size+25):
    YY[n]=0
    for k in range(1,prices.settle_sp_price.size):
     a[k]=np.real(Y[k])
     b[k]=-np.imag(Y[k])
     omk=2*math.pi*(k-1)/prices.settle_sp_price.size 
     YY[n]=YY[n]+a[k]*math.cos(omk*(n-1))+b[k]*math.sin(omk*(n-1))

    YY[n]=-YY[n]/prices.settle_sp_price.size

# create one array for the original and interpolated difference
# between the least squares curve and the stock price. for i=1:415

i=range(prices.settle_sp_price.size)
YY[i]=diff[i]

tot= pp1+YY
我遇到了for循环的第一个问题,我不明白为什么:

文件“C:/Users/***/Documents/Stage gm3/FFT3.py”,第91行,在 如果Y[i]>.1*Y[i]:

索引器:列表索引超出范围

第二个问题,当我将for循环放入注释中时,我得到:

KeyError:范围(0238)


最重要的是第二个问题,因为我可以继续处理第一个问题

您的第一个问题是

Y=[] 
for i in range(1,prices.settle_sp_price.size): 
    if Y[i] > .1*Y[i]: 
    Y[i] = 0 
    print(Y[i])

数组
Y[]
被初始化为空,然后直接尝试访问它的元素,
Y[i]
只能返回一个错误。

当我尝试基于x显示tot时,我得到的曲线与基于价格的x完全相同。结算价格,这是正常的。另一方面,预测没有显示,因为在最后一个for循环之前,YY的大小是250,在与diff相等之后,大小变为238,但我希望它保持在250。您知道问题来自何处以及如何解决吗?

我建议您缩小代码,以便我们帮助您。。。但是,您有一个问题,因为您构造了一个大小
价格的数组。结算\u sp\u price.size
,我猜您试图访问一个高于该值的索引。如何更改代码?是的,但当我没有指定大小时,还有其他问题…尝试删除与重新创建错误无关的所有内容,例如所有显示功能(
plt.XXX
…),“建筑代码”
选项['lag_one']=…
,诸如此类,因为当我删除大小时,我有这个问题:YY[n]=0 Indexer错误:列表分配索引超出范围是的,您不应该删除大小,您应该确保在迭代数组时,索引不会超过数组的大小,因此我必须这样初始化:Y[0]*prices.solite\u sp\u price.size?如果我这样做,我有:plt.plot(abs(Y))TypeError:abs()的操作数类型不正确:'list'。我不知道您想用什么来初始化
Y
,但您必须初始化它是的,使用适当大小的东西。提示可能是执行
Y=np.zero(n)
,然后填充
Y
我按照你的要求做了,但是我有一个返回的密钥范围错误。你的代码无法自行执行,你能解释一下密钥范围错误发生的位置/时间吗?