Python 属性错误:';回测';对象没有属性';数据';,熊猫,SMA交叉

Python 属性错误:';回测';对象没有属性';数据';,熊猫,SMA交叉,python,pandas,moving-average,algorithmic-trading,Python,Pandas,Moving Average,Algorithmic Trading,试图使此代码正常工作,但我不确定是否正确地传递了父类,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") e

试图使此代码正常工作,但我不确定是否正确地传递了父类,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))
将熊猫作为pd导入
将numpy作为np导入
将matplotlib.pyplot作为plt导入
以web形式导入datareader.data
导入操作系统
将U数据读取器作为pdr导入
开始时间=截止日期时间(“2013年1月1日”)
结束=截止日期时间(2018年12月31日)
类别股票数据:
股票代码=[]
def库存(自身,符号):
self.ticker.clear()
self.ticker.append(符号)
self.data=web.DataReader(self.ticker,“yahoo”,开始,结束)
类回溯测试(StockData):
def准备_指示器(自身):
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回测_策略(自我、SMA1、SMA2):
self.SMA1=SMA1
self.SMA2=SMA2
自我准备()
打印(自我数据)
self.data['Signal']=np.where((self.data['SMA1']>self.data['SMA2'])和(self.data['SMA1']self.data['SMA2']),0,self.data['Signal'])
self.data['Sell']=self.data.apply(λx:x['Adj Close']如果x['SMA1']>x['SMA2']和x['SMA1']y['SMA_2']否则为0,轴=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=回测()


sma.回溯测试策略(50200)


AttributeError:“Backtest”对象没有属性“data”

如何在类中定义变量的模式如下:

class Xxxx:
    staticVar = ...

    def __init__(self):
        self.instanceVar = ...
因此,应定义类中使用的每个变量:

  • 作为静态变量(不属于 这个类),在这个类中创建,在任何方法之外
  • 或者作为一个实例变量(由特定实例拥有),由 构造器
类变量也可以在此类中的其他方法中定义

您的代码包含一个指定self.data的位置, 在StockData.stock方法中,但从未调用此方法

您引用self.data的其他地方有以下形式:

 self.data[...] =  self.data[...]...
因此,此时必须提前创建此变量

可能的解决方案之一是添加构造函数(可能是StockData) 并将这个变量设置为您想要的任何值

或者你应该在代码中的某个地方调用stock

另一个概念是:

  • 将此函数转换为构造函数(保留符号参数)
  • 调用sma=Backtest()时,传递此参数的一些值
但您可能应该将append更改为extend。原因是 如果将字符串作为符号传递,它实际上也是一个字符列表, 因此,ticker将包含个字符。 但如果更改为extend,则整个字符串将作为一个字符串添加 元素