예제 #1
0
def run_strategy(cash):
    instruments = ["000001"]
    feeds = tools.build_feed(instruments, 2016, 2018, "histdata")

    # 设置手续费
    broker_commision = broker.backtesting.TradePercentage(0.0003)
    brk = broker.backtesting.Broker(cash, feeds, broker_commision)

    myStrategy = MyStrategy(feeds, instruments[0], brk)
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)

    # 以沪深300为基准#
    instruments300 = ["510300"]
    feeds300 = tools.build_feed(instruments300, 2016, 2018, "histdata300")

    # 设置手续费
    broker_commision = broker.backtesting.TradePercentage(0.0003)
    brk = broker.backtesting.Broker(cash, feeds300, broker_commision)

    myStrategy300 = MyStrategy(feeds300, instruments300[0], brk)
    retAnalyzer300 = returns.Returns()
    myStrategy300.attachAnalyzer(retAnalyzer300)
    sharpeAnalyzer300 = sharpe.SharpeRatio()
    myStrategy300.attachAnalyzer(sharpeAnalyzer300)
    drawDownAnalyzer300 = drawdown.DrawDown()
    myStrategy300.attachAnalyzer(drawDownAnalyzer300)
    tradesAnalyzer300 = trades.Trades()
    myStrategy300.attachAnalyzer(tradesAnalyzer300)

    plter = plotter.StrategyPlotter(myStrategy)
    plter.getOrCreateSubplot("return").addDataSeries("retuens",
                                                     retAnalyzer.getReturns())
    plter.getOrCreateSubplot("CumReturn").addDataSeries(
        "CumReturn", retAnalyzer.getCumulativeReturns())
    plter.getOrCreateSubplot("return").addDataSeries(
        "retuens300", retAnalyzer300.getReturns())
    plter.getOrCreateSubplot("CumReturn").addDataSeries(
        "CumReturn300", retAnalyzer300.getCumulativeReturns())

    myStrategy.run()
    myStrategy300.run()
    plter.savePlot("testdata.png")
    # print("交易次数:%d" % (tradesAnalyzer.getCount()))
    print("策略回测指标")
    analyzer((retAnalyzer, sharpeAnalyzer, drawDownAnalyzer, tradesAnalyzer))
    print("基准回测指标")
    analyzer((retAnalyzer300, sharpeAnalyzer300, drawDownAnalyzer300,
              tradesAnalyzer300))
    # 计算阿尔法 β 信息比例等值
    calculater(retAnalyzer, retAnalyzer300)
    return (myStrategy, retAnalyzer, sharpeAnalyzer, drawDownAnalyzer,
            tradesAnalyzer)
예제 #2
0
파일: backtesting.py 프로젝트: ugeg/quant
def analyze_and_draw(feed, instrument, period, cash=10000):
    my_strategy = MyStrategy(feed, instrument, period, cash)
    # 在执行前添加不同的分析器
    ret_analyzer = returns.Returns()
    my_strategy.attachAnalyzer(ret_analyzer)
    sharpe_ratio_analyzer = sharpe.SharpeRatio()
    my_strategy.attachAnalyzer(sharpe_ratio_analyzer)
    draw_down_analyzer = drawdown.DrawDown()
    my_strategy.attachAnalyzer(draw_down_analyzer)
    trades_analyzer = trades.Trades()
    my_strategy.attachAnalyzer(trades_analyzer)
    # 设置中文等线字体以显示中文
    plts.rcParams['font.sans-serif'] = ['DengXian']
    plt = plotter.StrategyPlotter(my_strategy, True, False, True)
    plt.getInstrumentSubplot(instrument).addDataSeries("SMA",
                                                       my_strategy.getSMA())
    # 开始执行策略
    my_strategy.run()
    plt.plot()
    # 现金+有价证券
    print("最终资产价值 Final portfolio value: ¥%.2f" %
          my_strategy.getBroker().getEquity())
    print("最终资产价值 Final portfolio value: ¥%.2f" % my_strategy.getResult())
    print("累计回报率 Cumulative returns: %.2f %%" %
          (ret_analyzer.getCumulativeReturns()[-1] * 100))
    print("夏普比率 Sharpe ratio: %.2f" %
          (sharpe_ratio_analyzer.getSharpeRatio(0.05)))
    print("最大回撤率 Max. drawdown: %.2f %%" %
          (draw_down_analyzer.getMaxDrawDown() * 100))
    print("最长回撤时间 Longest drawdown duration: %s" %
          (draw_down_analyzer.getLongestDrawDownDuration()))
