コード例 #1
0
    def testCliDonchianAlgorithm2014(self):
        api = PytradeApi(dbfilepah=self.db)
        api.reinitializeUser(username=self.username, cash=self.initialCash)
        tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05)

        feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen)
        days = feed.getAllDays()
        for i in range(len(days)):
            day = days[i]
            cli = PytradeCli(dbfilepah=self.db, date=day, maxlen=self.maxLen, codes=self.codes, tradingAlgorithmGenerator=tradingAlgorithmGenerator)
            orders = cli.executeAnalysis()

            if i == (len(days) - 1):
                continue

            nextDay = days[i+1]
            for order in orders:
                open = cli.getLastValuesForInstrument(order.getInstrument(), nextDay)[1]

                if not cli.confirmOrder(orderId=order.getId(), quantity=order.getQuantity(), price=open, commission=10,
                                        date=nextDay):
                    cli.cancelOrder(order.getId())
            cli.save()

        maxlen=(datetime.datetime.now() - datetime.datetime(2014, 12, 1)).days
        cli = PytradeCli(dbfilepah=self.db, maxlen=maxlen)
        self.assertEqual(cli.getAccountInfo()[1], 36922.16)
コード例 #2
0
    def testCliDonchianAlgorithmWithSpecificDates(self):
        api = PytradeApi(dbfilepah=self.db)
        api.reinitializeUser(username=self.username, cash=self.initialCash)
        tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05)

        utc = pytz.utc
        specificdays = [
            utc.localize(datetime.datetime(2014, 2, 7)),
            utc.localize(datetime.datetime(2014, 2, 11)),
            utc.localize(datetime.datetime(2014, 9, 18)),
            utc.localize(datetime.datetime(2014, 10, 23)),
            utc.localize(datetime.datetime(2014, 10, 28)),
            utc.localize(datetime.datetime(2014, 12, 29))]
        feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen)
        alldays = feed.getAllDays()
        for day in specificdays:
            cli = PytradeCli(dbfilepah=self.db, date=day, maxlen=self.maxLen, codes=self.codes,
                             tradingAlgorithmGenerator=tradingAlgorithmGenerator)
            orders = cli.executeAnalysis()

            nextDay = alldays[alldays.index(day) + 1]
            for order in orders:
                open = cli.getLastValuesForInstrument(order.getInstrument(), nextDay)[1]

                if not cli.confirmOrder(orderId=order.getId(), quantity=order.getQuantity(), price=open, commission=10,
                                        date=nextDay):
                    cli.cancelOrder(order.getId())
            cli.save()

        maxlen = (datetime.datetime.now() - datetime.datetime(2014, 12, 1)).days
        cli = PytradeCli(dbfilepah=self.db, maxlen=maxlen)
        self.assertEqual(cli.getAccountInfo()[1], 36922.16)
コード例 #3
0
    def testLiveBrokerDonchianAlgorithmWithSpecificDatesAndSQLiteDataProvider(self):
        username = "******"
        utc = pytz.utc
        days = [
            utc.localize(datetime.datetime(2014, 2, 7)),
            utc.localize(datetime.datetime(2014, 2, 11)),
            utc.localize(datetime.datetime(2014, 9, 18)),
            utc.localize(datetime.datetime(2014, 10, 23)),
            utc.localize(datetime.datetime(2014, 10, 28)),
            utc.localize(datetime.datetime(2014, 12, 31))]

        dataProvider = SQLiteDataProvider(self.db)
        dataProvider.createSchema()
        dataProvider.initializeUser(username, self.initialCash)

        for day in days:
            fromDate = day - timedelta(days=self.maxLen)
            toDate = day + timedelta(days=5)
            feed = DynamicFeed(self.db, self.codes, fromDateTime=fromDate, toDateTime=toDate, maxLen=self.maxLen)
            feed.positionFeed(day)

            broker = PytradeBroker(feed, cash=dataProvider.loadCash(username), orders=dataProvider.loadOrders(username), shares=dataProvider.loadShares(username))
            self.runDonchianAlgorithm(broker, feed, self.donchianEntry, self.donchianExit, self.riskFactor)

            dataProvider.persistCash(username, broker.getAvailableCash())
            dataProvider.persistShares(username, broker.getAllShares())
            dataProvider.persistOrders(username, broker.getAllActiveOrders())

        self.assertEqual(broker.getEquity(), 36922.16)
