In [1]:
import OnePy as op
from OnePy.custom_module.cleaner_talib import Talib


class TalibStrategy(op.StrategyBase):

    def __init__(self):

        super().__init__()

        self.sma1 = Talib(ind='sma',
                          params=dict(timeperiod=2), buffer_day=30).calculate
        self.sma2 = Talib(ind='sma',
                          params=dict(timeperiod=3), buffer_day=40).calculate
        
        # 参数优化必须将参数以字典形式存入params中
        self.params = dict(     
            position=100,
            takeprofit=10,
            stoploss=10,
            sma1=5,
            sma2=20,
        )

    def set_params(self, params: dict):
        """
        该函数主要用于参数优化,配置好cleaner
        """
        self.params.update(params) # 第一行必须运行这个update函数
        
        self.sma1 = Talib(ind='sma',
                          params=dict(timeperiod=params['sma1']),
                          buffer_day=30).calculate
        self.sma2 = Talib(ind='sma',
                          params=dict(timeperiod=params['sma2']),
                          buffer_day=40).calculate

    def handle_bar(self):

        position = self.params['position']
        takeprofit = self.params['takeprofit']
        stoploss = self.params['position']

        for ticker in self.env.tickers:

            if self.sma1(ticker) > self.sma2(ticker):
                self.buy(position, ticker,
                         takeprofit=takeprofit, stoploss=stoploss)
            else:
                self.sell(position, ticker)


TICKER_LIST = ['000001']
INITIAL_CASH = 20000
FREQUENCY = 'D'
START, END = '2017-05-25', '2017-07-09'

TalibStrategy()

go = op.backtest.stock(TICKER_LIST, FREQUENCY, INITIAL_CASH, START, END)
# go.sunny() # 注意,参数优化optimizer之前不能运行go.sunny(), 不然会报错

In [2]:
go.optimizer.set_params(strategy_name="TalibStrategy", 
                        param='takeprofit', 
                        param_range=[10])

go.optimizer.set_params("TalibStrategy", 'stoploss', [10])
go.optimizer.set_params("TalibStrategy", 'position', [100])
go.optimizer.set_params("TalibStrategy", 'sma1', range(3, 8))
go.optimizer.set_params("TalibStrategy", 'sma2', [20])

result = go.optimizer.run(filename='test.pkl')


一共优化 5 次
正在初始化OnePy
正在初始化OnePy
正在初始化OnePy
正在初始化OnePy
正在初始化OnePy
=============== OnePy初始化成功! ===============
=============== OnePy初始化成功! ===============
=============== OnePy初始化成功! ===============
开始寻找OnePiece之旅~~~
开始寻找OnePiece之旅~~~
开始寻找OnePiece之旅~~~
=============== OnePy初始化成功! ===============
=============== OnePy初始化成功! ===============
开始寻找OnePiece之旅~~~
开始寻找OnePiece之旅~~~
当前是第 1 次, 剩余 0.00 mins
当前是第 2 次, 剩余 0.00 mins
当前是第 3 次, 剩余 0.00 mins
当前是第 4 次, 剩余 0.00 mins
当前是第 5 次, 剩余 0.00 mins
参数优化完成!

In [3]:
result


