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)
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"])
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)
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)
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)
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, [])
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
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)
def make_blotter(self): blt = blotter.Blotter(self.prices, self.rates) return blt