Ejemplo n.º 1
0
    def test_create_trade_fx_USDCAD(self):
        blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
        blt.connect_market_data()
        blt.define_generic("USDCAD", "CAD", 0, 1, 0, True)
        blt.map_instrument("USDCAD", "USDCAD")
        ts = pd.Timestamp('2015-08-03T12:00:00')
        evs = blt._create_trade(ts, "USDCAD", quantity=1000, price=1.31)

        ev_exp = [
            blotter._Event(
                "TRADE", {
                    "timestamp": ts,
                    "instrument": "USDCAD",
                    "ccy": "CAD",
                    "price": 1.31,
                    "quantity": 1000,
                    "multiplier": 1,
                    "commission": 0
                }),
            blotter._Event("CASH", {
                "timestamp": ts,
                "ccy": "CAD",
                "quantity": -1000 * 1.31
            }),
            blotter._Event("CASH", {
                "timestamp": ts,
                "ccy": "USD",
                "quantity": 1000
            })
        ]
        self.assertEventsEqual(evs, ev_exp)
Ejemplo n.º 2
0
    def setup(self):
        # TODO handle these paths in a better way

        ts = pd.date_range('2008-01-02', '2008-05-30', freq='b')
        ts = ts + pd.Timedelta("16h")
        self.ts_daily = ts
        cdir = os.path.dirname(__file__)
        updir = os.path.split(cdir)[0]
        rate_fp = os.path.join(updir, 'doc/data/daily_interest_rates.csv')
        prices_fp = os.path.join(updir, 'doc/data/prices')
        aud_fp = os.path.join(updir, 'doc/data/prices/AUDUSD.csv')
        aud = pd.read_csv(aud_fp, index_col=0, parse_dates=True)
        jpy_fp = os.path.join(updir, 'doc/data/prices/USDJPY.csv')
        jpy = pd.read_csv(jpy_fp, index_col=0, parse_dates=True)
        self.prices = pd.concat([aud, jpy], axis=1)

        self.blt = blotter.Blotter(prices=prices_fp, interest_rates=rate_fp)
        self.blt.connect_market_data()
        self.blt.define_generic("AUDUSD", ccy="USD", margin=0, multiplier=1,
                                   commission=2.5, isFX=True)
        self.blt.define_generic("USDJPY", ccy="JPY", margin=0, multiplier=1,
                                   commission=2.5, isFX=True)
        self.blt.map_instrument("AUDUSD", "AUDUSD")
        self.blt.map_instrument("USDJPY", "USDJPY")

        idx = pd.date_range("2008-01-02T00:00:00", "2008-01-02T23:59:59",
                            freq="5T")
        self.intraday_prices = pd.DataFrame(0.8, index=idx, columns=["AUDUSD"])
Ejemplo n.º 3
0
    def test_create_read_log(self):
        blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
        # test events can be properly read error free
        blt.read_log(self.log)
        evs = blt._create_log_events(self.log)

        ts1 = pd.Timestamp('2016-12-01T10:00:00')
        ts2 = pd.Timestamp('2016-12-02T10:00:00')
        exp_evs = [
            blotter._Event(
                "TRADE", {
                    "timestamp": ts1,
                    "instrument": "CLZ16",
                    "ccy": "USD",
                    "price": 53.46,
                    "quantity": 100,
                    "multiplier": 1,
                    "commission": 2.50
                }),
            blotter._Event(
                "TRADE", {
                    "timestamp": ts2,
                    "instrument": "CLZ16",
                    "ccy": "USD",
                    "price": 55.32,
                    "ntc_price": 55.32,
                    "quantity": 100,
                    "multiplier": 1,
                    "commission": 2.50
                })
        ]
        self.assertEventsEqual(evs, exp_evs)