Out[3]:
[{'Start_date': '2017-05-25',
  'End_date': '2017-07-09',
  'Initial_balance': '$20000.00',
  'End_balance': '$20174.61',
  'Total_return': '0.87%',
  'Total_net_pnl': '$174.61',
  'Total_commission': '$41.39',
  'Total_trading_days': '33 days',
  'Max_drawdown': '0.38%',
  'Max_drawdown_date': '2017-06-19',
  'Max_duration_in_drawdown': '7 days',
  'Max_margin': '$0.00',
  'Max_win_holding_pnl': '$55.36',
  'Max_loss_holding_pnl': '-$56.50',
  'Sharpe_ratio': '3.27',
  'Sortino_ratio': '6.69',
  'Number_of_trades': '29',
  'Number_of_daily_trades': '0.88',
  'Number_of_profit_days': '33 days',
  'Number_of_loss_days': '0 days',
  'Avg_daily_pnl': '$5.29',
  'Avg_daily_commission': '$1.25',
  'Avg_daily_return': '0.03%',
  'Avg_daily_std': '0.03%',
  'Annual_compound_return': '7.09%',
  'Annual_average_return': '6.85%',
  'Annual_std': '0.43%',
  'Annual_pnl': '$1333.41',
  'TalibStrategy': {'takeprofit': 10,
   'stoploss': 10,
   'position': 100,
   'sma1': 3,
   'sma2': 20}},
 {'Start_date': '2017-05-25',
  'End_date': '2017-07-09',
  'Initial_balance': '$20000.00',
  'End_balance': '$20174.61',
  'Total_return': '0.87%',
  'Total_net_pnl': '$174.61',
  'Total_commission': '$41.39',
  'Total_trading_days': '33 days',
  'Max_drawdown': '0.38%',
  'Max_drawdown_date': '2017-06-19',
  'Max_duration_in_drawdown': '7 days',
  'Max_margin': '$0.00',
  'Max_win_holding_pnl': '$55.36',
  'Max_loss_holding_pnl': '-$56.50',
  'Sharpe_ratio': '3.27',
  'Sortino_ratio': '6.69',
  'Number_of_trades': '29',
  'Number_of_daily_trades': '0.88',
  'Number_of_profit_days': '33 days',
  'Number_of_loss_days': '0 days',
  'Avg_daily_pnl': '$5.29',
  'Avg_daily_commission': '$1.25',
  'Avg_daily_return': '0.03%',
  'Avg_daily_std': '0.03%',
  'Annual_compound_return': '7.09%',
  'Annual_average_return': '6.85%',
  'Annual_std': '0.43%',
  'Annual_pnl': '$1333.41',
  'TalibStrategy': {'takeprofit': 10,
   'stoploss': 10,
   'position': 100,
   'sma1': 6,
   'sma2': 20}},
 {'Start_date': '2017-05-25',
  'End_date': '2017-07-09',
  'Initial_balance': '$20000.00',
  'End_balance': '$20166.02',
  'Total_return': '0.83%',
  'Total_net_pnl': '$166.02',
  'Total_commission': '$39.98',
  'Total_trading_days': '33 days',
  'Max_drawdown': '0.38%',
  'Max_drawdown_date': '2017-06-19',
  'Max_duration_in_drawdown': '7 days',
  'Max_margin': '$0.00',
  'Max_win_holding_pnl': '$55.36',
  'Max_loss_holding_pnl': '-$56.50',
  'Sharpe_ratio': '3.12',
  'Sortino_ratio': '6.30',
  'Number_of_trades': '28',
  'Number_of_daily_trades': '0.85',
  'Number_of_profit_days': '33 days',
  'Number_of_loss_days': '0 days',
  'Avg_daily_pnl': '$5.03',
  'Avg_daily_commission': '$1.21',
  'Avg_daily_return': '0.03%',
  'Avg_daily_std': '0.03%',
  'Annual_compound_return': '6.73%',
  'Annual_average_return': '6.51%',
  'Annual_std': '0.41%',
  'Annual_pnl': '$1267.80',
  'TalibStrategy': {'takeprofit': 10,
   'stoploss': 10,
   'position': 100,
   'sma1': 7,
   'sma2': 20}},
 {'Start_date': '2017-05-25',
  'End_date': '2017-07-09',
  'Initial_balance': '$20000.00',
  'End_balance': '$20174.61',
  'Total_return': '0.87%',
  'Total_net_pnl': '$174.61',
  'Total_commission': '$41.39',
  'Total_trading_days': '33 days',
  'Max_drawdown': '0.38%',
  'Max_drawdown_date': '2017-06-19',
  'Max_duration_in_drawdown': '7 days',
  'Max_margin': '$0.00',
  'Max_win_holding_pnl': '$55.36',
  'Max_loss_holding_pnl': '-$56.50',
  'Sharpe_ratio': '3.27',
  'Sortino_ratio': '6.69',
  'Number_of_trades': '29',
  'Number_of_daily_trades': '0.88',
  'Number_of_profit_days': '33 days',
  'Number_of_loss_days': '0 days',
  'Avg_daily_pnl': '$5.29',
  'Avg_daily_commission': '$1.25',
  'Avg_daily_return': '0.03%',
  'Avg_daily_std': '0.03%',
  'Annual_compound_return': '7.09%',
  'Annual_average_return': '6.85%',
  'Annual_std': '0.43%',
  'Annual_pnl': '$1333.41',
  'TalibStrategy': {'takeprofit': 10,
   'stoploss': 10,
   'position': 100,
   'sma1': 4,
   'sma2': 20}},
 {'Start_date': '2017-05-25',
  'End_date': '2017-07-09',
  'Initial_balance': '$20000.00',
  'End_balance': '$20174.61',
  'Total_return': '0.87%',
  'Total_net_pnl': '$174.61',
  'Total_commission': '$41.39',
  'Total_trading_days': '33 days',
  'Max_drawdown': '0.38%',
  'Max_drawdown_date': '2017-06-19',
  'Max_duration_in_drawdown': '7 days',
  'Max_margin': '$0.00',
  'Max_win_holding_pnl': '$55.36',
  'Max_loss_holding_pnl': '-$56.50',
  'Sharpe_ratio': '3.27',
  'Sortino_ratio': '6.69',
  'Number_of_trades': '29',
  'Number_of_daily_trades': '0.88',
  'Number_of_profit_days': '33 days',
  'Number_of_loss_days': '0 days',
  'Avg_daily_pnl': '$5.29',
  'Avg_daily_commission': '$1.25',
  'Avg_daily_return': '0.03%',
  'Avg_daily_std': '0.03%',
  'Annual_compound_return': '7.09%',
  'Annual_average_return': '6.85%',
  'Annual_std': '0.43%',
  'Annual_pnl': '$1333.41',
  'TalibStrategy': {'takeprofit': 10,
   'stoploss': 10,
   'position': 100,
   'sma1': 5,
   'sma2': 20}}]

In [ ]: