Esempio n. 1
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()
Esempio n. 2
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)
Esempio n. 3
0
def main(start_date,
         end_date,
         maxLen=DIVERGENCE_DETECT_DIF_LIMIT_BAR_NUM,
         peried='D'):
    '''
    count: 采用过去count个bar内极值的最大值作为参考。
    '''
    all_df = get_stock_pool(start_date, end_date)
    codes = list(set(all_df.code.tolist()))
    strategys = dict()
    for code in codes:
        feed = get_feed(all_df, code, start_date, end_date, peried)
        if feed is None: return False
        brk = gen_broker(feed)
        strategys[code] = MACDStrategy(code, feed, brk, SHORT, LONG, MID,
                                       maxLen)
        # Attach a returns analyzers to the strategy
        returnsAnalyzer = returns.Returns()
        strategys[code].attachAnalyzer(returnsAnalyzer)
        # Attach a sharpe ratio analyzers to the strategy
        sharpeRatioAnalyzer = sharpe.SharpeRatio()
        strategys[code].attachAnalyzer(sharpeRatioAnalyzer)
        # Attach the plotter to the strategy
        plt = plotter.StrategyPlotter(strategys[code], True, True, True)
        plt.getOrCreateSubplot("returns").addDataSeries(
            "Simple returns", returnsAnalyzer.getReturns())
        plt.getOrCreateSubplot("Macd").addDataSeries("dif",
                                                     strategys[code].getDif())
        plt.getOrCreateSubplot("Macd").addDataSeries("dea",
                                                     strategys[code].getDea())
        # Run Strategy
        strategys[code].run()
        strategys[code].info("Final portfolio value: $%.2f" %
                             strategys[code].getResult())
        plt.plot()
Esempio n. 4
0
    def testTwoBarReturns_CloseClose(self):
        initialCash = 15.90
        barFeed = yahoofeed.Feed()
        barFeed.setBarFilter(
            csvfeed.DateRangeFilter(
                strategy_test.datetime_from_date(2001, 12, 06),
                strategy_test.datetime_from_date(2001, 12, 07)))
        barFeed.addBarsFromCSV(
            ReturnsTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = strategy_test.TestStrategy(barFeed, initialCash)

        # 2001-12-06,15.61,16.03,15.50,15.90,66944900,15.55
        # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56
        # Manually place the entry order, to get it filled on the first bar.
        order = strat.getBroker().createMarketOrder(
            broker.Order.Action.BUY, ReturnsTestCase.TestInstrument, 1,
            True)  # Close: 15.90
        strat.getBroker().placeOrder(order)
        strat.addOrder(strategy_test.datetime_from_date(2001, 12, 06),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.SELL,
                       ReturnsTestCase.TestInstrument, 1, True)  # Close: 15.91

        stratAnalyzer = returns.Returns()
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        self.assertTrue(strat.getBroker().getCash() == initialCash +
                        (15.91 - 15.90))
        # First day returns: 0
        self.assertTrue(stratAnalyzer.getReturns()[0] == 0)
        # Second day returns: Open vs Prev. day's close
        self.assertTrue(stratAnalyzer.getReturns()[1] == (15.91 - 15.90) /
                        15.90)
Esempio n. 5
0
def main():
    # Load the orders file.
    ordersFile = OrdersFile("./OrderFiles/orders.csv")
    print "First date", ordersFile.getFirstDate()
    print "Last date", ordersFile.getLastDate()
    print "Symbols", ordersFile.getInstruments()


    qsPath = "/Users/LunaFire/Anaconda/lib/python2.7/site-packages/QSTK"

    feed = yahoofeed.Feed()
    feed.setBarFilter(csvfeed.DateRangeFilter(ordersFile.getFirstDate(), ordersFile.getLastDate()))
    feed.setDailyBarTime(datetime.time(0, 0, 0))  # This is to match the dates loaded with the ones in the orders file.
    for symbol in ordersFile.getInstruments():
        feed.addBarsFromCSV(symbol, os.path.join(qsPath, "QSData", "Yahoo", symbol + ".csv"))

    # Run the strategy.
    cash = 1000000
    useAdjustedClose = True
    myStrategy = MyStrategy(feed, cash, ordersFile, useAdjustedClose)

    # Attach returns and sharpe ratio analyzers.
    retAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(retAnalyzer)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)

    myStrategy.run()

    # Print the results.
    print "Final portfolio value: $%.2f" % myStrategy.getResult()
    print "Anual 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))
