为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕尼黑8549860 2021-06-11 14:44:00
我正在尝试用熊猫回测移动平均线交叉策略。首先,我定义了一个类 (Book),其中包含股票数量、现金金额和资产总额。在这个类中有 3 个函数可以在生成买入或卖出信号时计算账面状态。这是我的代码,但是当我测试时,我可以发现股票和总资产的错误计算。有什么问题?import pandas as pdfrom pandas_datareader import data as pdr# download dataframetest = 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.moneytest['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       assetdate                                                      1999-12-31  146.875000  0.000000  1.000000e+02  100.0000002000-01-03  145.437500  0.000000  1.000000e+02  100.0000002000-01-04  139.750000  0.000000  1.000000e+02  100.0000002000-01-05  140.000000  0.000000  1.000000e+02  100.0000002000-01-06  137.750000  0.000000  1.000000e+02  100.0000002000-01-07  145.750000  0.000000  1.000000e+02  100.0000002000-01-10  146.250000  0.000000  1.000000e+02  100.000000
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 121 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号