Ejemplo n.º 4
0
    def test_create_short_margin_event(self):
        blt = blotter.Blotter(self.prices,
                              self.rates,
                              base_ccy="USD",
                              margin_charge=0.015)
        blt.connect_market_data()
        ts = pd.Timestamp('2015-08-04T00:00:00')
        qty = -1
        price = 0
        blt.define_generic("ES", "USD", 0.05, 1, 2.5)
        blt.map_instrument("ES", "ESZ15")
        blt._trade(ts, "ESZ15", qty, price)

        ts = pd.Timestamp('2015-08-05T00:00:00')
        ev = blt.create_events(ts, "MARGIN")

        rates = pd.read_csv(self.rates, index_col=0, parse_dates=True)
        es_fp = os.path.join(self.prices, 'ESZ15.csv')
        es = pd.read_csv(es_fp, index_col=0, parse_dates=True)

        es_notional = float(es.loc[ts].values * np.abs(qty) * 0.05)
        quantity = es_notional * (rates.loc[ts, "USD"] + 0.015) / 365
        ev_exp = [
            blotter._Event("INTEREST", {
                "timestamp": ts,
                "ccy": "USD",
                "quantity": quantity
            })
        ]
        self.assertEventsEqual(ev, ev_exp)
Ejemplo n.º 5
0
    def test_automatic_events_closed_pnl_mark(self):
        blt = blotter.Blotter(self.prices,
                              self.rates,
                              accrual_time=pd.Timedelta(0, unit='h'),
                              eod_time=pd.Timedelta(0, unit='h'),
                              sweep_time=pd.Timedelta(0, unit='h'))
        blt.connect_market_data()
        blt.define_generic("ES",
                           ccy="USD",
                           margin=0,
                           multiplier=1,
                           commission=0,
                           isFX=False)
        blt.map_instrument("ES", "ESZ15")

        ts = pd.Timestamp("2015-08-04T11:00:00")
        blt.trade(ts, "ESZ15", 1, 2000)

        ts = pd.Timestamp("2015-08-04T12:00:00")
        hlds = blt.get_instruments()
        for instr, qty in hlds.iteritems():
            blt.trade(ts, instr, -qty, 2001)

        ts = pd.Timestamp("2015-08-05T00:00:00")
        blt.automatic_events(ts)
        pnl_history = blt.get_pnl_history()
        usd = pd.DataFrame([[1.0, 1.0, 0.0]],
                           index=[ts],
                           columns=["pnl", "closed pnl", "open pnl"])
        pnl_history_exp = {"USD": usd}
        self.assertDictDataFrameEqual(pnl_history, pnl_history_exp)
Ejemplo n.º 6
0
 def test_create_trade_0_quantity(self):
     blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
     blt.connect_market_data()
     blt.define_generic("ES", "USD", 0, 1, 0, False)
     blt.map_instrument("ES", "ESZ15")
     ts = pd.Timestamp('2015-08-03T12:00:00')
     evs = blt._create_trade(ts, "ESZ15", 0, 1800)
     self.assertEqual(evs, [])
Ejemplo n.º 7
0
 def test_pnl(self):
     blt = blotter.Blotter()
     data = {
         'timestamp': pd.Timestamp('2016-12-01T10:00:00'),
         'prices': pd.Series([53.46, 52], index=['CLZ6', 'COZ6'])
     }
     ev = [blotter._Event('PNL', data)]
     blt.dispatch_events(ev)
Ejemplo n.º 8
0
 def test_cash(self):
     blt = blotter.Blotter()
     data = {
         'timestamp': pd.Timestamp('2016-12-01T10:00:00'),
         'ccy': 'USD',
         'quantity': 1000
     }
     ev = [blotter._Event('CASH', data)]
     blt.dispatch_events(ev)
Ejemplo n.º 9
0
 def test_sweep(self):
     blt = blotter.Blotter()
     data = {
         'timestamp': pd.Timestamp('2016-12-01T10:00:00'),
         'ccy1': 'USD',
         'quantity1': 1000,
         'ccy2': 'CAD',
         'quantity2': -1300
     }
     ev = [blotter._Event('PNL_SWEEP', data)]
     blt.dispatch_events(ev)
Ejemplo n.º 10
0
 def test_create_pnl_sweep_no_event_base(self):
     blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
     blt.connect_market_data()
     ts = pd.Timestamp('2015-08-03T12:00:00')
     blt._holdings.record_trade(ts, 'CLZ15', 50.50, 1, 1, 0, "USD")
     ts = pd.Timestamp('2015-08-03T14:00:00')
     blt._holdings.record_trade(ts, 'CLZ15', 51.50, -1, 1, 0, "USD")
     ts = pd.Timestamp('2015-08-04T00:00:00')
     evs = blt.create_events(ts, "PNL_SWEEP")
     evs_exp = []
     self.assertEqual(evs, evs_exp)