コード例 #4
0
ファイル: TestApi.py プロジェクト: bopopescu/stock_analysis
    def testApiDonchianAlgorithm2014WithSQLiteDataProvider(self):
        feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen)
        days = feed.getAllDays()

        api = PytradeApi(dbfilepah=self.db)
        api.reinitializeUser(username=self.username, cash=self.initialCash)
        tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, self.donchianEntry, self.donchianExit, self.riskFactor)

        for i in range(len(days)):
            day = days[i]
            api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day, maxlen=self.maxLen, debugmode=False)
            api.executeAnalysis()
            api.persistData()

            if i == (len(days) - 1):
                continue

            day = days[i + 1]
            api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day, maxlen=self.maxLen, debugmode=False)

            for order in api.getActiveMarketOrders() + api.getStopOrdersToConfirm():
                bar = api.getCurrentBarForInstrument(order.getInstrument())
                if bar is None:
                    continue

                if not api.confirmOrder(order, bar.getDateTime(), order.getQuantity(), bar.getOpen(), 10):
                    api.cancelOrder(order)

            api.persistData()

        self.assertEqual(api.getEquity(), 36922.16)
コード例 #5
0
    def initializeFeed(self):
        assert self.__dbFilePath is not None
        assert self.__currentDate is not None
        assert self.__maxLen is not None

        fromDate = self.__currentDate - timedelta(days=self.__maxLen)
        toDate = self.__currentDate + timedelta(days=5)
        self.__feed = DynamicFeed(self.__dbFilePath,
                                  self.__codes,
                                  fromDateTime=fromDate,
                                  toDateTime=toDate,
                                  maxLen=self.__maxLen)
        self.__feed.positionFeed(dt.as_utc(self.__currentDate))
コード例 #6
0
 def setUpClass(cls):
     rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \
                             row["Volume"] == "-"
     instruments = ["PETR4", "PETR3"]
     googleFeed = googlefinance.build_feed(instruments, 2015, 2015, storage="./googlefinance", skipErrors=True,
                                           rowFilter=rowFilter)
     cls.dynamicFeed = DynamicFeed("./sqlitedb", instruments, maxLen=10)
     cls.dynamicFeed.getDatabase().addBarsFromFeed(googleFeed)
コード例 #7
0
    def testLiveBrokerDonchianAlgorithm2014WithMemoryDataProvider(self):
        feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen)
        days = feed.getAllDays()

        dataProvider = MemoryDataProvider()
        dataProvider.persistCash(cash=self.initialCash)
        for day in days:
            fromDate = day - timedelta(days=self.maxLen)
            toDate = day + timedelta(days=5)
            feed = DynamicFeed(self.db,
                               self.codes,
                               fromDateTime=fromDate,
                               toDateTime=toDate,
                               maxLen=self.maxLen)
            feed.positionFeed(day)

            broker = PytradeBroker(feed,
                                   cash=dataProvider.loadCash(),
                                   orders=dataProvider.loadOrders(),
                                   shares=dataProvider.loadShares())
            self.runDonchianAlgorithm(broker, feed, self.donchianEntry,
                                      self.donchianExit, self.riskFactor)

            dataProvider.persistCash(cash=broker.getAvailableCash())
            dataProvider.persistShares(shares=broker.getAllShares())
            dataProvider.persistOrders(orders=broker.getAllActiveOrders())

        self.assertEqual(broker.getEquity(), 36922.16)
