In [1]:
from collections import defaultdict
import OnePy as op
from OnePy.custom_module.cleaner_talib import Talib
from OnePy.custom_module.cleaner_sma import SMA
class SmaStrategy(op.StrategyBase):
def __init__(self):
super().__init__()
self.sma1 = SMA(3, 40).calculate
self.sma2 = SMA(5, 40).calculate
def handle_bar(self):
for ticker in self.env.tickers:
if self.sma1(ticker) > self.sma2(ticker):
self.buy(100, ticker, takeprofit=15,
stoploss=100)
else:
self.sell(20, ticker)
class BBANDS(op.StrategyBase):
def __init__(self):
super().__init__()
self.sma = Talib(ind='sma', frequency='D',
params=dict(timeperiod=20)).calculate
self.bbands = Talib(ind='BBANDS', frequency='D',
params=dict(timeperiod=20,
nbdevup=2,
nbdevdn=2,
matype=0),
buffer_day=30).calculate
self.switch_long = defaultdict(bool)
self.switch_short = defaultdict(bool)
self.params = dict(
position=100,
takeprofit_pct=0.01,
)
self.finished = defaultdict(list)
def handle_bar(self):
position = self.params['position']
takeprofit_pct = self.params['takeprofit_pct']
for ticker in self.env.tickers:
upperband = self.bbands(ticker)['upperband']
middleband = self.bbands(ticker)['middleband']
lowerband = self.bbands(ticker)['lowerband']
cur_price = self.cur_price(ticker)
sma = self.sma(ticker)
if cur_price > upperband > sma:
if ticker not in self.finished['long']:
self.buy(position, ticker, price=cur_price -
0.01, trailingstop_pct=0.05)
self.finished['long'].append(ticker)
elif cur_price < lowerband < sma:
if ticker not in self.finished['short']:
self.short(position, ticker, price=cur_price +
0.01, trailingstop_pct=0.05)
self.finished['short'].append(ticker)
In [2]:
TICKER_LIST = ['000001', '000002'] # 多品种
INITIAL_CASH = 20000
FREQUENCY = 'D'
START, END = '2012-08-07', '2018-08-07'
go = op.backtest.stock(TICKER_LIST, FREQUENCY, INITIAL_CASH, START, END)
# 导入多个策略
SmaStrategy()
BBANDS()
go.output.show_setting() # 检查是否导入成功
In [3]:
go.sunny()
In [4]:
go.output.summary2()
In [ ]: