Ejemplo n.º 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)
Ejemplo n.º 2
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)
	def testDrawDownIGE_SPY_Broker(self):
		# This testcase is based on an example from Ernie Chan's book:
		# 'Quantitative Trading: How to Build Your Own Algorithmic Trading Business'
		barFeed = yahoofeed.Feed()
		barFeed.addBarsFromCSV("ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
		barFeed.addBarsFromCSV("spy", common.get_data_file_path("sharpe-ratio-test-spy.csv"))
		strat = strategy_test.TestStrategy(barFeed, 1000)
		strat.getBroker().setUseAdjustedValues(True)
		strat.setBrokerOrdersGTC(True)
		stratAnalyzer = drawdown.DrawDown()
		strat.attachAnalyzer(stratAnalyzer)

		# Manually place IGE order to get it filled on the first bar.
		order = strat.getBroker().createMarketOrder(broker.Order.Action.BUY, "ige", 1, True) # Adj. Close: 42.09
		order.setGoodTillCanceled(True)
		strat.getBroker().placeOrder(order)
		strat.addOrder(datetime.datetime(2007, 11, 13), strat.getBroker().createMarketOrder, broker.Order.Action.SELL, "ige", 1, True) # Adj. Close: 127.64

		# Manually place SPY order to get it filled on the first bar.
		order = strat.getBroker().createMarketOrder(broker.Order.Action.SELL_SHORT, "spy", 1, True) # Adj. Close: 105.52
		order.setGoodTillCanceled(True)
		strat.getBroker().placeOrder(order)
		strat.addOrder(datetime.datetime(2007, 11, 13), strat.getBroker().createMarketOrder, broker.Order.Action.BUY_TO_COVER, "spy", 1, True) # Adj. Close: 147.67

		strat.run()
		self.assertTrue(round(strat.getBroker().getCash(), 2) == round(1000 + (127.64 - 42.09) + (105.52 - 147.67), 2))
		self.assertTrue(strat.getOrderUpdatedEvents() == 4)
		self.assertTrue(round(stratAnalyzer.getMaxDrawDown(), 5) == 0.09448)
		self.assertTrue(stratAnalyzer.getMaxDrawDownDuration()== 229)
Ejemplo n.º 4
0
    def __testIGE_BrokerImpl(self, quantity):
        initialCash = 42.09 * quantity
        # This testcase is based on an example from Ernie Chan's book:
        # 'Quantitative Trading: How to Build Your Own Algorithmic Trading Business'
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            "ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
        strat = strategy_test.TestStrategy(barFeed, initialCash)
        strat.getBroker().setUseAdjustedValues(True)
        strat.setBrokerOrdersGTC(True)
        stratAnalyzer = drawdown.DrawDown()
        strat.attachAnalyzer(stratAnalyzer)

        # Manually place the order to get it filled on the first bar.
        order = strat.getBroker().createMarketOrder(broker.Order.Action.BUY,
                                                    "ige", quantity,
                                                    True)  # Adj. Close: 42.09
        order.setGoodTillCanceled(True)
        strat.getBroker().placeOrder(order)
        strat.addOrder(strategy_test.datetime_from_date(2007, 11, 13),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL, "ige", quantity,
                       True)  # Adj. Close: 127.64
        strat.run()

        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == initialCash +
            (127.64 - 42.09) * quantity)
        self.assertTrue(strat.getOrderUpdatedEvents() == 4)
        self.assertTrue(round(stratAnalyzer.getMaxDrawDown(), 5) == 0.31178)
        self.assertTrue(
            stratAnalyzer.getLongestDrawDownDuration() == datetime.timedelta(
                days=623))
Ejemplo n.º 5
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'
                )