コード例 #8
0
    def testLiveBrokerDonchianAlgorithm2014WithoutDataProvider(self):
        feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen)
        days = feed.getAllDays()

        cash = self.initialCash
        shares = {}
        orders = {}
        for day in days:
            fromDate = day - timedelta(days=self.maxLen)
            toDate = day + timedelta(days=5)
            feed = DynamicFeed(self.db,
                               self.codes,
                               fromDateTime=fromDate,
                               toDateTime=toDate,
                               maxLen=self.maxLen)
            feed.positionFeed(day)

            broker = PytradeBroker(feed,
                                   cash=cash,
                                   orders=orders,
                                   shares=shares)
            self.runDonchianAlgorithm(broker, feed, self.donchianEntry,
                                      self.donchianExit, self.riskFactor)

            cash = broker.getAvailableCash()
            shares = broker.getAllShares()
            orders = broker.getAllActiveOrders()

        self.assertEqual(broker.getEquity(), 36922.16)
コード例 #9
0
ファイル: TestApi.py プロジェクト: bopopescu/stock_analysis
    def testApiDonchianAlgorithmWithSpecificDatesAndSQLiteDataProvider(self):
        utc = pytz.utc
        specificdays = [
            utc.localize(datetime.datetime(2014, 2, 7)),
            utc.localize(datetime.datetime(2014, 2, 11)),
            utc.localize(datetime.datetime(2014, 9, 18)),
            utc.localize(datetime.datetime(2014, 10, 23)),
            utc.localize(datetime.datetime(2014, 10, 28)),
            utc.localize(datetime.datetime(2014, 12, 29))]

        feed = DynamicFeed(self.db, self.codes, maxLen=self.maxLen)
        alldays = feed.getAllDays()

        api = PytradeApi(dbfilepah=self.db)
        api.reinitializeUser(username=self.username, cash=self.initialCash)
        tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, self.donchianEntry,
                                                                                  self.donchianExit, self.riskFactor)
        for day in specificdays:
            api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day,
                             maxlen=self.maxLen, debugmode=False)
            api.executeAnalysis()
            api.persistData()

            index = alldays.index(day)
            day = alldays[index+1]
            api = PytradeApi(dbfilepah=self.db, username=self.username, tradingAlgorithmGenerator=tradingAlgorithmGenerator, codes=None, date=day,
                             maxlen=self.maxLen, debugmode=False)

            for order in api.getActiveMarketOrders() + api.getStopOrdersToConfirm():
                bar = api.getCurrentBarForInstrument(order.getInstrument())
                if bar is None:
                    continue

                if not api.confirmOrder(order, bar.getDateTime(), order.getQuantity(), bar.getOpen(), 10):
                    api.cancelOrder(order)

            api.persistData()

        self.assertEqual(api.getEquity(), 36922.16)
コード例 #10
0
    def setUpClass(cls):
        feed = DynamicFeed(cls.db, cls.codes)
        days = feed.getAllDays()
        if len(days) == 247:
            return

        rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \
                                row["Volume"] == "-"
        googleFeed = googlefinance.build_feed(cls.codes, 2014, 2014, storage=cls.csvStorage, skipErrors=True,
                                              rowFilter=rowFilter)
        feed = DynamicFeed(cls.db, cls.codes, maxLen=10)
        feed.getDatabase().addBarsFromFeed(googleFeed)
