试图使这段代码工作,但我不知道我是否传递正确的父类,也正确使用self.data?有没有更简洁的方法来编码这个
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import os
import pandas_datareader as pdr
start = pd.to_datetime("Jan 1st 2013")
end = pd.to_datetime("Dec 31st 2018")
class StockData:
ticker = []
def stock(self,symbol):
self.ticker.clear()
self.ticker.append(symbol)
self.data= web.DataReader(self.ticker,"yahoo", start, end)
class Backtest(StockData):
def prepare_indicators(self):
self.data['SMA1'] = self.data[self.symbol].rolling(self.SMA1).mean()
self.data['SMA2'] = self.data[self.symbol].rolling(self.SMA2).mean()
self.data['SMA_1'] = self.data[self.symbol].rolling(self.SMA1).mean().shift(1)
self.data['SMA_2'] = self.data[self.symbol].rolling(self.SMA2).mean().shift(1)
def backtest_strategy(self, SMA1, SMA2):
self.SMA1 = SMA1
self.SMA2 = SMA2
self.prepare_indicators()
print(self.data)
self.data['Signal'] = np.where((self.data['SMA1'] > self.data['SMA2']) & (self.data['SMA_1'] < self.data['SMA_2']), 1, 0)
self.data['Signal'] = np.where((self.data['SMA1'] < self.data['SMA2']) & (self.data['SMA_1'] > self.data['SMA_2']), 0, self.data['Signal'])
self.data['Sell'] = self.data.apply(lambda x : x['Adj Close'] if x['SMA1'] > x['SMA2'] and x['SMA_1'] < x['SMA_2'] else 0, axis=1)
self.data['Buy'] = self.data.apply(lambda y : y['Adj Close'] if y['SMA1'] < y['SMA2'] and y['SMA_1'] > y['SMA_2'] else 0, axis=1)
self.data['TP'] = self.data['Buy'] + self.data['Sell']
self.data['TP'] = self.data['TP'].replace(to_replace=0, method='ffill')
self.data['Position'] = self.data['Signal'].replace(to_replace=0, method= 'ffill')
self.data['Buy & Hold Returns'] = np.log(self.data['Adj Close'] / self.data['Adj Close'].shift(1))
self.data['Strategy Returns'] = self.data['Buy & Hold Returns'] * Self.data['Position'].shift(1)
self.data[['Buy & Hold Returns', 'Strategy Returns']].cumsum().plot(grid=True, figsize=(9,5))
sma = Backtest()
sma.backtest_strategy(50,200)
AttributeError:“Backtest”对象没有属性“data”
如何在类中定义变量的模式如下:
因此,类中使用的每个变量都应定义为:
类变量也可以在这个类中的其他方法中定义
您的代码包含一个指定self.data的地方, 在StockData.stock方法中,但从未调用此方法
其他引用self.data的地方有以下形式:
所以此时,必须更早地创建这个变量
一种可能的解决方案是添加一个构造函数(可以添加到StockData) 把这个变量设置成你想要的任何值
或者您应该在代码中的某个地方调用股票
另一个概念是:
但您可能应该将append更改为extend。原因是 如果将字符串作为符号传递,它实际上也是一个字符列表, 因此ticker将包含单个字符。 但是如果您更改为extend,则整个字符串将作为一个字符串添加 元素
相关问题 更多 >
编程相关推荐