Ejemplo n.º 6
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()
Ejemplo n.º 7
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')
Ejemplo n.º 8
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()))
Ejemplo n.º 9
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()))
Ejemplo n.º 10
0
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()))
Ejemplo n.º 11
0
    def __init__(self, strategy, index_code=None):
        """
        :param strategy: 策略
        :param index_code: index基准利率代码应该同tushare保持一致
        sh 上证指数 sz 深圳成指 hs300 沪深300指数 sz50 上证50指数 zxb 中小板指数 cyb 创业板指数
        :return:
        """
        self.__baseRet_code = index_code
        self.__baseRet_data = None
        self.__currBaseRet = []
        self.__last_baseRet = 0.0
        self.__baseRet = dataseries.SequenceDataSeries()
        self.__betaRet = dataseries.SequenceDataSeries()
        self.__alphaRet = dataseries.SequenceDataSeries()
        self.__sharpeRet = dataseries.SequenceDataSeries()
        self.__LongestDrawDown = dataseries.SequenceDataSeries()
        self.__MaxDrawDown = dataseries.SequenceDataSeries()
        self.__ret_analyzer = returns.Returns()
        self.__sharpe_ratio = sharpe.SharpeRatio(False)
        self.__draw_down = drawdown.DrawDown()
        self.__beta = Beta()

        strategy.attachAnalyzer(self.__ret_analyzer)
        strategy.attachAnalyzer(self.__sharpe_ratio)
        strategy.attachAnalyzer(self.__draw_down)
        strategy.attachAnalyzer(self.__beta)
        strategy.attachAnalyzer(self)
Ejemplo n.º 12
0
def main(start_date, end_date, maxLen=MAX_BAR_NUM, peried='D'):
    all_df = get_stock_pool(start_date, end_date)
    codes = list(set(all_df.code.tolist()))
    #每只股票可投资的金额
    cash = 100000
    stockNum = 10
    totalRisk = 0.01
    duaration = 10  #调仓周期

    feed = get_feed(all_df, codes, start_date, end_date, peried, duaration)
    if feed is None: return False

    macdStrategy = MACDStrategy(totalRisk, codes, feed, cash, SHORT, LONG, MID,
                                maxLen, stockNum, duaration)
    # Attach a drawdown analyzer to the strategy
    drawdownAnalyzer = drawdown.DrawDown()
    macdStrategy.attachAnalyzer(drawdownAnalyzer)
    # Attach a sharpe ratio analyzers to the strategy
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    macdStrategy.attachAnalyzer(sharpeRatioAnalyzer)
    # Attach the plotter to the strategy
    plt = plotter.StrategyPlotter(macdStrategy, False, True, True)
    plt.getOrCreateSubplot("sharpRatio").addDataSeries(
        "sharpRatio", sharpeRatioAnalyzer.getReturns())
    # Run Strategy
    macdStrategy.run()
    macdStrategy.info("Get Max Downdown: %.2f" %
                      drawdownAnalyzer.getMaxDrawDown())
    macdStrategy.info("Final portfolio value: %.2f" % macdStrategy.getResult())
    plt.plot()