예제 #3
0
def main():
    instrument = "yhoo"
    bBandsPeriod = 40

    # Download the bars.
    # feed = yahoofinance.build_feed([instrument], 2011, 2012, ".")
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV(instrument, "dat\\yhoo-201x.csv")

    strat = BBands(feed, instrument, bBandsPeriod)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)

    # ------
    mpl.style.use('seaborn-whitegrid');
    plt = plotter.StrategyPlotter(strat, True, True, True)
    plt.getInstrumentSubplot(instrument).addDataSeries("upper", strat.getBollingerBands().getUpperBand())
    plt.getInstrumentSubplot(instrument).addDataSeries("middle", strat.getBollingerBands().getMiddleBand())
    plt.getInstrumentSubplot(instrument).addDataSeries("lower", strat.getBollingerBands().getLowerBand())

    strat.run()
    plt.plot()
    # ==============================
    print("最终资产价值 Final portfolio value: $%.2f" % strat.getResult())
    print("累计回报率 Cumulative returns: %.2f %%" % (retAnalyzer.getCumulativeReturns()[-1] * 100))
    print("夏普比率 Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05)))
    print("最大回撤率 Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100))
    print("最长回撤时间 Longest drawdown duration: %s" % (drawDownAnalyzer.getLongestDrawDownDuration()))
예제 #4
0
def main():
    feed = csvfeed.GenericBarFeed(frequency=Frequency.MINUTE)
    feed.addBarsFromCSV("ETH", "sampledata.csv")

    # Evaluate the strategy with the feed's bars.
    myStrategy = Accumulator(feed, "ETH", buy_offset=0.0017, buy_percent=0.49)
    # myStrategy.run()

    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)

    plt = plotter.StrategyPlotter(myStrategy)
    # Include the SMA in the instrument's subplot to get it displayed along with the closing prices.
    plt.getInstrumentSubplot("ETH").addDataSeries("SMA", myStrategy.getSMA())
    # Plot the simple returns on each bar.
    plt.getOrCreateSubplot("returns").addDataSeries(
        "Simple returns", returnsAnalyzer.getReturns())

    # Run the strategy.
    myStrategy.run()
    myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())

    # Plot the strategy.
    plt.plot()

    print("Final portfolio value: $%.2f" % myStrategy.getResult())
    def testLong2(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        # Extend long position
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        # Exit long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       TradesAnalyzerTestCase.TestInstrument, 2)  # 127.2
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                1000 + (127.2 - 127.14) + (127.2 - 127.16), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.1)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.1)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 0)
    def testShort3(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL_SHORT,
                       TradesAnalyzerTestCase.TestInstrument, 2)  # 127.14
        # Decrease short position
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY_TO_COVER,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        # Exit short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY_TO_COVER,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                1000 + (127.14 - 127.16) + (127.14 - 127.2), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == -0.08)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.08)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 0)
예제 #7
0
def run_strategy(cash):
    #    instruments = ["000001"]
    #    feeds = tools.build_feed(instruments, 2016, 2018, "histdata")

    instruments = ["000989"]
    feeds = buildFeed(instruments[0], downloadData(instruments[0]))

    # 设置手续费, 万分之一
    broker_commision = broker.backtesting.TradePercentage(0.0001)
    brk = broker.backtesting.Broker(cash, feeds, broker_commision)

    myStrategy = MyStrategy(feeds, instruments[0], brk)
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)

    plter = plotter.StrategyPlotter(myStrategy)
    plter.getOrCreateSubplot("return").addDataSeries("retuens",
                                                     retAnalyzer.getReturns())
    plter.getOrCreateSubplot("CumReturn").addDataSeries(
        "CumReturn", retAnalyzer.getCumulativeReturns())

    myStrategy.run()
    plter.savePlot("testdata.png")
    print("交易次数:%d" % (tradesAnalyzer.getCount()))
    return (myStrategy, retAnalyzer, sharpeAnalyzer, drawDownAnalyzer,
            tradesAnalyzer)
예제 #8
0
    def testShort2(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL_SHORT, INSTRUMENT, 1)  # 127.14
        # Extend short position
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL_SHORT, INSTRUMENT, 1)  # 127.16
        # Exit short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY_TO_COVER, INSTRUMENT,
                       2)  # 127.2
        strat.run()

        self.assertEqual(
            round(strat.getBroker().getBalance(PRICE_CURRENCY), 2),
            round(1000 + (127.14 - 127.2) + (127.16 - 127.2), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertEqual(round(stratAnalyzer.getAll().mean(), 2), -0.1)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.1)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 0)
    def testLongShort(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        # Exit long and enter short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 2)  # 127.16
        # Exit short
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30), strat.getBroker().createMarketOrder, broker.Order.Action.BUY_TO_COVER, TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.run()

        self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.16 - 127.14) + (127.16 - 127.2), 2))

        self.assertTrue(stratAnalyzer.getCount() == 2)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == -0.01)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=1), 4) == 0.0424)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.02)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.04)
예제 #10
0
 def __init__(self,
              instrument,
              startYear,
              endYear,
              strategy,
              base="510300",
              cash=1000000,
              feeRate=0.0003):
     self.__instrument = instrument
     self.__startYear = startYear
     self.__endYear = endYear
     self.__strategy = strategy
     self.__base = []
     self.__base.append(base)
     self.__cash = cash
     self.__feeRate = feeRate
     # 要创建的内部变量
     self.__strategyTest = None
     self.__feed = None
     self.__strategyBase = None
     self.__feedBase = None
     self.__brk = None
     self.__brkBase = None
     self.__return = returns.Returns()
     self.__returnBase = returns.Returns()
     self.__sharpe = sharpe.SharpeRatio()
     self.__drawdown = drawdown.DrawDown()
     self.__trade = trades.Trades()
     self.__result = pd.DataFrame()
     self.__plter = None
     # 使用pyalgotrade绘图要加上,不然报错
     register_matplotlib_converters()
    def testProportionalCommissionBug(self):
        # Regression test for a bug reported by 'Jackson Sam' on 30/Aug/2013.
        strat = self.__createStrategy()
        strat.getBroker().setCommission(backtesting.FixedPerTrade(0.01))
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # There are 3 trades here:
        # Trade 1 (Long)
        #   Buy 1 @ 127.16 Commission: 0.01
        #   Sell 1 @ 127.26 Commission: 0.005
        # Trade 2 (Short)
        #   Sell 1 @ 127.26 Commission: 0.005
        #   Buy 1 @ 127.37 Commission: 0.005
        # Trade 3 (Long)
        #   Buy 1 @ 127.37 Commission: 0.005
        #   Sell 1 @ 127.4 Commission: 0.01

        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 38), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 1)  # Fill at 127.16
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 42), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 2)  # Fill at 127.26
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 53), strat.getBroker().createMarketOrder, broker.Order.Action.BUY, TradesAnalyzerTestCase.TestInstrument, 2)  # Fill at 127.37
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 58), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, TradesAnalyzerTestCase.TestInstrument, 1)  # Fill at 127.4

        strat.run()
        allReturns = stratAnalyzer.getAllReturns()
        self.assertEqual(round(allReturns[0], 6), 0.000668)
        self.assertEqual(round(allReturns[1], 6), -0.000943)
        self.assertEqual(round(allReturns[2], 6), 0.000118)
예제 #12
0
    def __init__(self, feed, brk, instrument):
        super(LiveStrategy, self).__init__(feed, brk)
        brk.addBitmexFeed(feed)
        feed.getNewValuesEvent().subscribe(self.__onBarsImpl)
        self.initial_capital = self.getResult()

        brk.setStrategy(self)
        self.positions = {}
        for symbol in instrument:
            self.positions[symbol] = brk.get_synced_position(self, symbol)

        retAnalyzer = returns.Returns()
        self.attachAnalyzerEx(retAnalyzer, 'retAnalyzer')
        sharpeRatioAnalyzer = sharpe.SharpeRatio()
        self.attachAnalyzerEx(sharpeRatioAnalyzer, 'sharpeRatioAnalyzer')
        drawDownAnalyzer = drawdown.DrawDown()
        self.attachAnalyzerEx(drawDownAnalyzer, 'drawDownAnalyzer')
        tradesAnalyzer = trades.Trades()
        self.attachAnalyzerEx(tradesAnalyzer, 'tradesAnalyzer')

        self.plt = plotter.StrategyPlotter(self)
        self.plt.getOrCreateSubplot("returns").addDataSeries(
            "Net return", retAnalyzer.getReturns())
        self.plt.getOrCreateSubplot("returns").addDataSeries(
            "Cum. return", retAnalyzer.getCumulativeReturns())

        self.strategy_id = brk.getStrategyId()
        if not os.path.exists(self.strategy_id + '.csv'):
            with open(self.strategy_id + '.csv', 'w') as f:
                f.write('Date,Type,Signal,Symbol,Price,Shares,PnL,Cash\n')
        if not os.path.exists(self.strategy_id + '_orders.csv'):
            with open(self.strategy_id + '_orders.csv', 'w') as f:
                f.write(
                    'Date,OrderDate,OrderId,Type,Signal,Symbol,Price,Size,Filled,Timedelta,StopHit\n'
                )
예제 #13
0
def run_strategy(smaPeriod, factor1):
    import pandas as pd
    # df_new = pd.DataFrame(columns=('shares_ID', 'total number of trades','Profit times number of trades','Final portfolio value'))
    for (root, dirs, files) in os.walk("E:/SHZQ"):
        for x in range(len(files)):
            feed = GenericBarFeed(Frequency.DAY, None, None)
            feed.addBarsFromCSV("fd", "E:/SHZQ/" + files[x])

            myStrategy = MyStrategy(feed, "fd", smaPeriod, factor1)
            trade_situation = trades.Trades()
            myStrategy.attachAnalyzer(trade_situation)
            myStrategy.run()
            print(files[x] + "Final portfolio value:$%.2f" %
                  myStrategy.getBroker().getEquity())
            print("total number of trades", trade_situation.getCount())
            print("Profit times number of trades ",
                  trade_situation.getProfitableCount())
            print(
                "百分比",
                trade_situation.getProfitableCount() /
                trade_situation.getCount())
            print(trade_situation.getCount())
            df1 = pd.DataFrame({
                "shares_ID": [files[x]],
                'total number of trades': [trade_situation.getCount()],
                'Profit times number of trades':
                trade_situation.getProfitableCount(),
                'Final portfolio value': [myStrategy.getBroker().getEquity()]
            })
