https://www.backtrader.com/home/helloalgotrading/
這個sample直接跑會有error。有2個地方要改,改了才會好。
(還真麻煩,我以為一下載就可以用 )
1) Yahoo下載報錯
- File "D:\92-investment-python\backtrader\feed.py", line 674, in start
- self.f = io.open(self.p.dataname, 'r')
- FileNotFoundError: [Errno 2] No such file or directory: 'MSFT'
複製代碼
解決方法在這裡看到的
https://community.backtrader.com ... yahoofinance-data/2
用下面這個寫法
- import yfinance as yf
- import backtrader as bt
- data = bt.feeds.PandasData(dataname=yf.download('TSLA', '2018-01-01', '2019-01-01'))
- cerebro = bt.Cerebro()
- cerebro.adddata(data)
複製代碼
2) 解決這個又有另一個問題
在使用backtrader时,遇到 ImportError: cannot import name ‘warnings‘ from ‘matplotlib.dates‘ 报错的解决方法
解法
https://blog.csdn.net/m0_65167078/article/details/121942610
使用matplotlib==3.2.2版本
請打 pip install matplotlib==3.2.2
以上解決後終於有個hello world了!
完整程式如下
- from datetime import datetime
- import backtrader as bt
- import yfinance as yf
- # Create a subclass of Strategy to define the indicators and logic
- class SmaCross(bt.Strategy):
- # list of parameters which are configurable for the strategy
- params = dict(
- pfast=10, # period for the fast moving average
- pslow=30 # period for the slow moving average
- )
- def __init__(self):
- sma1 = bt.ind.SMA(period=self.p.pfast) # fast moving average
- sma2 = bt.ind.SMA(period=self.p.pslow) # slow moving average
- self.crossover = bt.ind.CrossOver(sma1, sma2) # crossover signal
- def next(self):
- if not self.position: # not in the market
- if self.crossover > 0: # if fast crosses slow to the upside
- self.buy() # enter long
- elif self.crossover < 0: # in the market & cross to the downside
- self.close() # close long position
- cerebro = bt.Cerebro() # create a "Cerebro" engine instance
- # Create a data feed
- #data = bt.feeds.YahooFinanceData(dataname='MSFT',
- # fromdate=datetime(2011, 1, 1),
- # todate=datetime(2012, 12, 31))
- data = bt.feeds.PandasData(dataname=yf.download('MSFT', '2011-01-01', '2012-12-31'))
- cerebro.adddata(data) # Add the data feed
- cerebro.addstrategy(SmaCross) # Add the trading strategy
- cerebro.run() # run it all
- cerebro.plot() # and plot it with a single command
複製代碼
|