bbstrader 0.0.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of bbstrader might be problematic. Click here for more details.
- bbstrader/__ini__.py +17 -0
- bbstrader/btengine/__init__.py +50 -0
- bbstrader/btengine/backtest.py +900 -0
- bbstrader/btengine/data.py +374 -0
- bbstrader/btengine/event.py +201 -0
- bbstrader/btengine/execution.py +83 -0
- bbstrader/btengine/performance.py +309 -0
- bbstrader/btengine/portfolio.py +326 -0
- bbstrader/btengine/strategy.py +31 -0
- bbstrader/metatrader/__init__.py +6 -0
- bbstrader/metatrader/account.py +1038 -0
- bbstrader/metatrader/rates.py +226 -0
- bbstrader/metatrader/risk.py +626 -0
- bbstrader/metatrader/trade.py +1296 -0
- bbstrader/metatrader/utils.py +669 -0
- bbstrader/models/__init__.py +6 -0
- bbstrader/models/risk.py +349 -0
- bbstrader/strategies.py +681 -0
- bbstrader/trading/__init__.py +4 -0
- bbstrader/trading/execution.py +965 -0
- bbstrader/trading/run.py +131 -0
- bbstrader/trading/utils.py +153 -0
- bbstrader/tseries.py +592 -0
- bbstrader-0.0.1.dist-info/LICENSE +21 -0
- bbstrader-0.0.1.dist-info/METADATA +132 -0
- bbstrader-0.0.1.dist-info/RECORD +28 -0
- bbstrader-0.0.1.dist-info/WHEEL +5 -0
- bbstrader-0.0.1.dist-info/top_level.txt +1 -0
bbstrader/trading/run.py
ADDED
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import time
|
|
2
|
+
import argparse
|
|
3
|
+
from bbstrader.metatrader.trade import Trade
|
|
4
|
+
from bbstrader.trading.execution import (
|
|
5
|
+
sma_trading, pair_trading, ou_trading, arch_trading)
|
|
6
|
+
from bbstrader.trading.utils import (
|
|
7
|
+
add_sma_trading_arguments, add_pair_trading_arguments,
|
|
8
|
+
add_ou_trading_arguments, add_arch_trading_arguments,
|
|
9
|
+
init_trade)
|
|
10
|
+
|
|
11
|
+
__all__ = [
|
|
12
|
+
"run_sma_trading",
|
|
13
|
+
"run_pair_trading",
|
|
14
|
+
"run_ou_trading",
|
|
15
|
+
"run_arch_trading",
|
|
16
|
+
]
|
|
17
|
+
def run_sma_trading():
|
|
18
|
+
# Create parser
|
|
19
|
+
parser = argparse.ArgumentParser(
|
|
20
|
+
description='Run SMA trading strategy.')
|
|
21
|
+
|
|
22
|
+
# Add arguments for sma_trading parameters
|
|
23
|
+
parser = add_sma_trading_arguments(parser)
|
|
24
|
+
|
|
25
|
+
# Parse arguments
|
|
26
|
+
args = parser.parse_args()
|
|
27
|
+
|
|
28
|
+
# Initialize Trade with command-line arguments
|
|
29
|
+
trade = init_trade(args)
|
|
30
|
+
|
|
31
|
+
# Call sma_trading with command-line arguments
|
|
32
|
+
sma_trading(
|
|
33
|
+
trade,
|
|
34
|
+
tf=args.tf,
|
|
35
|
+
sma=args.sma,
|
|
36
|
+
lma=args.lma,
|
|
37
|
+
mm=args.mm,
|
|
38
|
+
max_t=args.mxt,
|
|
39
|
+
iter_time=args.it,
|
|
40
|
+
risk_manager=args.rm,
|
|
41
|
+
period=args.period
|
|
42
|
+
)
|
|
43
|
+
|
|
44
|
+
def run_pair_trading(pair=True, pchange_sl=3.0):
|
|
45
|
+
# Create parser
|
|
46
|
+
parser = argparse.ArgumentParser(
|
|
47
|
+
description='Run Pair trading strategy.')
|
|
48
|
+
|
|
49
|
+
# Add arguments for pair_trading parameters
|
|
50
|
+
parser = add_pair_trading_arguments(
|
|
51
|
+
parser, pair=pair, pchange_sl=pchange_sl)
|
|
52
|
+
|
|
53
|
+
# Parse arguments
|
|
54
|
+
args = parser.parse_args()
|
|
55
|
+
tickers = tuple(args.pair)
|
|
56
|
+
|
|
57
|
+
# Initialize Trade with command-line arguments
|
|
58
|
+
p0 = init_trade(args, symbol=tickers[0])
|
|
59
|
+
time.sleep(5)
|
|
60
|
+
p1 = init_trade(args, symbol=tickers[1])
|
|
61
|
+
# Call pair_trading with command-line arguments
|
|
62
|
+
pair_trading(
|
|
63
|
+
tickers,
|
|
64
|
+
p0,
|
|
65
|
+
p1,
|
|
66
|
+
args.tf,
|
|
67
|
+
ols=args.rmw,
|
|
68
|
+
max_t=args.mxt,
|
|
69
|
+
mm=args.mm,
|
|
70
|
+
iter_time=args.it,
|
|
71
|
+
risk_manager=args.rm,
|
|
72
|
+
rm_ticker=args.rmt,
|
|
73
|
+
rm_window=args.rmw,
|
|
74
|
+
period=args.period
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
def run_ou_trading():
|
|
78
|
+
# Create parser
|
|
79
|
+
parser = argparse.ArgumentParser(
|
|
80
|
+
description='Run Ornstein-Uhlenbeck trading strategy.')
|
|
81
|
+
|
|
82
|
+
# Add arguments for ou_trading parameters
|
|
83
|
+
parser = add_ou_trading_arguments(parser)
|
|
84
|
+
|
|
85
|
+
# Parse arguments
|
|
86
|
+
args = parser.parse_args()
|
|
87
|
+
|
|
88
|
+
# Initialize Trade with command-line arguments
|
|
89
|
+
trade = init_trade(args)
|
|
90
|
+
|
|
91
|
+
# Call ou_trading with command-line arguments
|
|
92
|
+
ou_trading(
|
|
93
|
+
trade,
|
|
94
|
+
tf=args.tf,
|
|
95
|
+
n=args.n,
|
|
96
|
+
p=args.p,
|
|
97
|
+
max_t=args.mxt,
|
|
98
|
+
mm=args.mm,
|
|
99
|
+
iter_time=args.it,
|
|
100
|
+
ou_window=args.ouw,
|
|
101
|
+
rm_window=args.rmw,
|
|
102
|
+
risk_manager=args.rm,
|
|
103
|
+
period=args.period
|
|
104
|
+
)
|
|
105
|
+
|
|
106
|
+
def run_arch_trading():
|
|
107
|
+
# Create parser
|
|
108
|
+
parser = argparse.ArgumentParser(
|
|
109
|
+
description='Run ARIMA + GARCH trading strategy.')
|
|
110
|
+
|
|
111
|
+
# Add arguments for arch_trading parameters
|
|
112
|
+
parser = add_arch_trading_arguments(parser)
|
|
113
|
+
|
|
114
|
+
# Parse arguments
|
|
115
|
+
args = parser.parse_args()
|
|
116
|
+
|
|
117
|
+
# Initialize Trade with command-line arguments
|
|
118
|
+
trade = init_trade(args)
|
|
119
|
+
|
|
120
|
+
# Call arch_trading with command-line arguments
|
|
121
|
+
arch_trading(
|
|
122
|
+
trade,
|
|
123
|
+
tf=args.tf,
|
|
124
|
+
max_t=args.mxt,
|
|
125
|
+
mm=args.mm,
|
|
126
|
+
k=args.k,
|
|
127
|
+
iter_time=args.it,
|
|
128
|
+
risk_manager=args.rm,
|
|
129
|
+
rm_window=args.rmw,
|
|
130
|
+
period=args.period
|
|
131
|
+
)
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
from bbstrader.metatrader.trade import Trade
|
|
2
|
+
|
|
3
|
+
def tf_mapping():
|
|
4
|
+
time_frame_mapping = {
|
|
5
|
+
'1m': 1,
|
|
6
|
+
'3m': 3,
|
|
7
|
+
'5m': 5,
|
|
8
|
+
'10m': 10,
|
|
9
|
+
'15m': 15,
|
|
10
|
+
'30m': 30,
|
|
11
|
+
'1h': 60,
|
|
12
|
+
'2h': 120,
|
|
13
|
+
'4h': 240,
|
|
14
|
+
'D1': 1440
|
|
15
|
+
}
|
|
16
|
+
return time_frame_mapping
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def init_trade(args, symbol=None):
|
|
20
|
+
# Initializes and returns a Trade object
|
|
21
|
+
if symbol is not None:
|
|
22
|
+
trade_symbol = symbol
|
|
23
|
+
else : trade_symbol = args.symbol
|
|
24
|
+
trade = Trade(
|
|
25
|
+
expert_name=args.expert,
|
|
26
|
+
version=args.version,
|
|
27
|
+
expert_id=args.id,
|
|
28
|
+
symbol=trade_symbol,
|
|
29
|
+
max_risk=args.mr,
|
|
30
|
+
target=args.t,
|
|
31
|
+
daily_risk=args.dr,
|
|
32
|
+
max_trades=args.maxt,
|
|
33
|
+
account_leverage=args.acl,
|
|
34
|
+
time_frame=args.tfm,
|
|
35
|
+
start_time=args.start,
|
|
36
|
+
finishing_time=args.fint,
|
|
37
|
+
ending_time=args.endt,
|
|
38
|
+
std_stop=args.std,
|
|
39
|
+
pchange_sl=args.psl,
|
|
40
|
+
verbose=True,
|
|
41
|
+
sl=args.sl,
|
|
42
|
+
tp=args.tp,
|
|
43
|
+
be=args.be,
|
|
44
|
+
rr=args.rr
|
|
45
|
+
)
|
|
46
|
+
return trade
|
|
47
|
+
|
|
48
|
+
def add_trade_arguments(parser, pair=False, pchange_sl=None, strategy=None):
|
|
49
|
+
# Add arguments for Trade parameters
|
|
50
|
+
parser.add_argument('--expert', type=str, default='bbstrader', help='Expert name')
|
|
51
|
+
parser.add_argument('--id', type=int, default=0, help='Expert ID')
|
|
52
|
+
parser.add_argument('--version', type=float, default=1.0, help='Version')
|
|
53
|
+
parser.add_argument('--symbol', type=str, default='#SPY', help='Symbol to trade')
|
|
54
|
+
parser.add_argument('--mr', type=float, default=5.0, help='Maximum risk')
|
|
55
|
+
parser.add_argument('--t', type=float, default=2.0, help='Target')
|
|
56
|
+
parser.add_argument(
|
|
57
|
+
'--dr', type=float, default=0.25, help='Daily risk')
|
|
58
|
+
parser.add_argument(
|
|
59
|
+
'--maxt', type=int, default=20, help='Maximum trades', nargs='?', const=None)
|
|
60
|
+
parser.add_argument('--acl', type=bool, default=True, help='Account leverage')
|
|
61
|
+
if strategy is not None:
|
|
62
|
+
if strategy == 'sma':
|
|
63
|
+
parser.add_argument('--tfm', type=str, default='1h', help='Time frame')
|
|
64
|
+
elif strategy == 'pair':
|
|
65
|
+
parser.add_argument('--tfm', type=str, default='D1', help='Time frame')
|
|
66
|
+
elif strategy == 'ou':
|
|
67
|
+
parser.add_argument('--tfm', type=str, default='1h', help='Time frame')
|
|
68
|
+
elif strategy == 'arch':
|
|
69
|
+
parser.add_argument('--tfm', type=str, default='D1', help='Time frame')
|
|
70
|
+
else: parser.add_argument('--tfm', type=str, required=True, help='Time frame')
|
|
71
|
+
parser.add_argument('--start', type=str, default='13:35', help='Start time')
|
|
72
|
+
parser.add_argument('--fint', type=str, default='19:50', help='Finishing time')
|
|
73
|
+
parser.add_argument('--endt', type=str, default='19:55', help='Ending time')
|
|
74
|
+
parser.add_argument('--std', type=bool, default=False, help='Standard Deviation stop')
|
|
75
|
+
parser.add_argument('--rr', type=float, default=3.0, help='Risk reward ratio')
|
|
76
|
+
if pair:
|
|
77
|
+
if pchange_sl is not None:
|
|
78
|
+
parser.add_argument(
|
|
79
|
+
'--psl', type=float, default=pchange_sl, help='Percentage change stop loss')
|
|
80
|
+
else: parser.add_argument(
|
|
81
|
+
'--psl', type=float, default=2.5, help='Percentage change stop loss')
|
|
82
|
+
else: parser.add_argument(
|
|
83
|
+
'--psl', type=float, default=None, help='Percentage change stop loss', nargs='?', const=None)
|
|
84
|
+
parser.add_argument('--sl', type=int, default=None, help='Stop loss', nargs='?', const=None)
|
|
85
|
+
parser.add_argument('--tp', type=int, default=None, help='Take profit', nargs='?', const=None)
|
|
86
|
+
parser.add_argument('--be', type=int, default=None, help='Break even', nargs='?', const=None)
|
|
87
|
+
return parser
|
|
88
|
+
|
|
89
|
+
def add_common_trading_arguments(parser, strategy=None):
|
|
90
|
+
# Common trading arguments
|
|
91
|
+
if strategy is not None:
|
|
92
|
+
if strategy == 'sma':
|
|
93
|
+
parser.add_argument('--tf', type=str, default='1h', help='Time frame for trading')
|
|
94
|
+
elif strategy == 'pair':
|
|
95
|
+
parser.add_argument('--tf', type=str, default='D1', help='Time frame for trading')
|
|
96
|
+
elif strategy == 'ou':
|
|
97
|
+
parser.add_argument('--tf', type=str, default='1h', help='Time frame for trading')
|
|
98
|
+
elif strategy == 'arch':
|
|
99
|
+
parser.add_argument('--tf', type=str, default='D1', help='Time frame for trading')
|
|
100
|
+
else: parser.add_argument('--tf', type=str, required=True, help='Time frame for trading')
|
|
101
|
+
parser.add_argument('--mm', type=bool, default=True, help='Money management')
|
|
102
|
+
parser.add_argument('--mxt', type=int, default=1, help='Maximum trades')
|
|
103
|
+
parser.add_argument('--it', type=float,default=30, help='Iteration time')
|
|
104
|
+
parser.add_argument('--period', type=str, default='week', choices=['day', 'week', 'month'], help='Trading period')
|
|
105
|
+
return parser
|
|
106
|
+
|
|
107
|
+
def add_sma_trading_arguments(parser):
|
|
108
|
+
# Add arguments for Trade parameters
|
|
109
|
+
parser = add_trade_arguments(parser, strategy='sma')
|
|
110
|
+
# Add common trading arguments
|
|
111
|
+
parser = add_common_trading_arguments(parser, strategy='sma')
|
|
112
|
+
# Add arguments for sma_trading parameters
|
|
113
|
+
parser.add_argument('--sma', type=int, default=35, help='Short moving average period')
|
|
114
|
+
parser.add_argument('--lma', type=int, default=80, help='Long moving average period')
|
|
115
|
+
parser.add_argument('--rm', type=str, default='hmm', help='Risk manager')
|
|
116
|
+
return parser
|
|
117
|
+
|
|
118
|
+
def add_pair_trading_arguments(parser, pair=True, pchange_sl=2.5):
|
|
119
|
+
# Add arguments for Trade parameters
|
|
120
|
+
parser = add_trade_arguments(parser, pair=pair, pchange_sl=pchange_sl, strategy='pair')
|
|
121
|
+
# Add common trading arguments
|
|
122
|
+
parser = add_common_trading_arguments(parser, strategy='pair')
|
|
123
|
+
# Add arguments for pair_trading parameters
|
|
124
|
+
parser.add_argument(
|
|
125
|
+
'--pair', nargs=2, required=True, help='Pair of symbols for trading, e.g., --pair GOOG MSFT')
|
|
126
|
+
parser.add_argument('--rm', type=str, default=None, help='Risk manager', nargs='?', const=None)
|
|
127
|
+
parser.add_argument('--rmt', type=str, default=None, help='Risk manager ticker', nargs='?', const=None)
|
|
128
|
+
parser.add_argument('--rmw', type=int, default=None, help='Risk manager Window', nargs='?', const=None)
|
|
129
|
+
return parser
|
|
130
|
+
|
|
131
|
+
def add_ou_trading_arguments(parser):
|
|
132
|
+
# Add arguments for Trade parameters
|
|
133
|
+
parser = add_trade_arguments(parser, strategy='ou')
|
|
134
|
+
# Add common trading arguments
|
|
135
|
+
parser = add_common_trading_arguments(parser, strategy='ou')
|
|
136
|
+
# Add arguments for ou_trading parameters
|
|
137
|
+
parser.add_argument('--p', type=int, default=20, help='Number of time steps')
|
|
138
|
+
parser.add_argument('--n', type=int, default=20, help='Number of simulations to perform')
|
|
139
|
+
parser.add_argument('--ouw', type=int, default=2000, help='OU window size parameters estimation')
|
|
140
|
+
parser.add_argument('--rmw', type=int, default=60, help='Risk manager Window', nargs='?', const=None)
|
|
141
|
+
parser.add_argument('--rm', type=str, default=None, help='Risk manager', nargs='?', const=None)
|
|
142
|
+
return parser
|
|
143
|
+
|
|
144
|
+
def add_arch_trading_arguments(parser):
|
|
145
|
+
# Add arguments for Trade parameters
|
|
146
|
+
parser = add_trade_arguments(parser, strategy='arch')
|
|
147
|
+
# Add common trading arguments
|
|
148
|
+
parser = add_common_trading_arguments(parser, strategy='arch')
|
|
149
|
+
# Add arguments for ou_trading parameters
|
|
150
|
+
parser.add_argument('--k', type=int, default=500, help='Window used for prediction')
|
|
151
|
+
parser.add_argument('--rmw', type=int, default=60, help='Risk manager Window', nargs='?', const=None)
|
|
152
|
+
parser.add_argument('--rm', type=str, default=None, help='Risk manager', nargs='?', const=None)
|
|
153
|
+
return parser
|