예제 #14
0
def run_strategy(smaPeriod):
    # Load the yahoo feed from the CSV file
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("zggf", "E:/PythonData/CSV/000938.csv")

    # Evaluate the strategy with the feed.
    myStrategy = MyStrategy(feed, "zggf", smaPeriod)
    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)
    plt = plotter.StrategyPlotter(myStrategy)
    sharpe_ratio = sharpe.SharpeRatio()
    trade_situation = trades.Trades()
    myStrategy.attachAnalyzer(sharpe_ratio)
    myStrategy.attachAnalyzer(trade_situation)
    plt.getInstrumentSubplot("zggf").addDataSeries("SMA", myStrategy.getSMA())
    plt.getOrCreateSubplot("returns").addDataSeries(
        "Simple returns", returnsAnalyzer.getCumulativeReturns())
    print(stats.mean(returnsAnalyzer.getReturns()))
    print(returnsAnalyzer.getCumulativeReturns())
    print(myStrategy.getResult())
    myStrategy.run()
    print("Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity())
    print("sharpe_ratio", sharpe_ratio.getSharpeRatio(0))
    print("total number of trades", trade_situation.getCount())
    print("Profit times number of trades ",
          trade_situation.getProfitableCount())
    plt.plot()
    print(returnsAnalyzer.getReturns())
    print(stats.mean(returnsAnalyzer.getReturns()))
    print(stats.mean(returnsAnalyzer.getCumulativeReturns()))
예제 #15
0
    def __init__(self, feed, instrument):
        super(SimpleBacktestStrategy, self).__init__(feed)
        self.initial_capital = self.getResult()
        self.positions = {}
        for symbol in instrument:
            self.positions[symbol] = {}

        retAnalyzer = returns.Returns()
        self.attachAnalyzerEx(retAnalyzer, 'retAnalyzer')
        sharpeRatioAnalyzer = sharpe.SharpeRatio()
        self.attachAnalyzerEx(sharpeRatioAnalyzer, 'sharpeRatioAnalyzer')
        drawDownAnalyzer = drawdown.DrawDown()
        self.attachAnalyzerEx(drawDownAnalyzer, 'drawDownAnalyzer')
        tradesAnalyzer = trades.Trades()
        self.attachAnalyzerEx(tradesAnalyzer, 'tradesAnalyzer')

        self.plt = plotter.StrategyPlotter(self)
        self.plt.getOrCreateSubplot("returns").addDataSeries(
            "Net return", retAnalyzer.getReturns())
        self.plt.getOrCreateSubplot("returns").addDataSeries(
            "Cum. return", retAnalyzer.getCumulativeReturns())

        self.strategy_id = 'backtest'
        if not os.path.exists(self.strategy_id + '.csv'):
            with open(self.strategy_id + '.csv', 'w') as f:
                f.write('Date,Type,Signal,Symbol,Price,Shares,PnL,Cash\n')
예제 #16
0
    def testLong3(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY, INSTRUMENT, 2)  # 127.14
        # Decrease long position
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, INSTRUMENT, 1)  # 127.16
        # Exit long
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, INSTRUMENT, 1)  # 127.2
        strat.run()

        self.assertEqual(
            round(strat.getBroker().getBalance(PRICE_CURRENCY), 2),
            round(1000 + (127.2 - 127.14) + (127.16 - 127.14), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.08)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.08)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 0)
예제 #17
0
def run_strategy(smaPeriod):
    # Load the yahoo feed from the CSV file
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("zggf", "E:/PythonData/CSV/000938.csv")

    # Evaluate the strategy with the feed.
    myStrategy = MyStrategy(feed, "zggf", smaPeriod)
    returnsAnalyzer=returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)
    myStrategy.run()
    print(myStrategy.getResult())
    print("Final portfolio value: $%.2f" % myStrategy.getResult())
    print("Cumulative returns: %.2f %%" % (returnsAnalyzer.getCumulativeReturns()[-1] * 100))
    print(returnsAnalyzer.getCumulativeReturns())
    print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05)))
    print("Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100))
    print("Longest drawdown duration: %s" % (drawDownAnalyzer.getLongestDrawDownDuration()))

    print()
    print("Total trades: %d" % (tradesAnalyzer.getCount()))
예제 #18
0
    def testShort2(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter short
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL_SHORT,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        # Extend short position
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL_SHORT,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        # Exit short
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY_TO_COVER,
                       TradesAnalyzerTestCase.TestInstrument, 2)  # 127.2
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                1000 + (127.14 - 127.2) + (127.16 - 127.2), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getMean(), 2) == -0.1)

        self.assertTrue(stratAnalyzer.getLosingCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosingMean(), 2) == -0.1)

        self.assertTrue(stratAnalyzer.getWinningCount() == 0)
예제 #19
0
    def testLong3(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Enter long
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 2)  # 127.14
        # Decrease long position
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        # Exit long
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                1000 + (127.2 - 127.14) + (127.16 - 127.14), 2))

        self.assertTrue(stratAnalyzer.getCount() == 1)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)

        self.assertTrue(round(stratAnalyzer.getMean(), 2) == 0.08)

        self.assertTrue(stratAnalyzer.getWinningCount() == 1)
        self.assertTrue(round(stratAnalyzer.getWinningMean(), 2) == 0.08)

        self.assertTrue(stratAnalyzer.getLosingCount() == 0)
예제 #20
0
    def testSomeTrades(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Winning trade
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        # Losing trade
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 31),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        # Winning trade
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 38),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 42),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.26
        # Open trade.
        strat.addOrder(datetime.datetime(2011, 1, 3, 15, 47),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       TradesAnalyzerTestCase.TestInstrument, 1)  # 127.34
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                1000 + (127.16 - 127.14) + (127.16 - 127.2) +
                (127.26 - 127.16) - 127.34, 2))

        self.assertTrue(stratAnalyzer.getCount() == 3)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(round(stratAnalyzer.getMean(), 2) == 0.03)
        self.assertTrue(round(stratAnalyzer.getStdDev(), 2) == 0.07)
        self.assertTrue(round(stratAnalyzer.getStdDev(0), 2) == 0.06)

        self.assertTrue(stratAnalyzer.getWinningCount() == 2)
        self.assertTrue(round(stratAnalyzer.getWinningMean(), 2) == 0.06)
        self.assertTrue(round(stratAnalyzer.getWinningStdDev(), 2) == 0.06)
        self.assertTrue(round(stratAnalyzer.getWinningStdDev(0), 2) == 0.04)

        self.assertTrue(stratAnalyzer.getLosingCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosingMean(), 2) == -0.04)
        self.assertTrue(math.isnan(stratAnalyzer.getLosingStdDev()))
        self.assertTrue(stratAnalyzer.getLosingStdDev(0) == 0)
예제 #21
0
    def testSomeTrades(self):
        strat = self.__createStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Winning trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 0),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY, INSTRUMENT, 1)  # 127.14
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 16),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, INSTRUMENT, 1)  # 127.16
        # Losing trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 30),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY, INSTRUMENT, 1)  # 127.2
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 31),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, INSTRUMENT, 1)  # 127.16
        # Winning trade
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 38),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY, INSTRUMENT, 1)  # 127.16
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 42),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, INSTRUMENT, 1)  # 127.26
        # Open trade.
        strat.addOrder(buildUTCDateTime(2011, 1, 3, 15, 47),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY, INSTRUMENT, 1)  # 127.34
        strat.run()

        self.assertEqual(
            round(strat.getBroker().getBalance(PRICE_CURRENCY), 2),
            round(
                1000 + (127.16 - 127.14) + (127.16 - 127.2) +
                (127.26 - 127.16) - 127.34, 2))

        self.assertTrue(stratAnalyzer.getCount() == 3)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.03)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=1), 2) == 0.07)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=0), 2) == 0.06)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 2)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.06)
        self.assertTrue(
            round(stratAnalyzer.getProfits().std(ddof=1), 2) == 0.06)
        self.assertTrue(
            round(stratAnalyzer.getProfits().std(ddof=0), 2) == 0.04)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.04)
        if version.LooseVersion(
                numpy.__version__) >= version.LooseVersion("1.6.2"):
            self.assertTrue(math.isnan(stratAnalyzer.getLosses().std(ddof=1)))
        else:
            self.assertTrue(stratAnalyzer.getLosses().std(ddof=1) == 0)
        self.assertTrue(stratAnalyzer.getLosses().std(ddof=0) == 0)
예제 #22
0
def RSIBacktest(nper):
    # Create Instruments object with stock tickers
    instruments = ["BANKNIFTY"]
    # create feed object, add bars to the data feed
    feed = csvfeed.GenericBarFeed(bar.Frequency.DAY)
    feed.addBarsFromCSV(instruments[0], "Data//bnf.csv")
    # create object to run strategy
    rsi_strat = RSIStrategy(feed, instruments[0], nper)
    # Attach Strategy Plotter
    plt = plotter.StrategyPlotter(rsi_strat,
                                  plotAllInstruments=True,
                                  plotBuySell=True,
                                  plotPortfolio=False)
    plt.getOrCreateSubplot("RSI").addDataSeries("RSI", rsi_strat.getRSI())
    plt.getOrCreateSubplot("RSI").addLine("Upper Threshold", 70)
    plt.getOrCreateSubplot("RSI").addLine("Lower Threshold", 40)
    #    plt.getOrCreateSubplot("RSI").addLine("Center Line", 40)
    retAnalyzer = ret.Returns()
    rsi_strat.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    rsi_strat.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    rsi_strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    rsi_strat.attachAnalyzer(tradesAnalyzer)
    # Run Strategy
    rsi_strat.run()
    # Print Strategy Trading Statistics
    print
    print "------------------------------"
    print "1. Portfolio statistics"
    print
    print "Portfolio initial equity: $100000.00"
    print "Portfolio final equity: $%.2f" % rsi_strat.getBroker().getEquity()
    print "Portfolio net trading p&l: $%.2f" % tradesAnalyzer.getAll().sum()
    print "Portfolio maximum drawdown: %.2f %%" % (
        drawDownAnalyzer.getMaxDrawDown() * 100)
    print "Portfolio annualized return: %.2f %%" % (
        retAnalyzer.getCumulativeReturns()[-1] * 100)
    print "Portfolio annualized Sharpe ratio (Rf = 0%%): %.2f" % (
        sharpeRatioAnalyzer.getSharpeRatio(0.0))
    print "------------------------------"
    print "2. Total trades statistics"
    print "Total trades: %d" % (tradesAnalyzer.getCount())
    if tradesAnalyzer.getCount() > 0:
        tradesProfits = tradesAnalyzer.getAll()
        print "Total trades average p&l: $%2.f" % (tradesProfits.mean())
        print "Largest Winning Trade: $%2.f" % (tradesProfits.max())
        print "Largest Losing Trade: $%2.f" % (tradesProfits.min())
        tradesReturns = tradesAnalyzer.getAllReturns()
        print "Average return: %2.f %%" % (tradesReturns.mean() * 100)
        print "Largest Winning Trade Return: %2.f %%" % (tradesReturns.max() *
                                                         100)
        print "Largest Losing Trade Return: %2.f %%" % (tradesReturns.min() *
                                                        100)
    print "------------------------------"
    # Plot Strategy
    plt.plot()
