forked from laffuste/weekend-backtrader
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.py
85 lines (60 loc) · 2.51 KB
/
main.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
from __future__ import (absolute_import, division, print_function,
unicode_literals)
import datetime # For datetime objects
import os.path # To manage paths
import sys # To find out the script name (in argv[0])
import backtrader as bt
import backtrader.analyzers as btanalyzers
import settings
from strategy.turtle import TurtleStrategy
from os import listdir
from os.path import isfile, join
DATA_FEED_PATH = 'data\\feed\\'
DATA_SUFFIX = '.csv'
def _load_datafeed(cerebro: bt.Cerebro):
"""Load all feeds into backtrader"""
# Datas are in a subfolder of the samples. Need to find where the script is located
# because it could have been called from anywhere
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
feeds = [f for f in listdir(DATA_FEED_PATH) if isfile(join(DATA_FEED_PATH, f)) and DATA_SUFFIX in f]
for feed in feeds:
data_path = os.path.join(modpath, f'{DATA_FEED_PATH}{feed}')
# Data Feed
data = bt.feeds.YahooFinanceCSVData(
dataname=data_path,
# DO NOT PASS VALUES BEFORE THIS DATE
fromdate=settings.FROM_DATE,
# DO NOT PASS VALUES AFTER THIS DATE
todate=settings.TO_DATE,
reverse=False)
cerebro.adddata(data)
print(f"Added {len(feeds)} data feeds files")
def _print_summary(thestrat):
print()
print('============ Summary ================')
print('Sharpe Ratio: ', thestrat.analyzers.mysharpe.get_analysis()['sharperatio'])
print('Annual returns\n ',
"\n ".join([f'{year}: {ret}' for year, ret in thestrat.analyzers.annualret.get_analysis().items()]))
print('Total returns\n ',
"\n ".join([f'{year}: {ret}' for year, ret in thestrat.analyzers.returns.get_analysis().items()]))
print('=====================================')
def execute_backtest():
cerebro = bt.Cerebro()
# Strategy
strats = cerebro.addstrategy(TurtleStrategy)
# Analyser
cerebro.addanalyzer(btanalyzers.SharpeRatio, _name='mysharpe')
cerebro.addanalyzer(btanalyzers.AnnualReturn, _name='annualret')
cerebro.addanalyzer(btanalyzers.Returns, _name='returns')
_load_datafeed(cerebro)
# Initial Cash
cerebro.broker.setcash(100000.0)
# Comission
cerebro.broker.setcommission(commission=0.001)
# Run backtest
print("Initializing backtest,this will take few moments...")
strats = cerebro.run()
# Summary
_print_summary(strats[0])
if __name__ == '__main__':
execute_backtest()