Esempio n. 6
0
def ENE(type='old', code='600281'):
    dat = pd.read_csv("../../api/stock/csv/%sSH_5min.csv" % code, encoding='gbk')
    dat = dat.fillna(method='pad')
    dat['Adj Close'] = dat['Close']
    dat = dat.rename(columns={'Open': 'open', 'High': 'high', 'Volume': 'volume', 'Close': 'close', 'Low': 'low'})
    dat.index = dat['Date Time']
    dat.index.name = 'date'

    # dat = dat.ix[17000:18000,:]
    feed = dataFramefeed.Feed(frequency=bar.Frequency.MINUTE)
    feed.addBarsFromDataFrame("orcl", dat)

    if type == 'macd':
        myStrategy = mdd.ENE_backtest(feed, 'orcl')
    elif type == 'old':
        myStrategy = mdd.ENE_backtest(feed, 'orcl')
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    myStrategy.attachAnalyzer(sharpeRatioAnalyzer)

    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)
    plt = plotter.StrategyPlotter(myStrategy, True, True, True)
    plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())

    ds = pyalg_utils.dataSet(myStrategy)  # 抽取交易数据集语句,若使用系统自带画图功能则不需要该项
    myStrategy.run()
    plt.plot()

    print('最大回撤:\t%f\t 交易笔数:\t%d\t 盈利笔数:\t%d\n' % (ds.getMaxDrawDown(), ds.getCount(), ds.getProfitableCount()))
    print('累计收益:\t%f\t 夏普比率:\t%f\t' % (returnsAnalyzer.getCumulativeReturns()[-1], ds.getSharpeRatio()))
Esempio n. 7
0
    def testFirstBar(self):
        initialCash = 1000
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = strategy_test.TestStrategy(barFeed, initialCash)

        strat.addOrder(datetime.datetime(2001, 0o1, 0o2),
                       strat.getBroker().createMarketOrder,
                       broker.Order.Action.BUY,
                       AnalyzerTestCase.TestInstrument, 1,
                       False)  # 2001-01-03 Open: 25.25 Close: 32.00

        stratAnalyzer = returns.Returns()
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        self.assertEqual(stratAnalyzer.getReturns()[0], 0)
        self.assertEqual(stratAnalyzer.getReturns()[1], (32.00 - 25.25) / 1000)

        # Check date times.
        datetimes = barFeed[AnalyzerTestCase.TestInstrument].getDateTimes()
        for i in [0, -1]:
            self.assertEqual(stratAnalyzer.getReturns().getDateTimes()[i],
                             datetimes[i])
            self.assertEqual(
                stratAnalyzer.getCumulativeReturns().getDateTimes()[i],
                datetimes[i])
Esempio n. 8
0
def turtle_test(dataString='pyalg'):
    """
    :param dataString:
    :return:
    """
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV(
        "orcl", "../../api/stock/csv/orcl-2000.csv")  #注意查看该csv的格式,Open为大写

    myStrategy = pdr.turtle(feed, "orcl", 20, 10)
    # Attach a returns analyzers to the trategy.
    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)

    # Attach the plotter to the strategy.
    plt = plotter.StrategyPlotter(myStrategy)
    # Plot the simple returns on each bar.
    plt.getOrCreateSubplot("returns").addDataSeries(
        "Simple returns", returnsAnalyzer.getReturns())

    if dataString == 'pyalg_util':
        ds = pyalg_utils.dataSet(myStrategy)  # 抽取交易数据集语句,若使用系统自带画图功能则不需要该项
    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])  # 简单作图示例

    plt.plot()
