繁体   English   中英

Python 'list.insert()' 只保存计算循环的最后结果

[英]Python 'list.insert()' only saves the last result of calculation loop

我正在使用 Python 制作我的自动股票策略收益率计算程序。 这是我的代码:

import FinanceDataReader as fdr 
import numpy as np
# ...(more modules for python)

pd.options.display.float_format = '{:.5f}'.format

file_list = os.listdir('/home/sejahui/projects/stock_data_excel')

for i in range(20): 

os.chdir('/home/sejahui/projects/stock_data_excel')
odd = file_list[i]

data = pd.read_excel('/home/sejahui/projects/stock_data_excel/'+str(odd))

def calMACD(data, short=5, long=25, signal=9):
    data.sort_index()
    
    data['MVA_25']=data['Close'].ewm(span=long, adjust=False).mean()
    data['MVA_5']=data['Close'].ewm(span=short, adjust=False).mean()
    data['MACD']=data['Close'].ewm(span=short, adjust=False).mean() - data['Close'].ewm(span=long, adjust=False).mean()
    data['Signal']=data['MACD'].ewm(span=signal, adjust=False).mean( )
    #data['Buy_sign']=(data['MACD']-data['Signal']) >=600
    data['Buy_sign']=np.where(data['MACD']-data['Signal'] >=451, 'Buy' , 'Sell' )
    #data['Target_1']=(data['Close']-data['Close'].shift(1))/data['Close'].shift(1)*100
    #data['Target_1']=np.where(data['Buy_sign']=='Buy', (data['Change'])+1,1)
    #data['Target_2']=np.where(data['Buy_sign']=='Sell', (data['Change'])+1,1)
    #data['Real_world']= 1000000*data['Target_1']
    #data['Real_world_2']= 1000000*data['Target_2'] 
    #data['Condition'] = np.where(data['Real_world']<1000000, data['Real_world']-data['Real_world'].shift(-2),1)
    ##data['Condition_2'] = np.where(data['Real_world']<1000000, data['Target_1'].shift(-2),1)
    #data['Moneyflow'] = 
    #plt.plot(data['Date'], data['Real_world'])
    #data[data.Buy_sign !='Sell']
    
    

    '''
    data['Target_1']=np.where(data['Buy_sign']=='Buy', data['Change'],1)
    data['Target_2']=np.where(data['Buy_sign']=='Sell', data ['Change'],1)
    data['Yield']=np.where(data['Buy_sign']=='Sell', data['Target_1']/data['Target_2'],1 )
    '''

    '''
    data['Result']=data['Target_1'].cumprod()
    data['Result_2']=data['Target_2'].cumprod()
    data['??????'] = data['Result'] - data['Result_2']
    '''

    return data


Adjusted = calMACD(data)
Adjusted.drop(['Change'], axis=1, inplace = True)
Filtered = Adjusted[Adjusted.Buy_sign!='Sell'].copy()

#print(Filtered)
#Filtered = (Adjusted.Buy_sign =='Buy') #(Adjusted.Condition = 1.0)
#Master = Adjusted.loc[Adjusted,['Date','Buy_sign','Target_1','Real_world',]]
#print(Adjusted)


def backtester(Filtered):
    Filtered['Change'] = ((Filtered['Close'] - Filtered['Close'].shift(1)) / Filtered['Close'].shift(1))+1
    #data['Target_1']=np.where(data['Buy_sign']=='Buy', (data['Change'])+1,1)
    Filtered['Real_world'] = 1000000*Filtered['Change']
    #Filtered['Condition'] = np.where(Filtered['Real_world']<1000000, Filtered['Real_world'].shift(-2)-Filtered['Real_world'],1)
    Filtered['Condition'] = np.where(Filtered['Real_world']<1000000, Filtered['Change'].shift(-2),1)
    #Filtered['Target_1'] = np.where(Filtered['Buy_sign']=='Buy', (Filtered['Change'])+1,1)
    #Filtered['Condition'] = np.where(Filtered['Real_world']<1000000, Filtered['Real_world'].shift(-2)-Filtered['Real_world'],1)

    return Filtered 
    
s = backtester(Filtered)

e = s[s.Condition!=1.00000]

x = e.dropna()

y = x['Condition']

list_1 = []

write_wb = Workbook()
write_ws = write_wb.create_sheet('MACD&Signal gap data sheet')
write_ws = write_wb.active
write_ws['A1'] = 'Name'
write_ws['B1'] = 'Profit'





try:
    print(geometric_mean(y)*1000000*12)

except StatisticsError as e:
    print ('Sell is empty':',odd)
else:
    d = (geometric_mean(y)*1000000*12)
    print(d,odd)
    list_1.insert(i,d)

 Print(list_1)

这是我困扰的部分:

s = backtester(Filtered)

e = s[s.Condition!=1.00000]

x = e.dropna()

y = x['Condition']

list_1 = []


try:
    print(geometric_mean(y)*1000000*12)

except StatisticsError as e:
    print ('Sell is empty':',odd)

else:
    d = (geometric_mean(y)*1000000*12)
    print(d)
    list_1.insert(d)

print(list_1) 

当我启动有问题的代码时,列表只保存“尝试,除了,否则”function 的最后一个结果。 我的意图是保存所有结果。 我应该进行什么更改以保存所有结果?

这是列表的 output:

 [11772769.197974786]

您的问题是您使用的是insert而不是append和 insert 的主要区别在于您想要插入元素的 position 的第二个参数,当没有提供时,它默认为 0,因此您始终插入相同索引导致列表中只有第一个 position 的最后一个元素。

要解决这个问题,只需使用append代替。

else:
    d = (geometric_mean(y)*1000000*12)
    print(d)
    list_1.append(d)

您想使用 append,而不是插入。 参见 Python 数据结构

list_1.insert(d)更改为list_1.append(d)

插入默认为索引 0,并且每次都更新它。

编辑:刚刚注意到您的答案在问题标题中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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