예제 #23
0
def main(plot):
    instrument = ["price_diff", 'SHFE_AU', 'COMEX_AU']
    bBandsPeriod = 20

    # Download the bars.
    feed = GenericBarFeed(Frequency.DAY, None, None)
    feed.addBarsFromCSV('price_diff', 'price_oneyear_diff.csv')
    feed.addBarsFromCSV('SHFE_AU', 'AU_oneyear_samedate.csv')
    feed.addBarsFromCSV('COMEX_AU', 'GC_oneyear_samedate.csv')

    # 3. broker setting
    broker_commission = broker.backtesting.FixedPerTrade(390)  # 2230

    fill_stra = broker.fillstrategy.DefaultStrategy(volumeLimit=1)
    sli_stra = broker.slippage.VolumeShareSlippage(priceImpact=0.2)
    fill_stra.setSlippageModel(sli_stra)

    brk = broker.backtesting.Broker(10000000, feed, broker_commission)
    brk.setFillStrategy(fill_stra)

    strat = BBands(feed, instrument[0], instrument[1], instrument[2],
                   bBandsPeriod, brk)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    trade_situation = trades.Trades()
    strat.attachAnalyzer(trade_situation)
    draw_down = drawdown.DrawDown()
    strat.attachAnalyzer(draw_down)
    returning = returns.Returns()
    strat.attachAnalyzer(returning)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, True, True)
        plt.getInstrumentSubplot(instrument[0]).addDataSeries(
            "upper",
            strat.getBollingerBands().getUpperBand())
        plt.getInstrumentSubplot(instrument[0]).addDataSeries(
            "middle",
            strat.getBollingerBands().getMiddleBand())
        plt.getInstrumentSubplot(instrument[0]).addDataSeries(
            "lower",
            strat.getBollingerBands().getLowerBand())

    strat.run()
    strat.info('最终资产值: ¥ %.2f' % strat.getResult())  #info表示记录每一次的交易
    print '夏普率: ', sharpeRatioAnalyzer.getSharpeRatio(0.05,
                                                      False)  #print表示只打印一次
    print '累计收益率:', (returning.getCumulativeReturns()[-1])
    print '最大回撤:', draw_down.getMaxDrawDown()
    print '总交易次数:', trade_situation.getCount()
    print '每次交易的手续费:', trade_situation.getCommissionsForAllTrades()
    print '赚钱的交易次数:', trade_situation.getProfitableCount()
    print '亏损的交易次数:', trade_situation.getUnprofitableCount()
    print '不赚不亏的交易次数:', trade_situation.getEvenCount()
    print '每次交易的盈亏:', trade_situation.getAll()

    if plot:
        plt.plot()
    def testSomeTrades_Position(self):
        strat = self.__createPositionStrategy()
        stratAnalyzer = trades.Trades()
        strat.attachAnalyzer(stratAnalyzer)

        # Winning trade
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15, 0), strat.enterLong,
                          TradesAnalyzerTestCase.TestInstrument, 1)  # 127.14
        strat.addPosExit(buildUTCDateTime(2011, 1, 3, 15, 16))  # 127.16
        # Losing trade
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15,
                                           30), strat.enterLong,
                          TradesAnalyzerTestCase.TestInstrument, 1)  # 127.2
        strat.addPosExit(buildUTCDateTime(2011, 1, 3, 15, 31))  # 127.16
        # Winning trade
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15,
                                           38), strat.enterLong,
                          TradesAnalyzerTestCase.TestInstrument, 1)  # 127.16
        strat.addPosExit(buildUTCDateTime(2011, 1, 3, 15, 42))  # 127.26
        # Unfinished trade not closed
        strat.addPosEntry(buildUTCDateTime(2011, 1, 3, 15,
                                           47), strat.enterLong,
                          TradesAnalyzerTestCase.TestInstrument, 1)  # 127.34
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                1000 + (127.16 - 127.14) + (127.16 - 127.2) +
                (127.26 - 127.16) - 127.34, 2))

        self.assertTrue(stratAnalyzer.getCount() == 3)
        self.assertTrue(stratAnalyzer.getEvenCount() == 0)
        self.assertTrue(round(stratAnalyzer.getAll().mean(), 2) == 0.03)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=1), 2) == 0.07)
        self.assertTrue(round(stratAnalyzer.getAll().std(ddof=0), 2) == 0.06)

        self.assertTrue(stratAnalyzer.getProfitableCount() == 2)
        self.assertTrue(round(stratAnalyzer.getProfits().mean(), 2) == 0.06)
        self.assertTrue(
            round(stratAnalyzer.getProfits().std(ddof=1), 2) == 0.06)
        self.assertTrue(
            round(stratAnalyzer.getProfits().std(ddof=0), 2) == 0.04)
        self.assertEqual(stratAnalyzer.getPositiveReturns()[0],
                         (127.16 - 127.14) / 127.14)
        self.assertEqual(stratAnalyzer.getPositiveReturns()[1],
                         (127.26 - 127.16) / 127.16)

        self.assertTrue(stratAnalyzer.getUnprofitableCount() == 1)
        self.assertTrue(round(stratAnalyzer.getLosses().mean(), 2) == -0.04)
        if version.LooseVersion(
                numpy.__version__) >= version.LooseVersion("1.6.2"):
            self.assertTrue(math.isnan(stratAnalyzer.getLosses().std(ddof=1)))
        else:
            self.assertTrue(stratAnalyzer.getLosses().std(ddof=1) == 0)
        self.assertTrue(stratAnalyzer.getLosses().std(ddof=0) == 0)
        self.assertEqual(stratAnalyzer.getNegativeReturns()[0],
                         (127.16 - 127.2) / 127.2)