Esempio 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()))
Esempio n. 10
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()))
Esempio n. 11
0
def main(plot):
    instrument = "n225"
    # Load the bar feed from the CSV file
    feed = yahoofeed.Feed()
    feed.addBarsFromCSV(instrument, r".\N225.csv")

    hurstPeriod = 100
    strat = StrategyModule.HurstBasedStrategy(feed, "n225", hurstPeriod)

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

    # Attach a returns analyzers to the strategy.
    returnsAnalyzer = returns.Returns()
    strat.attachAnalyzer(returnsAnalyzer)

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

        plt.getOrCreateSubplot("hurst").addDataSeries("Hurst", strat.getHurst())
        plt.getOrCreateSubplot("hurst").addLine("random", 0.5)

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

    strat.run()
    strat.info("Final portfolio value: $%.2f" % strat.getResult())
    print("Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05))

    if plot:
        plt.plot()
Esempio n. 12
0
def main(plot):

    bBandsPeriod = 1
    instrument = '600519'
    feed = dataFramefeed.Feed()
    dat = ts.get_hist_data("hs300", start='2017-01-01', end='2017-12-27')
    dat['Adj Close'] = dat['close']
    #feed.addBarsFromDataFrame("hs300", dat.ix[:,(0,1,2,3,4,13)])

    dat = ts.get_hist_data("600519", start='2017-01-01', end='2017-12-27')
    dat['Adj Close'] = dat['close']
    feed.addBarsFromDataFrame("600519", dat.ix[:, (0, 1, 2, 3, 4, 14)])

    strat = BBands(feed, instrument, bBandsPeriod)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    returnsAnalyzer = returns.Returns()
    if plot:
        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()
    print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)

    if plot:
        plt.plot()
Esempio n. 13
0
def main():
	# Load the orders file.
	ordersFile = OrdersFile("orders.csv")
	print "First date", ordersFile.getFirstDate()
	print "Last date", ordersFile.getLastDate()
	print "Symbols", ordersFile.getInstruments()

	# Load the data from QSTK storage. QS environment variable has to be defined.
	if os.getenv("QS") == None:
		raise Exception("QS environment variable not defined")
	feed = yahoofeed.Feed()
	feed.setBarFilter(csvfeed.DateRangeFilter(ordersFile.getFirstDate(), ordersFile.getLastDate()))
	feed.setDailyBarTime(datetime.time(0, 0, 0)) # This is to match the dates loaded with the ones in the orders file.
	for symbol in ordersFile.getInstruments():
		feed.addBarsFromCSV(symbol, os.path.join(os.getenv("QS"), "QSData", "Yahoo", symbol + ".csv"))

	# Run the strategy.
	cash = 1000000
	useAdjustedClose = True
	myStrategy = MyStrategy(feed, cash, ordersFile, useAdjustedClose)

	# Attach returns and sharpe ratio analyzers.
	retAnalyzer = returns.Returns()
	myStrategy.attachAnalyzer(retAnalyzer)
	sharpeRatioAnalyzer = sharpe.SharpeRatio()
	myStrategy.attachAnalyzer(sharpeRatioAnalyzer)

	myStrategy.run()

	# Print the results.
	print "Final portfolio value: $%.2f" % myStrategy.getResult()
	print "Anual 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, 252))
Esempio n. 14
0
def runStrategy():
    # 下载数据
    jdf = ts.get_k_data("000725")

    # 新建Adj Close字段
    jdf["Adj Close"] = jdf.close

    # 将tushare下的数据的字段保存为pyalgotrade所要求的数据格式
    jdf.columns = [
        "Date", "Open", "Close", "High", "Low", "Volume", "code", "Adj Close"
    ]

    # 将数据保存成本地csv文件
    jdf.to_csv("jdf.csv", index=False)

    feed = yahoofeed.Feed()
    feed.addBarsFromCSV("jdf", "jdf.csv")

    myStrategy = MyStrategy(feed, "jdf")

    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)
    plt = plotter.StrategyPlotter(myStrategy)
    plt.getInstrumentSubplot("jdf")
    plt.getOrCreateSubplot("returns").addDataSeries(
        "Simple returns", returnsAnalyzer.getReturns())

    myStrategy.run()
    print("Final portfolio value: $%.2f" % myStrategy.getResult())
    plt.plot()