Ejemplo n.º 11
0
 def test_trade(self):
     blt = blotter.Blotter()
     data = {
         'timestamp': pd.Timestamp('2016-12-01T10:00:00'),
         'instrument': 'CLZ6',
         'price': 53.46,
         'quantity': 100,
         'multiplier': 1,
         'commission': 2.50,
         'ccy': 'USD'
     }
     ev = [blotter._Event('TRADE', data)]
     blt.dispatch_events(ev)
Ejemplo n.º 12
0
    def test_get_meta_data(self):
        blt = blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
        # currency of instrument defaults to base ccy of blotter when not given
        blt.define_generic("CL",
                           margin=0.1,
                           multiplier=100,
                           commission=2.5,
                           isFX=False)

        meta = namedtuple(
            'metadata', ['ccy', 'margin', 'multiplier', 'commission', 'isFX'])
        metadata_exp = meta("USD", 0.1, 100, 2.5, False)
        metadata = blt._gnrc_meta["CL"]
        self.assertEqual(metadata, metadata_exp)
Ejemplo n.º 13
0
    def test_read_meta(self):
        blt = blotter.Blotter()
        blt.read_meta(self.meta_log)
        blt.define_generic(
            **{
                'generic': 'CL',
                'ccy': 'CAD',
                'margin': 0.1,
                'multiplier': 100,
                'commission': 2.5,
                'isFX': False
            })
        blt.map_instrument('CL', 'CLU16')
        blt.map_instrument('CL', 'CLZ16')

        blt.define_generic(
            **{
                'generic': 'USDCAD',
                'ccy': 'CAD',
                'margin': 0,
                'multiplier': 1,
                'commission': 2.5,
                'isFX': True
            })
        blt.map_instrument('USDCAD', 'USDCAD')

        gen_meta_exp = {}
        gen_meta_exp["CL"] = blotter._metadata(
            **{
                'ccy': 'CAD',
                'margin': 0.1,
                'multiplier': 100,
                'commission': 2.5,
                'isFX': False
            })
        gen_meta_exp["USDCAD"] = blotter._metadata(
            **{
                'ccy': 'CAD',
                'margin': 0,
                'multiplier': 1,
                'commission': 2.5,
                'isFX': True
            })

        map_instr_exp = {"USDCAD": "USDCAD", "CLU16": "CL", "CLZ16": "CL"}
        self.assertEqual(blt._gnrc_meta, gen_meta_exp)
        self.assertEqual(blt._instr_map, map_instr_exp)
Ejemplo n.º 14
0
    def test_write_log(self):
        blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
        blt.define_generic("CL", "USD", 0.1, 1, 2.50)
        blt.map_instrument("CL", "CLZ16")
        ts1 = pd.Timestamp('2016-12-01T10:00:00')
        ts2 = pd.Timestamp('2016-12-02T10:00:00')
        blt._trade(ts1, "CLZ16", quantity=100, price=53.46)
        blt._trade(ts2, "CLZ16", quantity=100, price=55.32, ntc_price=55.32)
        tmp_file = tempfile.mktemp()
        blt.write_log(tmp_file)

        with open(tmp_file, 'r') as fp:
            output_str = fp.read()

        with open(self.log, 'r') as fp:
            expected_output_str = fp.read()

        self.assertMultiLineEqual(expected_output_str, output_str)
Ejemplo n.º 15
0
 def test_create_pnl_sweep_no_event_open_pnl_only(self):
     blt = blotter.Blotter(self.prices,
                           self.rates,
                           base_ccy="USD",
                           sweep_time=None,
                           accrual_time=pd.Timedelta("0h"),
                           eod_time=pd.Timedelta("0h"))
     blt.connect_market_data()
     ts = pd.Timestamp('2015-08-03T12:00:00')
     pos = 1
     blt.define_generic("SXM", "CAD", 0, 1, 0)
     blt.map_instrument("SXM", "SXMZ15")
     blt.trade(ts, 'SXMZ15', pos, price=800, ntc_price=800)
     ts = pd.Timestamp('2015-08-04T00:00:00')
     blt.automatic_events(ts)
     evs = blt.create_events(ts, "PNL_SWEEP")
     evs_exp = []
     self.assertEventsEqual(evs, evs_exp)