コード例 #11
0
class PytradeApi(object):
    LOGGER_NAME = "pytradeapi"

    def __init__(self,
                 dbfilepah="/var/pytrade/sqlitedb",
                 googleFinanceDir="/var/pytrade/googlefinance",
                 username=None,
                 tradingAlgorithmGenerator=None,
                 codes=None,
                 date=dt.as_utc(datetime.now()),
                 maxlen=90,
                 debugmode=False):
        if codes is None:
            self.__codes = [
                "ABEV3", "BBAS3", "BBDC3", "BBDC4", "BBSE3", "BRAP4", "BRFS3",
                "BRKM5", "BRML3", "BVMF3", "CCRO3", "CIEL3", "CMIG4", "CPFE3",
                "CPLE6", "CSAN3", "CSNA3", "CTIP3", "CYRE3", "ECOR3", "EGIE3",
                "EMBR3", "ENBR3", "EQTL3", "ESTC3", "FIBR3", "GGBR4", "GOAU4",
                "HYPE3", "ITSA4", "ITUB4", "JBSS3", "KLBN11", "KROT3", "LAME4",
                "LREN3", "MRFG3", "MRVE3", "MULT3", "NATU3", "PCAR4", "PETR3",
                "PETR4", "QUAL3", "RADL3", "RENT3", "RUMO3", "SANB11", "SBSP3",
                "SMLE3", "SUZB5", "TIMP3", "UGPA3", "USIM5", "VALE3", "VALE5",
                "VIVT4", "WEGE3"
            ]
        else:
            self.__codes = codes

        self.__logger = logger.getLogger(PytradeApi.LOGGER_NAME)
        self.__dbFilePath = dbfilepah
        self.__googleFinanceDir = googleFinanceDir
        self.__debugMode = debugmode
        self.__tradingAlgorithmGenerator = tradingAlgorithmGenerator
        self.__currentDate = date
        self.__maxLen = maxlen

        self.initializeDataProvider()
        self.initializeFeed()

        self.__username = username
        if username is not None:
            self.initializeBroker(username)
            self.initializeStrategy(
            )  # tradingAlgorithmGenerator must not be None

    def initializeDataProvider(self):
        self.__dataProvider = SQLiteDataProvider(self.__dbFilePath)
        if not self.__dataProvider.schemaExists():
            self.__dataProvider.createSchema()

    def initializeFeed(self):
        assert self.__dbFilePath is not None
        assert self.__currentDate is not None
        assert self.__maxLen is not None

        fromDate = self.__currentDate - timedelta(days=self.__maxLen)
        toDate = self.__currentDate + timedelta(days=5)
        self.__feed = DynamicFeed(self.__dbFilePath,
                                  self.__codes,
                                  fromDateTime=fromDate,
                                  toDateTime=toDate,
                                  maxLen=self.__maxLen)
        self.__feed.positionFeed(dt.as_utc(self.__currentDate))

    def initializeBroker(self, username):
        assert self.__feed is not None
        assert self.__dataProvider is not None
        assert username is not None

        self.__broker = PytradeBroker(
            feed=self.__feed,
            cash=self.__dataProvider.loadCash(username),
            orders=self.__dataProvider.loadOrders(username),
            shares=self.__dataProvider.loadShares(username))

    def initializeStrategy(self):
        assert self.__feed is not None
        assert self.__broker is not None
        assert self.__debugMode is not None
        assert self.__tradingAlgorithmGenerator is not None

        self.__tradingStrategy = TradingSystem(self.__feed,
                                               self.__broker,
                                               debugMode=self.__debugMode)
        self.__tradingStrategy.setAlgorithm(
            self.__tradingAlgorithmGenerator(self.__feed, self.__broker))

    def userExists(self, username):
        return self.__dataProvider.userExists(username)

    def initializeUser(self, cash, username):
        return self.__dataProvider.initializeUser(username, cash)

    def reinitializeUser(self, cash, username):
        return self.__dataProvider.reinitializeUser(username, cash)

    def getCash(self):
        return self.__broker.getAvailableCash()

    def getActiveMarketOrders(self):
        return self.__broker.getActiveMarketOrders()

    def getStopOrdersToConfirm(self):
        return self.__broker.getStopOrdersToConfirm()

    def getStopOrders(self):
        return self.__broker.getActiveStopOrders()

    def getAllActiveOrders(self):
        return self.__broker.getActiveOrders()

    def getAllShares(self):
        return self.__broker.getAllShares()

    def getShares(self, instrument):
        return self.__broker.getShares(instrument)

    def getEquity(self):
        return self.__broker.getEquity()

    def persistData(self):
        self.__dataProvider.persistCash(username=self.__username,
                                        cash=self.__broker.getAvailableCash())
        self.__dataProvider.persistShares(username=self.__username,
                                          shares=self.__broker.getAllShares())
        self.__dataProvider.persistOrders(
            username=self.__username,
            orders=self.__broker.getAllActiveOrders())

    def confirmOrder(self, order, datetime, quantity, price, commission):
        self.__broker.acceptOrder(datetime, order)
        cost, sharesDelta, resultingCash = self.__broker.calculateCostSharesDeltaAndResultingCash(
            order, price, quantity, commission)

        if resultingCash >= 0:
            self.__broker.handleOrderExecution(order, datetime, price,
                                               quantity, commission,
                                               resultingCash, sharesDelta)
            return True
        else:
            self.__logger.debug(
                "Not enough cash to fill %s order [%s] for %s share/s" %
                (order.getInstrument(), order.getId(), order.getRemaining()))
            return False

    def cancelOrder(self, order):
        return self.__broker.cancelOrder(order)

    def executeAnalysis(self):
        self.__feed.dispatchWithoutIncrementingDate()

    def generateFeedEvent(self):
        self.__feed.nextEvent()

    def getCurrentBarForInstrument(self, instrument):
        return self.__broker.getCurrentBarForInstrument(instrument)

    def updateStockData(self, fromDate=None, toDate=None):
        if fromDate is None:
            lastDate = self.getLastStockDate()
            fromDate = dt.unlocalize(
                lastDate if lastDate is not None else self.__currentDate -
                timedelta(days=365 * 2))
        if toDate is None:
            toDate = dt.unlocalize(self.__currentDate)

        rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \
                                row["Volume"] == "-" or googlefeed.parse_date(row["Date"]) < fromDate or googlefeed.parse_date(row["Date"]) > toDate

        [
            os.remove(self.__googleFinanceDir + '/' + f)
            for f in glob.glob1(self.__googleFinanceDir, '*' +
                                str(toDate.year) + '*')
        ]
        googleFeed = googlefinance.build_feed(self.__codes,
                                              fromDate.year,
                                              toDate.year,
                                              storage=self.__googleFinanceDir,
                                              skipErrors=False,
                                              rowFilter=rowFilter)
        self.__feed.getDatabase().addBarsFromFeed(googleFeed)

    def getLastStockDate(self):
        return self.__feed.getDatabase().getLastBarTimestamp()

    def getLastValuesForInstrument(self, instrument, date=datetime.now()):
        return self.__dataProvider.getLastValuesForInstrument(instrument, date)

    def getOrderById(self, orderId):
        return self.__broker.getOrderById(orderId)