Esempio n. 15
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()))
Esempio n. 16
0
    def __init__(
        self,
        algo: GQAlgo,
        symbols,
        start_datetime,
        end_datetime,
        data_freq=FREQ_DAY,
        initial_cash=10000,
    ):
        self.algo = algo
        self.symbols = symbols
        self.start_datetime = start_datetime
        self.end_datetime = end_datetime
        self.data_freq = data_freq
        self.datasource = algo.datasource
        self.initial_cash = initial_cash

        self.data = GQData()

        freq_map = {
            FREQ_DAY: Frequency.DAY,
            FREQ_MINUTE: Frequency.MINUTE,
        }
        self.datafeed = csvfeed.GenericBarFeed(freq_map[data_freq])
        self._load_datafeed()

        self.my_strategy = MyStrategy(self.datafeed, self.symbols, self.algo,
                                      self.initial_cash)
        self.returnsAnalyzer = returns.Returns()
        self.my_strategy.attachAnalyzer(self.returnsAnalyzer)
Esempio n. 17
0
    def testTwoBarReturns_CloseOpen(self):
        initialCash = 15.9
        barFeed = yahoofeed.Feed()
        barFeed.setBarFilter(csvfeed.DateRangeFilter(datetime.datetime(2001, 12, 6), datetime.datetime(2001, 12, 7)))
        barFeed.addBarsFromCSV(
            INSTRUMENT, common.get_data_file_path("orcl-2001-yahoofinance.csv")
        )
        strat = strategy_test.TestStrategy(barFeed, {PRICE_CURRENCY: initialCash})

        # 2001-12-06,15.61,16.03,15.50,15.90,66944900,15.55
        # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56
        # Manually place the entry order, to get it filled on the first bar.
        order = strat.getBroker().createMarketOrder(
            broker.Order.Action.BUY, INSTRUMENT, 1, True
        )  # Close: 15.90
        strat.getBroker().submitOrder(order)
        strat.addOrder(
            datetime.datetime(2001, 12, 6), strat.getBroker().createMarketOrder, broker.Order.Action.SELL,
            INSTRUMENT, 1, False
        )  # Open: 15.74

        stratAnalyzer = returns.Returns(PRICE_CURRENCY)
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        self.assertTrue(strat.getBroker().getBalance(PRICE_CURRENCY) == initialCash + (15.74 - 15.90))
        # First day returns: 0
        self.assertTrue(stratAnalyzer.getReturns()[0] == 0)
        # Second day returns: Open vs Prev. day's close
        self.assertTrue(stratAnalyzer.getReturns()[1] == (15.74 - 15.90) / 15.90)
Esempio n. 18
0
File: 1.py Progetto: cxn945/quant-dc
def run_strategy():
    # Load the yahoo feed from the CSV file
    feed = GenericBarFeed(Frequency.DAY, None, None)
    feed.addBarsFromCSV("orcl", "2000.csv")

    # commission
    broker_commission = broker.backtesting.TradePercentage(0.002)
    broker_brk = floatBroker(50000, feed, broker_commission)
#    broker_brk = broker.backtesting.Broker(50000, feed)
    # Evaluate the strategy with the feed.
    myStrategy = MyStrategy(feed, "orcl", broker_brk)
    
    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)
    

    # Attach the plotter to the strategy.
    plt = plotter.StrategyPlotter(myStrategy)
    # Include the SMA in the instrument's subplot to get it displayed along with the closing prices.
    plt.getInstrumentSubplot("orcl").addDataSeries("SMA60", myStrategy.getSMA(60))
    plt.getInstrumentSubplot("orcl").addDataSeries("SMA10", myStrategy.getSMA(10))
    plt.getInstrumentSubplot("orcl").addDataSeries("SMA30", myStrategy.getSMA(30))
    # Plot the simple returns on each bar.
    plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())
    
    
    myStrategy.run()
    print("Final portfolio value: $%.2f %.2f %.2f" %(myStrategy.getBroker().getEquity(), myStrategy.getBroker().getCash(), myStrategy.getBroker().getShares('orcl')))
#    myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())

    # Plot the strategy.
    plt.plot()