예제 #25
0
def turtle_test(code,start=None,plot=True,dl=60):
    feed = ptc.get_tdx_barfeed(code,start,dl=dl)
    #myStrategy = pyalg_test.SMACrossOver(feed, "orcl", 20)
    pars=[2, 20, 60, 10]
#    myStrategy = thrSMA_dayinfo(feed, "orcl",*pars)
    myStrategy = BBands(feed, code,20,dl)
    # Attach a returns analyzers to the strategy.
#    returnsAnalyzer = returns.Returns()
#    myStrategy.attachAnalyzer(returnsAnalyzer)


#    if dataString =='pyalg_util':
#        ds = pyalg_utils.dataSet(myStrategy)   #抽取交易数据集语句,若使用系统自带画图功能则不需要该项
    from pyalgotrade.stratanalyzer import returns
    from pyalgotrade.stratanalyzer import sharpe
    from pyalgotrade.stratanalyzer import drawdown
    from pyalgotrade.stratanalyzer import trades

    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    myStrategy.attachAnalyzer(tradesAnalyzer)

        # Attach the plotter to the strategy.
#    plt = plotter.StrategyPlotter(myStrategy)
    # Plot the simple returns on each bar.


    if plot:
        plt = plotter.StrategyPlotter(myStrategy, True, True, True)
        plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", retAnalyzer.getReturns())

    myStrategy.run()
    myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())

#    if dataString =='pyalg_util':
#        rs = ds.getDefault()       #获取默认的交易信息,dic格式
#        plot(rs["cumulativeReturns"][:,0],rs["cumulativeReturns"][:,1])  #简单作图示例

    #夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)
    #最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()
    #收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]
    #收益曲线
    return_list = []
    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)

    print "Sharpe ratio: %.2f maxdown:%.2f%%  return:%.2f%%" %(sharp,maxdd*100,return_*100)
    myStrategy.get_max_min()
    plt.plot()
예제 #26
0
def testStrategy():
    from pyalgotrade import bar
    from pyalgotrade import plotter

    strat = thrSMA
    instrument = '600519'
    market = 'SH'
    fromDate = '20101001'
    toDate = '20150601'
    frequency = bar.Frequency.DAY
    paras = [5, 17, 40, 10]
    plot = True
    import os
    filepath = os.path.join(r'E:\xsj\day', instrument + market + ".csv")

    #############################################don't change ############################33
    from pyalgotrade.cn.csvfeed import Feed

    barfeed = Feed(frequency)
    barfeed.setDateTimeFormat('%Y-%m-%d')
    barfeed.loadBars(instrument, market, fromDate, toDate, filepath)

    pyalgotrade_id = instrument + '.' + market
    strat = strat(barfeed, pyalgotrade_id, *paras)

    from pyalgotrade.stratanalyzer import returns
    from pyalgotrade.stratanalyzer import sharpe
    from pyalgotrade.stratanalyzer import drawdown
    from pyalgotrade.stratanalyzer import trades

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, True, True)

    strat.run()

    if plot:
        plt.plot()

    #夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)
    #最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()
    #收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]
    #收益曲线
    return_list = []
    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)