コード例 #12
0
backtest.run()
backtest.generatePdfReport('/tmp/stock_analysis.pdf')

############################################################################################################################

# rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \
#                         row["Volume"] == "-"
# instruments = ["PETR4", "PETR3"]
# googleFeed = googlefinance.build_feed(codes, 2014, 2014, storage="./googlefinance", skipErrors=True,
#                                       rowFilter=rowFilter)
db = "./sqliteddb"
# feed = DynamicFeed(db, codes, maxLen=10)
# feed.getDatabase().addBarsFromFeed(googleFeed)
################################################################################################

feed = DynamicFeed(db, codes, maxLen=60)

#$36922.16
days =  feed.getAllDays()
cash = 10000
shares = {}
activeOrders = {}
nextOrderId = 1
for day in days:
    feed = DynamicFeed(db, codes, maxLen=60)
    feed.positionFeed(day)

    broker = PytradeBroker(cash, feed, backtesting.FixedPerTrade(10), shares, activeOrders, nextOrderId)
    strategy = TradingSystem(feed, broker, debugMode=True)
    strategy.setAlgorithm(DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05))
コード例 #13
0
backtest.run()

backtest.generateHtmlReport('/tmp/stock_analysis.html')
############################################################################################################################

# rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or \
#                         row["Volume"] == "-"
# instruments = ["PETR4", "PETR3"]
# googleFeed = googlefinance.build_feed(codes, 2014, 2014, storage="./googlefinance", skipErrors=True,
#                                       rowFilter=rowFilter)
db = "./sqliteddb"
# feed = DynamicFeed    (db, codes, maxLen=10)
# feed.getDatabase().addBarsFromFeed(googleFeed)
################################################################################################
maxLen=int(26*1.4)
feed = DynamicFeed(db, codes, maxLen=maxLen)
days =  feed.getAllDays()