Esempio n. 19
0
def main(start_date,
         end_date,
         maxLen=DIVERGENCE_DETECT_DIF_LIMIT_BAR_NUM,
         peried='D'):
    all_df = get_stock_pool(start_date, end_date)
    codes = list(set(all_df.code.tolist()))
    feed = get_feed(all_df, codes, start_date, end_date, peried)
    if feed is None: return False
    #每只股票可投资的金额
    cash = 100000
    stockNum = 10
    totalRisk = 0.1
    duaration = 10  #调仓周期
    macdStrategy = MACDStrategy(totalRisk, codes, feed, cash, SHORT, LONG, MID,
                                maxLen, stockNum, duaration)
    # Attach a returns analyzers to the strategy
    returnsAnalyzer = returns.Returns()
    macdStrategy.attachAnalyzer(returnsAnalyzer)
    # 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("returns").addDataSeries(
        "returns", returnsAnalyzer.getReturns())
    plt.getOrCreateSubplot("sharpRatio").addDataSeries(
        "sharpRatio", sharpeRatioAnalyzer.getReturns())
    #plt.getOrCreateSubplot("Macd").addDataSeries("dif", strategys[code].getDif())
    #plt.getOrCreateSubplot("Macd").addDataSeries("dea", strategys[code].getDea())
    # Run Strategy
    macdStrategy.run()
    macdStrategy.info("Final portfolio value: $%.2f" %
                      macdStrategy.getResult())
    plt.plot()
Esempio n. 20
0
def main(plot):
    instrument = "000300.ss"
    feed = yahoofinance.build_feed([instrument], 2013, 2015, ".")

    period = 100
    strat = HurstBasedStrategy(feed, instrument, period)

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

    # Attach a returns analyzers to the strategy.
    returnsAnalyzer = returns.Returns()
    strat.attachAnalyzer(returnsAnalyzer)

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

        plt.getOrCreateSubplot("hurst").addDataSeries("Hurst",
                                                      strat.getHurst())
        plt.getOrCreateSubplot("hurst").addLine("random", 0.5)

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

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

    # print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)

    if plot:
        plt.plot()
Esempio n. 21
0
    def testCumulativeReturn(self):
        initialCash = 33.06
        barFeed = yahoofeed.Feed()
        barFeed.addBarsFromCSV(
            AnalyzerTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = position_test.TestStrategy(barFeed,
                                           AnalyzerTestCase.TestInstrument,
                                           initialCash)

        strat.addPosEntry(datetime.datetime(2001, 1, 12), strat.enterLong,
                          AnalyzerTestCase.TestInstrument, 1)  # 33.06
        strat.addPosExitMarket(datetime.datetime(2001, 11, 27))  # 14.32

        stratAnalyzer = returns.Returns(maxLen=10)
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        self.assertTrue(
            round(strat.getBroker().getCash(), 2) == round(
                initialCash + (14.32 - 33.06), 2))
        self.assertTrue(
            round(33.06 *
                  (1 + stratAnalyzer.getCumulativeReturns()[-1]), 2) == 14.32)
        self.assertEqual(len(stratAnalyzer.getCumulativeReturns()), 10)
        self.assertEqual(len(stratAnalyzer.getReturns()), 10)
Esempio n. 22
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'
                )
Esempio n. 23
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)
Esempio n. 24
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')
Esempio n. 25
0
    def run_strategy(smaPeriod):
        # Load the bar feed from the CSV file
        feed = quandlfeed.Feed()
        feed.addBarsFromCSV(
            "orcl",
            "D:/Develop/project/python/PycharmProjects/python3/pyalgotrade/samples/data/WIKI-ORCL-2011-quandl.csv"
        )

        # Evaluate the strategy with the feed's bars
        myStratege = MyStrategy(feed, "orcl", smaPeriod)

        # Attach a returns analyzer to to strategy
        returnsAnalyzer = returns.Returns()
        myStratege.attachAnalyzer(returnsAnalyzer)

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

        myStratege.run()
        myStratege.info("Final portfolio value: $%.2f" %
                        myStratege.getBroker().getEquity())

        # Plot the strategy
        plt.plot()
