我正在尝试用熊猫回测移动平均线交叉策略。
首先,我定义了一个类 (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
相关分类