Ejemplo n.º 16
0
    def test_empty_automatic_events(self):
        blt = blotter.Blotter(self.prices,
                              self.rates,
                              accrual_time=None,
                              eod_time=None,
                              sweep_time=None)
        blt.connect_market_data()
        blt.define_generic("ES",
                           ccy="USD",
                           margin=0,
                           multiplier=1,
                           commission=0,
                           isFX=False)
        blt.map_instrument("ES", "ESZ15")

        ts = pd.Timestamp("2015-08-04T11:00:00")
        blt.trade(ts, "ESZ15", 1, 2000)

        ts = pd.Timestamp("2015-08-05T00:00:00")
        blt.automatic_events(ts)
Ejemplo n.º 17
0
    def test_automatic_events_future_type_creation(self):
        blt = blotter.Blotter(self.prices,
                              self.rates,
                              accrual_time=pd.Timedelta(0, unit='h'),
                              eod_time=pd.Timedelta(0, unit='h'),
                              sweep_time=pd.Timedelta(0, unit='h'))
        blt.connect_market_data()
        blt.define_generic("ES", "USD", 0.1, 100, 2.50)
        blt.map_instrument("ES", "ESZ15")
        ts = pd.Timestamp('2015-08-04T10:00:00')
        number_instr = 1
        blt._trade(ts, "ESZ15", number_instr, 2000)
        blt.automatic_events(pd.Timestamp('2015-08-05T10:00:00'))

        ev_types = []
        for ev in blt.event_log:
            ev_types.append(ev.split("|")[0])

        ev_types_exp = ["TRADE", "INTEREST", "PNL"]
        self.assertEqual(ev_types, ev_types_exp)
Ejemplo n.º 18
0
    def test_create_pnl_sweep_event_closed_pnl(self):
        blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
        blt.connect_market_data()
        ts = pd.Timestamp('2015-08-03T12:00:00')
        blt._holdings.record_trade(ts, 'CLZ15', 50.50, 1, 1, 0, "CAD")
        ts = pd.Timestamp('2015-08-03T14:00:00')
        blt._holdings.record_trade(ts, 'CLZ15', 51.50, -1, 1, 0, "CAD")
        ts = pd.Timestamp('2015-08-04T00:00:00')
        evs = blt.create_events(ts, "PNL_SWEEP")
        evs_exp = [
            blotter._Event(
                "PNL_SWEEP", {
                    "timestamp": ts,
                    "ccy1": "CAD",
                    "quantity1": -1.00,
                    "ccy2": "USD",
                    "quantity2": 1 / 1.3125
                })
        ]

        self.assertEventsEqual(evs, evs_exp)
Ejemplo n.º 19
0
    def test_create_trade_future(self):
        blt = blotter.Blotter(self.prices, self.rates, base_ccy="USD")
        blt.connect_market_data()
        blt.define_generic("ES", "USD", 0, 1, 0, False)
        blt.map_instrument("ES", "ESZ15")
        ts = pd.Timestamp('2015-08-03T12:00:00')
        evs = blt._create_trade(ts, "ESZ15", quantity=1, price=1800)

        ev_exp = [
            blotter._Event(
                "TRADE", {
                    "timestamp": ts,
                    "instrument": "ESZ15",
                    "ccy": "USD",
                    "price": 1800,
                    "quantity": 1,
                    "multiplier": 1,
                    "commission": 0
                })
        ]

        self.assertEventsEqual(evs, ev_exp)
Ejemplo n.º 20
0
    def test_write_meta(self):
        blt = blotter.Blotter()

        blt.define_generic(
            **{
                'generic': 'CL',
                'ccy': 'CAD',
                'margin': 0.1,
                'multiplier': 100,
                'commission': 2.5,
                'isFX': False
            })
        blt.map_instrument('CL', 'CLU16')
        blt.map_instrument('CL', 'CLZ16')

        blt.define_generic(
            **{
                'generic': 'USDCAD',
                'ccy': 'CAD',
                'margin': 0,
                'multiplier': 1,
                'commission': 2.5,
                'isFX': True
            })
        blt.map_instrument('USDCAD', 'USDCAD')

        tmp_file = tempfile.mktemp()
        blt.write_meta(tmp_file)

        with open(tmp_file, 'r') as fp:
            output_str = fp.read()

        with open(self.meta_log, 'r') as fp:
            expected_output_str = fp.read()

        self.assertMultiLineEqual(expected_output_str, output_str)
Ejemplo n.º 21
0
 def make_blotter(self):
     blt = blotter.Blotter(self.prices, self.rates)
     return blt