Esempio n. 26
0
def turtle_test(loadtype='pgs', dataString='pyalg'):
    """
    :param dataString:
    :return:
    """
    # 从postgres 中加载
    if loadtype == 'pgs':
        from api.stock.histmd import to_postgres_md as tpd
        dat = tpd.get_h_data('600848')
    else:
        from api.stock.histmd.to_mongodb_md import k_data_dao as tmd
        w = tmd.KdataDbCache()
        dat = w.get_k_data(index=False,start='2015-02-05', end='2015-02-19',code='300426')
    feed = dataFramefeed.Feed()
    feed.addBarsFromDataFrame("orcl", dat)
    myStrategy = pdr.turtle(feed, "orcl", 20, 10)
    # Attach a returns analyzers to the strategy.
    returnsAnalyzer = returns.Returns()
    myStrategy.attachAnalyzer(returnsAnalyzer)

    # Attach the plotter to the strategy.
    plt = plotter.StrategyPlotter(myStrategy)
    # Plot the simple returns on each bar.
    plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())

    if dataString == 'pyalg_util':
        ds = pyalg_utils.dataSet(myStrategy)  # 抽取交易数据集语句,若使用系统自带画图功能则不需要该项
    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])  # 简单作图示例

    plt.plot()
Esempio n. 27
0
    def testOneBarReturn(self):
        initialCash = 1000
        barFeed = yahoofeed.Feed()
        barFeed.setBarFilter(
            csvfeed.DateRangeFilter(
                strategy_test.datetime_from_date(2001, 12, 07),
                strategy_test.datetime_from_date(2001, 12, 07)))
        barFeed.addBarsFromCSV(
            ReturnsTestCase.TestInstrument,
            common.get_data_file_path("orcl-2001-yahoofinance.csv"))
        strat = strategy_test.TestStrategy(barFeed, initialCash)

        # 2001-12-07,15.74,15.95,15.55,15.91,42463200,15.56
        # Manually place the orders to get them filled on the first (and only) bar.
        order = strat.getBroker().createMarketOrder(
            broker.Order.Action.BUY, ReturnsTestCase.TestInstrument, 1,
            False)  # Open: 15.74
        strat.getBroker().placeOrder(order)
        order = strat.getBroker().createMarketOrder(
            broker.Order.Action.SELL, ReturnsTestCase.TestInstrument, 1,
            True)  # Close: 15.91
        strat.getBroker().placeOrder(order)

        stratAnalyzer = returns.Returns()
        strat.attachAnalyzer(stratAnalyzer)
        strat.run()
        self.assertTrue(strat.getBroker().getCash() == initialCash +
                        (15.91 - 15.74))

        finalValue = 1000 - 15.74 + 15.91
        rets = (finalValue - initialCash) / float(initialCash)
        self.assertEqual(stratAnalyzer.getReturns()[-1], rets)
Esempio n. 28
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()))
Esempio n. 29
0
def main(plot):
    initialCash = 10000
    instrumentsByClass = {
        "US Stocks": ["VTI"],
        "Foreign Stocks": ["VEU"],
        "US 10 Year Government Bonds": ["IEF"],
        "Real Estate": ["VNQ"],
        "Commodities": ["DBC"],
    }

    # Download the bars.
    instruments = ["SPY"]
    for assetClass in instrumentsByClass:
        instruments.extend(instrumentsByClass[assetClass])
    feed = yahoofinance.build_feed(instruments, 2007, 2013, "data", skipErrors=True)

    strat = MarketTiming(feed, instrumentsByClass, initialCash)
    sharpeRatioAnalyzer = sharpe.SharpeRatio()
    strat.attachAnalyzer(sharpeRatioAnalyzer)
    returnsAnalyzer = returns.Returns()
    strat.attachAnalyzer(returnsAnalyzer)

    if plot:
        plt = plotter.StrategyPlotter(strat, False, False, True)
        plt.getOrCreateSubplot("cash").addCallback("Cash", lambda x: strat.getBroker().getCash())
        # Plot strategy vs. SPY cumulative returns.
        plt.getOrCreateSubplot("returns").addDataSeries("SPY", cumret.CumulativeReturn(feed["SPY"].getPriceDataSeries()))
        plt.getOrCreateSubplot("returns").addDataSeries("Strategy", returnsAnalyzer.getCumulativeReturns())

    strat.run()
    print "Sharpe ratio: %.2f" % sharpeRatioAnalyzer.getSharpeRatio(0.05)
    print "Returns: %.2f %%" % (returnsAnalyzer.getCumulativeReturns()[-1] * 100)

    if plot:
        plt.plot()
Esempio n. 30
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())