username="******"
api = pytradeapi.PytradeApi(dbfilepah=db)
api.reinitializeUser(username=username, cash=10000)
tradingAlgorithmGenerator = lambda feed, broker: DonchianTradingAlgorithm(feed, broker, 9, 26, 0.05)

# utc = pytz.utc
# days = [
#             utc.localize(datetime.datetime(2014, 2, 7)),
#             utc.localize(datetime.datetime(2014, 2, 11))]


for i in range(len(days)):
    day = days[i]
コード例 #14
0
#     series = dbFeed.getDataSeries(instrument)
#     print("%s %s") % (instrument, series.getCloseDataSeries()[0:len(series)])


import pytz, datetime
from pyalgotrade.tools import googlefinance
from pytrade.feed import DynamicFeed




rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row["High"] == "-" or row["Low"] == "-" or row["Volume"] == "-"
instruments = ["PETR4", "PETR3"]
# googleFeed = googlefinance.build_feed(instruments, 2015, 2015, storage="./googlefinance", skipErrors=True, rowFilter=rowFilter)

dynamicFeed = DynamicFeed("./sqlitedb", instruments, maxLen=10)

dynamicFeed.positionFeed(datetime.datetime(2015, 1, 2, tzinfo=pytz.UTC))

print dynamicFeed.getCurrentDateTime()
for instrument in dynamicFeed.getRegisteredInstruments():
    series = dynamicFeed.getDataSeries(instrument)
    print("%s %s") % (instrument, series.getCloseDataSeries()[0:len(series)])


#2015-01-01
#datetime: None
#PETR4:
    #close value:
    #close series []
#PETR3
コード例 #15
0
# #dbFeed.reset() with this, maybe I don't need to use DB
#
# for instrument in dbFeed.getRegisteredInstruments():
#     series = dbFeed.getDataSeries(instrument)
#     print("%s %s") % (instrument, series.getCloseDataSeries()[0:len(series)])

import pytz, datetime
from pyalgotrade.tools import googlefinance
from pytrade.feed import DynamicFeed

rowFilter = lambda row: row["Close"] == "-" or row["Open"] == "-" or row[
    "High"] == "-" or row["Low"] == "-" or row["Volume"] == "-"
instruments = ["PETR4", "PETR3"]
# googleFeed = googlefinance.build_feed(instruments, 2015, 2015, storage="./googlefinance", skipErrors=True, rowFilter=rowFilter)

dynamicFeed = DynamicFeed("./sqlitedb", instruments, maxLen=10)

dynamicFeed.positionFeed(datetime.datetime(2015, 1, 2, tzinfo=pytz.UTC))

print dynamicFeed.getCurrentDateTime()
for instrument in dynamicFeed.getRegisteredInstruments():
    series = dynamicFeed.getDataSeries(instrument)
    print("%s %s") % (instrument, series.getCloseDataSeries()[0:len(series)])

#2015-01-01
#datetime: None
#PETR4:
#close value:
#close series []
#PETR3
# close value