【发布时间】:2021-04-07 20:21:26
【问题描述】:
有一个包含许多(比如 10 个)股票名称的 pickle 文件 并且还有一个包含所有库存数据的文件夹 我正在尝试运行代码来进行 MACD 分析,并希望能写下结果买卖时间、价格、头寸、手头现金。 当我走到这一步并试图在所有股票上运行 MACD 时。 但是经过两次循环后,数据加载错误。并重复结果。
'''
import backtrader as bt
import pandas as pd
import pickle
import math
def run_test_macd():
with open("sp500tickers.pickle", "rb") as f:
tickers = pickle.load(f)
cerebro.addstrategy(GoldenCross.gold_cross_class)
for ticker in tickers:
macd_stock_test2(ticker)
def macd_stock_test2(ticker):
# print("stock test")
# print("ticker")
cerebro.broker.set_cash(1000000)
ticker_prices = pd.read_csv('stock_dfs/{}.csv'.format(ticker), index_col='Date', parse_dates=True)
# print(ticker_prices)
# ticker prices
feed = bt.feeds.PandasData(dataname=ticker_prices)
print(feed)
print(ticker)
cerebro.adddata(feed)
# cerebro.addsizer(bt.sizers.FixedSize, stake=1000)
# cerebro.addanalyzer(btanalyzers.DrawDown, _name='drawdown')
# cerebro.addanalyzer(btanalyzers.DrawDown, _name='returns')
print('starting protfolio value: %.2f' % cerebro.broker.getvalue())
cerebro.run()
print('final protfolio value: %.2f' % cerebro.broker.getvalue())
# cerebro.addanalyzer(SQN)
#
# cerebro.addwriter(bt.WriterFile, csv=args.writercsv, rounding=2)
# cerebro.plot(style='candle')
class gold_cross_class(bt.Strategy):
#set parameters to define fast and slow
params = (('fast',40),('slow',150),('order_percentage',0.99),('ticker', "stock"))
#define constractors
def __init__(self):
print("position size:",self.position.size)
self.fast_moving_average=bt.indicators.EMA(
self.data.close, period=self.params.fast, plotname='40 day moving average'
)
self.slow_moving_average = bt.indicators.EMA(
self.data.close, period=self.params.slow, plotname='150 day moving average'
)
self.crossover = bt.indicators.CrossOver(self.fast_moving_average, self.slow_moving_average)
def next(self):
if self.position.size == 0:
if self.crossover >0:
amount_to_invest = (self.params.order_percentage *self.broker.cash)
self.size=math.floor(amount_to_invest/self.data.close)
print("Buy {} shares of {} at {} on {}".format(self.size,self.params.ticker, self.data.close[0],self.data.close[0]))
self.buy(size=self.size)
if self.position.size > 0:
if self.crossover<0:
print("Sell {} shares of {} at {}".format(self.size,self.params.ticker, self.data.close[0]))
self.sell(size=self.size)
'''
【问题讨论】:
-
我想显示购买日期 '''print("在 {} 上的 {} 购买 {} 股 {}".format(self.size,self.params.ticker, self. data.close[0],self.data.Date[0]))''' 有错误信息:'AttributeError: 'Lines_LineSeries_DataSeries_OHLC_OHLCDateTime_Abst' 对象没有属性'Date''
-
使用这个作为日期:self.data.datetime[0]
标签: function loops class backtrader