熊猫移动平均交叉回测错误

我正在尝试用熊猫回测移动平均线交叉策略。


首先,我定义了一个类 (Book),其中包含股票数量、现金金额和资产总额。


在这个类中有 3 个函数可以在生成买入或卖出信号时计算账面状态。


这是我的代码,但是当我测试时,我可以发现股票和总资产的错误计算。


有什么问题?


import pandas as pd

from pandas_datareader import data as pdr


# download dataframe

test = pdr.get_data_yahoo("SPY", start="2000-01-01")


class Book:

    def __init__(self, stocks = 0, money = 100, asset = 0):

        self.stocks = stocks

        self.money = money

        self.asset = asset


    def buy(self, price):

        if self.money == 0:

            return

        self.stocks += self.money/price

        self.money -= (price * self.stocks)

        self.asset = self.stocks * price + self.money


    def sell(self, price):

        if self.stocks == 0:

            return

        self.money += (price * self.stocks)

        self.stocks = 0

        self.asset = self.stocks * price + self.money


    def assetEvaluate(self,price):

        self.asset = self.stocks * price + self.money


test['ma20'] = test.Close.rolling(20).mean()


def macrossover(df, book):

    result = []

    for i, r in df.iterrows():

        if df.Close[i] > df.ma20[i]:

            book.buy(df.Close[i])

        elif df.Close[i] < df.ma20[i]:

            book.sell(df.Close[i])

        else:                        

            book.assetEvaluate(df.Close[i])

        result.append([i,df.Close[i], book.stocks, book.money, book.asset])


    df = pd.DataFrame(result, columns=['date','close','stocks','money','asset'])

    df.set_index('date', inplace=True)

    print(df)


a = Book()

macrossover(test,a)

结果


                 close    stocks         money       asset

date                                                      

1999-12-31  146.875000  0.000000  1.000000e+02  100.000000

2000-01-03  145.437500  0.000000  1.000000e+02  100.000000

2000-01-04  139.750000  0.000000  1.000000e+02  100.000000

2000-01-05  140.000000  0.000000  1.000000e+02  100.000000

2000-01-06  137.750000  0.000000  1.000000e+02  100.000000

2000-01-07  145.750000  0.000000  1.000000e+02  100.000000

2000-01-10  146.250000  0.000000  1.000000e+02  100.000000


慕尼黑8549860
浏览 122回答 1
1回答
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python