예제 #27
0
def main(mode = ct.PAPER_TRADING, start_date = '20170815', end_date = '20171113'):
    if mode == ct.PAPER_TRADING:
        cash = 100000
        beta = 9.49
        mean = -0.282
        std  = 34.73
        feed = dataFramefeed.Feed()
        instruments = ['300296', '300613']
        fpath       = '/Users/hellobiek/Documents/workspace/python/quant/smart_deal_tool/configure/tushare.json' 
        ts_client   = get_tushare_client(fpath)
        for code in instruments:
            df = ts.pro_bar(pro_api = ts_client, ts_code = add_suffix(code), adj = 'qfq', start_date = start_date, end_date = end_date)
            df = df.rename(columns = {"ts_code": "code", "trade_date": "date", "vol": "volume", "pct_change": "pchange"})
            df['date'] = df.date.apply(lambda x: time.strftime('%Y-%m-%d', time.strptime(x, "%Y%m%d")))
            df = df.set_index("date")
            feed.addBarsFromDataFrame(code, df)

        # broker setting
        # broker commission类设置
        broker_commission = broker.backtesting.TradePercentage(0.002)
        # fill strategy设置
        fill_stra = broker.fillstrategy.DefaultStrategy(volumeLimit = 1.0)
        sli_stra  = broker.slippage.NoSlippage()
        fill_stra.setSlippageModel(sli_stra)
        # 完善broker类
        brk = broker.backtesting.Broker(cash, feed, broker_commission)
        brk.setFillStrategy(fill_stra)

    pStrategy = PairTradingStrategy(feed, instruments, brk, beta, mean, std, cash)

    returnsAnalyzer = sreturn.Returns()
    pStrategy.attachAnalyzer(returnsAnalyzer)

    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    pStrategy.attachAnalyzer(sharpeRatioAnalyzer)

    drawDownAnalyzer = drawdown.DrawDown()
    pStrategy.attachAnalyzer(drawDownAnalyzer)

    tradesAnalyzer = trades.Trades()
    pStrategy.attachAnalyzer(tradesAnalyzer)

    plt = plotter.StrategyPlotter(pStrategy)

    # Plot the simple returns on each bar.
    plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())

    pStrategy.run()

    plt.plot()

    print("Final portfolio value: $%.2f" % pStrategy.getResult())
    print("Cumulative returns: %.2f %%" % (returnsAnalyzer.getCumulativeReturns()[-1] * 100))
    print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0.05)))
    print("Max. drawdown: %.2f %%" % (drawDownAnalyzer.getMaxDrawDown() * 100))
    print("Longest drawdown duration: %s" % (drawDownAnalyzer.getLongestDrawDownDuration()))
예제 #28
0
 def initAnalyzer(self):
     from pyalgotrade.stratanalyzer import sharpe
     from pyalgotrade.stratanalyzer import returns
     from pyalgotrade.stratanalyzer import drawdown
     from pyalgotrade.stratanalyzer import trades        
     
     self.returnsAnalyzer = returns.Returns()
     self.sharpeRatioAnalyzer = sharpe.SharpeRatio()
     self.drawdownAnalyzer = drawdown.DrawDown()
     self.tradesAnalyzer = trades.Trades()        
예제 #29
0
    def __init__(self, myStrategy):
        self.__myStrategy = myStrategy
        self.returnsAnalyzer = returns.Returns()
        self.sharpeRatioAnalyzer = sharpe.SharpeRatio()
        self.drawdownAnalyzer = drawdown.DrawDown()
        self.tradeAyalyzer = trades.Trades()

        myStrategy.attachAnalyzer(self.returnsAnalyzer)
        myStrategy.attachAnalyzer(self.sharpeRatioAnalyzer)
        myStrategy.attachAnalyzer(self.drawdownAnalyzer)
        myStrategy.attachAnalyzer(self.tradeAyalyzer)
예제 #30
0
def testStrategy():
    from pyalgotrade import bar
    from pyalgotrade import plotter

    strat = DoubleMA
    frequency = bar.Frequency.MINUTE
    paras = [5, 20]
    plot = True
    #############################################path set ############################33

    feed = Feed(frequency)
    feed.loadBars('bitmex_BCHZ18', test_back=True)

    strat = strat(feed, "bitmex_BCHZ18", *paras)

    from pyalgotrade.stratanalyzer import returns
    from pyalgotrade.stratanalyzer import sharpe
    from pyalgotrade.stratanalyzer import drawdown
    from pyalgotrade.stratanalyzer import trades

    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, True, True)

    strat.run()

    if plot:
        plt.plot()

    # 夏普率
    sharp = sharpeRatioAnalyzer.getSharpeRatio(0.02)
    print(sharp)
    # 最大回撤
    maxdd = drawDownAnalyzer.getMaxDrawDown()
    print(maxdd)

    # 收益率
    return_ = retAnalyzer.getCumulativeReturns()[-1]
    print(return_)
    # 收益曲线
    return_list = []
    for item in retAnalyzer.getCumulativeReturns():
        return_list.append(item)
    print(return_list)