如何整理基本交易机器人的范围



我用这个视频(https://www.youtube.com/watch?v=SEQbb8w7VTw)制作了股票交易机器人。但是,我想编辑它,以便每次股价上涨时,机器人都会买入,每次股票下跌时,它都会卖出(我知道这是一个糟糕的交易策略,但我只想尝试我的 python 技能)。但是,我总是收到错误 ValueError:即使我编辑 I 值或增加数据长度,252 也不在范围内。

# Description: This program uses the dual moving average crossover to determine when to buy and sell stock
import pandas as pd
import numpy as np
from datetime import datetime
import matplotlib.pyplot as plt


#Store the data
AAPL = pd.read_csv('AAPL.csv')
#Show the data
print(AAPL)


#Create a new data frame to store all the data
data = pd.DataFrame()
data['AAPL'] = AAPL['Adj Close']

#Create a function to signal when to buy and sell the asset/stock
def buy_sell(data):
sigPriceBuy = []
sigPriceSell = []
for i in range(len(data)):
#Problem is here
if data['AAPL'][i+1] > data['AAPL'][i]:
sigPriceBuy.append(data['AAPL'][i])
sigPriceSell.append(np.nan)
elif data['AAPL'][i+1] < data['AAPL'][i]:
sigPriceBuy.append(np.nan)
sigPriceSell.append(data['AAPL'][i])
else:
sigPriceBuy.append(np.nan)
sigPriceSell.append(np.nan)
return (sigPriceBuy, sigPriceSell)
#Store the buy and sell data into a variable
buy_sell = buy_sell(data)
print(buy_sell)
data['Buy_Signal_Price'] = buy_sell[0]
data['Sell_Signal_Price'] = buy_sell[0]
#Visualize tha data and strategy to buy and sell stock
plt.figure(figsize=(12.6, 4.6))
plt.plot(AAPL['Adj Close'], label='AAPL', alpha = 0.35)
plt.scatter(data.index, data['Buy_Signal_Price'], label='Buy', marker='^', color='green')
plt.scatter(data.index, data['Sell_Signal_Price'], label='Sell', marker='v', color='red')
plt.title('Apple Adj. Close Price History')
plt.xlabel('17/6/2021 - 17/6/2021')
plt.ylabel('Adj. Close Price USD ($)')
plt.legend(loc='upper left')
plt.show()
print(data)

这不是一个好方法,但正如您正确指出的那样,您的问题就在这里:

for i in range(len(data)):
if data['AAPL'][i+1] > data['AAPL'][i]:

您尝试在上次迭代时访问 i+1 处的数据,该数据不可用。试试这个:

for i in range(len(data)-1):
if data['AAPL'][i+1] > data['AAPL'][i]:

作为最后一个索引值,您需要一个np.nan来匹配索引长度:

def buy_sell(data):
sigPriceBuy = []
sigPriceSell = []
for i in range(len(data)):
#Problem is here
if data['AAPL'][i+1] > data['AAPL'][i]:
sigPriceBuy.append(data['AAPL'][i])
sigPriceSell.append(np.nan)
elif data['AAPL'][i+1] < data['AAPL'][i]:
sigPriceBuy.append(np.nan)
sigPriceSell.append(data['AAPL'][i])
else:
sigPriceBuy.append(np.nan)
sigPriceSell.append(np.nan)
sigPriceBuy.append(np.nan)
sigPriceSell.append(np.nan)
return (sigPriceBuy, sigPriceSell)

如果你对相邻的值有循环问题,那么好的python方法是使用zip函数,比如,我不知道csv中有什么,所以做一个简单的例子你会得到想法

for curnt_price,next_price in zip(data['AAPL'],data['AAPL'][1:]):
print(curnt_price,next_price) # so you don't have to IndexError

但是在您的问题中,您遇到了 ValueError,因此请参阅数据帧的索引长度和buy_sell返回列表的长度。 总会有一个索引短,因为我们正在比较 adjcent 值,所以你可以按照 Misantroop 在他的答案中建议的那样为这两个值添加np.nan,或者你简单地传递Series这将像这样添加nan自我

data['Buy_Signal_Price'] = pd.Series(buy_sell[0])
data['Sell_Signal_Price'] = pd.Sereis(buy_sell[1])

*请注意您分配buy_sell0Buy_Signal_PriceSell_Signal_Price,这可能会导致错误的结果。

相关内容

最新更新