Ejemplo n.º 13
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()
Ejemplo n.º 14
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()
Ejemplo n.º 15
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)
Ejemplo n.º 16
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()
Ejemplo n.º 17
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()))
Ejemplo n.º 18
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()        
Ejemplo n.º 19
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)
Ejemplo n.º 20
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)
Ejemplo n.º 21
0
def test_strat(plot):
    # instrument = '600288SH'
    instrument = 'FG0'
    # plot = True
    # instrument = "600281SH"
    # short_ma_Period = 10
    # medium_ma_period = 20
    # long_ma_period = 99

    # Download the bars.
    # feed = yahoofinance.build_feed([instrument], 2011, 2012, ".")
    # csv_path = os.path.abspath('../histdata/day') + '/' + instrument + '.csv'
    csv_path = os.path.abspath(
        '../histdata/commodity') + '/' + instrument + '.csv'
    # feed = sf.Feed(frequency=bar.Frequency.MINUTE)
    feed = sf.Feed()
    feed.addBarsFromCSV(instrument, csv_path)
    # feed = csvfeed.Feed('Date', )
    strat = ArimaGarch(feed,
                       instrument,
                       window=500,
                       arima_order=(5, 0, 5),
                       garch_order=(1, 1))
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    returnsAnalyzer = returns.Returns()
    strat.attachAnalyzer(returnsAnalyzer)
    ddAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(ddAnalyzer)

    if plot:
        plt = plotter.StrategyPlotter(strat, True, True, True)
        # plt.getInstrumentSubplot("FG0").addDataSeries("close")
        plt.getOrCreateSubplot("returns").addDataSeries(
            "Simple returns", returnsAnalyzer.getReturns())
        # plt.getInstrumentSubplot(instrument).addDataSeries("short sma", strat.getShortSMA())
        # plt.getInstrumentSubplot(instrument).addDataSeries("medium sma", strat.getMediumSMA())
        # plt.getInstrumentSubplot(instrument).addDataSeries("long sma", strat.getLongSMA())

        # plt.getInstrumentSubplot(instrument).addDataSeries("middle", strat.getBollingerBands().getMiddleBand())
        # plt.getInstrumentSubplot(instrument).addDataSeries("lower", strat.getBollingerBands().getLowerBand())

    strat.run()
    print("Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05))
    print(
        "max dd : %.2f, duration: %s" %
        (ddAnalyzer.getMaxDrawDown(), ddAnalyzer.getLongestDrawDownDuration()))

    if plot:
        plt.plot()
    pass
Ejemplo n.º 22
0
def algo_test(target_name,
              target_csv,
              model_name,
              model_csv,
              model_prediction_std=0.0):
    # Load the bar feed from the CSV file
    feed = csvfeed.GenericBarFeed(pyalgotrade.bar.Frequency.DAY)
    feed.addBarsFromCSV(target_name, target_csv)
    feed.addBarsFromCSV(model_name, model_csv)

    # Evaluate the strategy with the feed's bars.
    myStrategy = MyStrategy(feed, target_name, model_prediction_std)
    # myStrategy = MyBasicStrategy(feed, target_name)

    # Attach analyzers.
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    sortinoRatioAnalyzer = sortino.SortinoRatio()
    myStrategy.attachAnalyzer(sortinoRatioAnalyzer)

    # Run the strategy
    myStrategy.run()

    # Print the results.
    print("Final portfolio value: $%.2f" % myStrategy.getResult())
    print("Total return: %.2f %%" %
          (retAnalyzer.getCumulativeReturns()[-1] * 100))
    print("Average daily return: %.2f %%" %
          (stats.mean(retAnalyzer.getReturns()) * 100))
    print("Std. dev. daily return: %.4f" %
          (stats.stddev(retAnalyzer.getReturns())))
    print("Sharpe ratio: %.2f" % (sharpeRatioAnalyzer.getSharpeRatio(0)))
    print("Sortino ratio: %.2f" % (sortinoRatioAnalyzer.getSortinoRatio(0)))

    returnsPerDay = stats.mean(retAnalyzer.getReturns())

    # print("shares list : ")
    # print(myStrategy.getShares())
    output = {
        'sharpe': sharpeRatioAnalyzer.getSharpeRatio(0),
        'sortino': sortinoRatioAnalyzer.getSortinoRatio(0),
        'returnAnalyzer': retAnalyzer,
        'annualReturns': returnsPerDay * 252
    }

    return output
	def testNoTrades(self):
		barFeed = yahoofeed.Feed()
		barFeed.addBarsFromCSV("ige", common.get_data_file_path("sharpe-ratio-test-ige.csv"))
		barFeed.addBarsFromCSV("spy", common.get_data_file_path("sharpe-ratio-test-spy.csv"))
		strat = strategy_test.TestStrategy(barFeed, 1000)
		strat.setBrokerOrdersGTC(True)
		strat.getBroker().setUseAdjustedValues(True)
		stratAnalyzer = drawdown.DrawDown()
		strat.attachAnalyzer(stratAnalyzer)

		strat.run()
		self.assertTrue(strat.getBroker().getCash() == 1000)
		self.assertTrue(strat.getOrderUpdatedEvents() == 0)
		self.assertTrue(stratAnalyzer.getMaxDrawDown() == 0)
		self.assertTrue(stratAnalyzer.getMaxDrawDownDuration()== 0)
Ejemplo n.º 24
0
    def __testManualImpl(self, closingPrices, cash):
        barFeed = TestBarFeed(bar.Frequency.DAY)
        bars = build_bars_from_closing_prices(closingPrices)
        barFeed.addBarsFromSequence("orcl", bars)

        strat = strategy_test.TestStrategy(barFeed, cash)
        stratAnalyzer = drawdown.DrawDown()
        strat.attachAnalyzer(stratAnalyzer)

        # Manually place the order to get it filled on the first bar.
        order = strat.getBroker().createMarketOrder(broker.Order.Action.BUY, "orcl", 1, True)
        order.setGoodTillCanceled(True)
        strat.getBroker().submitOrder(order)

        strat.run()
        return stratAnalyzer
Ejemplo n.º 25
0
    def __run_backtesting(cls, strategy):

        retAnalyzer = returns.Returns()

        strategy.attachAnalyzer(retAnalyzer)

        sharpeRatioAnalyzer = sharpe.SharpeRatio()

        strategy.attachAnalyzer(sharpeRatioAnalyzer)

        drawDownAnalyzer = drawdown.DrawDown()

        strategy.attachAnalyzer(drawDownAnalyzer)

        tradesAnalyzer = trades.Trades()

        strategy.attachAnalyzer(tradesAnalyzer)

        plt = plotter.StrategyPlotter(strategy, True, True, True)
        #plt.getOrCreateSubplot('position').addDataSeries('position', strategy.get_position())
        for k, v in strategy.get_sma().iteritems():
            plt.getInstrumentSubplot('indicator').addDataSeries(k, v)

        strategy.run()

        print '[收益率: ', strategy.getBroker().getEquity(
        ) / CONFIG['START_CAPTIAL'], ']'
        print '[STRATEGY FINISH]'

        # 夏普率
        sharp = sharpeRatioAnalyzer.getSharpeRatio(0.05)
        print '[夏普率: ', sharp, ']'

        # 最大回撤
        maxdd = drawDownAnalyzer.getMaxDrawDown()
        print '[最大回撤: ', maxdd, ']'

        # 收益率
        return_ = retAnalyzer.getCumulativeReturns()[-1]
        print '[收益率: ', return_, ']'

        # 收益曲线
        return_list = []
        for item in retAnalyzer.getCumulativeReturns():
            return_list.append(item)

        plt.plot()
Ejemplo n.º 26
0
def runStrategy(code, csv_file, stdout=False):
    feed = yahoofeed.Feed()
    # feed.addBarsFromCSV("000001", "download\\000001.csv")

    feed.addBarsFromCSV(code, csv_file)
    myStrategy = MyStrategy(feed, code)

    # init analyzers
    returnsAnalyzer = returns.Returns()
    drawDownAnalyzer = drawdown.DrawDown()
    tradesAnalyzer = trades.Trades()

    # attach analyzers
    myStrategy.attachAnalyzer(returnsAnalyzer)
    myStrategy.attachAnalyzer(drawDownAnalyzer)
    myStrategy.attachAnalyzer(tradesAnalyzer)

    # add subplot to plot
    plt = plotter.StrategyPlotter(myStrategy)

    # add sma 10 dataseries to plot
    plt.getInstrumentSubplot(code).addDataSeries("SMA10",
                                                 myStrategy.getSMA10())

    # add sma 10 dataseries to plot
    plt.getInstrumentSubplot(code).addDataSeries("SMA25",
                                                 myStrategy.getSMA25())

    # create returns subplot
    plt.getOrCreateSubplot("returns").addDataSeries(
        "Simple returns", returnsAnalyzer.getReturns())

    myStrategy.run()
    result = myStrategy.getResult()
    cumReturn = returnsAnalyzer.getCumulativeReturns()[-1] * 100
    maxDrawdown = drawDownAnalyzer.getMaxDrawDown() * 100
    tradeCount = tradesAnalyzer.getCount()

    if stdout:
        print("Total trades: %d" % tradeCount)
        print("Final portfolio value: $%.2f" % result)
        print("Cumulative returns: %.2f %%" % cumReturn)
        print("Max. drawdown: %.2f %%" % maxDrawdown)
        plt.plot()

    return cumReturn, maxDrawdown, tradeCount
Ejemplo n.º 27
0
    def initAnalyzer(self):
        from pyalgotrade.stratanalyzer import sharpe
        from pyalgotrade.stratanalyzer import returns
        from pyalgotrade.stratanalyzer import drawdown
        from pyalgotrade.stratanalyzer import trades
        # 1.0) 策略结果
        self.returnsAnalyzer = returns.Returns()
        # 1.1) 夏普比率
        self.sharpeRatioAnalyzer = sharpe.SharpeRatio()
        # 1.2)
        self.drawdownAnalyzer = drawdown.DrawDown()
        # 1.3)
        self.tradesAnalyzer = trades.Trades()

        self.attachAnalyzer(self.sharpeRatioAnalyzer)
        self.attachAnalyzer(self.returnsAnalyzer)
        self.attachAnalyzer(self.tradesAnalyzer)
        self.attachAnalyzer(self.drawdownAnalyzer)
Ejemplo n.º 28
0
def run_strategy(m):

    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("test1", "../dataFile/orcl-2000.csv")

    myStrategy = SMACrossOver(feed, "test1", m)

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

    myStrategy.run()

    print "total trades: %d" % (tradesAnalyzer.getCount())
    """
def main(plot):
    instrument = "TSLA"
    vwapWindowSize = 60
    threshold = 0.00000001

    # Download the bars.
    feed = quandl.build_feed("WIKI", [instrument], 2007, 2018, ".")

    strat = VWAPMomentum(feed, instrument, vwapWindowSize, threshold)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    retAnalyzer = returns.Returns()
    strat.attachAnalyzer(retAnalyzer)
    drawDownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawDownAnalyzer)
    tradesAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradesAnalyzer)
    returns3 = tradesAnalyzer.getAllReturns()
    if plot:
        plt = plotter.StrategyPlotter(strat, True, False, True)
        plt.getInstrumentSubplot(instrument).addDataSeries(
            "vwap", strat.getVWAP())

    strat.run()
    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()))
    print(retAnalyzer.getReturns())
    print("")
    print("Total trades: %d" % (tradesAnalyzer.getCount()))
    if tradesAnalyzer.getCount() > 0:
        profits = tradesAnalyzer.getAll()
        print("Avg. profit: $%2.f" % (profits.mean()))
        print("Profits std. dev.: $%2.f" % (profits.std()))
        print("Max. profit: $%2.f" % (profits.max()))
        print("Min. profit: $%2.f" % (profits.min()))
        print(stats.ttest_1samp(tradesAnalyzer.getAllReturns(), 0))
    if plot:
        plt.plot()
Ejemplo n.º 30
0
def run_strategy(paras):
    feed = dataframefeed.Feed()
    feed.addBarsFromDataFrame(instrument, dat)
    strat = singleMA.SingleMA(feed, instrument, paras, initialCash)

    # attach analyzersgc
    returnsAnalyzer = returns.Returns()
    strat.attachAnalyzer(returnsAnalyzer)
    drawdownAnalyzer = drawdown.DrawDown()
    strat.attachAnalyzer(drawdownAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    tradeAnalyzer = trades.Trades()
    strat.attachAnalyzer(tradeAnalyzer)

    strat.run()
    print "Final portfolio value: $%.2f with paras %d" % (
        strat.getBroker().getEquity(), paras)
    return {
        'returns':
        returnsAnalyzer.getCumulativeReturns()[-1],
        'drawdown':
        drawdownAnalyzer.getMaxDrawDown(),
        'longestDrawDownDuration':
        drawdownAnalyzer.getLongestDrawDownDuration(),
        'sr':
        sharpeRatioAnalyzer.getSharpeRatio(0.03),
        'total trades':
        tradeAnalyzer.getCount(),
        'win':
        tradeAnalyzer.getProfitableCount(),
        'lose':
        tradeAnalyzer.getUnprofitableCount(),
        'average win profit':
        tradeAnalyzer.getPositiveReturns().mean(),
        'average lose loss':
        tradeAnalyzer.getNegativeReturns().mean(),
        'wining ratio':
        tradeAnalyzer.getProfitableCount() / tradeAnalyzer.getCount(),
        'odds':
        -tradeAnalyzer.getPositiveReturns().mean() /
        tradeAnalyzer.getNegativeReturns().mean()
    }