In [11]:
from datetime import datetime

# Movimiento de trading
class MovimientoTrading:
    num_acciones = ''
    emisora = ''
    fecha = ''

# Estrategia
# Comprar ALSEA, vender todas en dos años
# Comprar KOF mantener
# Comprar 500 GFNORTE vender sólo 50 en un año
movimientos = []

movimiento = MovimientoTrading()
movimiento.num_acciones = 500
movimiento.emisora = 'ALSEA.MX'
movimiento.fecha = datetime(2010, 3, 1)
movimientos.append(movimiento)

movimiento = MovimientoTrading()
movimiento.num_acciones = -500
movimiento.emisora = 'ALSEA.MX'
movimiento.fecha = datetime(2013, 3, 1)
movimientos.append(movimiento)

movimiento = MovimientoTrading()
movimiento.num_acciones = 500
movimiento.emisora = 'KOFL.MX'
movimiento.fecha = datetime(2011, 2, 5)
movimientos.append(movimiento)

movimiento = MovimientoTrading()
movimiento.num_acciones = 500
movimiento.emisora = 'GFNORTEO.MX'
movimiento.fecha = datetime(2011, 8, 8)
movimientos.append(movimiento)

movimiento = MovimientoTrading()
movimiento.num_acciones = -50
movimiento.emisora = 'GFNORTEO.MX'
movimiento.fecha = datetime(2012, 8, 8)
movimientos.append(movimiento)

for movimiento in movimientos:
    print movimiento.emisora
    print '--------'
    print movimiento.num_acciones
    print movimiento.fecha
    print '\n'


ALSEA.MX
--------
500
2010-03-01 00:00:00


ALSEA.MX
--------
-500
2013-03-01 00:00:00


KOFL.MX
--------
500
2011-02-05 00:00:00


GFNORTEO.MX
--------
500
2011-08-08 00:00:00


GFNORTEO.MX
--------
-50
2012-08-08 00:00:00



In [18]:
%matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl
import zipline as zp

class CompraVenta(zp.TradingAlgorithm):   
    def initialize(self, movimientos):
        self.movimientos = movimientos
        fechas = []
        emisoras = set()
        for movimiento in movimientos:
            fechas.append(movimiento.fecha)
            emisoras.add(movimiento.emisora)
        emisoras = list(emisoras)
        fecha_inicio = min(fechas)
        fecha_fin = max(fechas)
        self.data = zp.utils.factory.load_from_yahoo(stocks=emisoras, indexes={}, start=fecha_inicio, end=fecha_fin, adjusted=False)    

    def handle_data(self, data):
        for movimiento in movimientos:
            clave_emisora = movimiento.emisora
            fecha_movimiento = movimiento.fecha
            fecha = data[clave_emisora].dt
            delta = fecha_movimiento - fecha.replace(tzinfo=None)
            num_acciones = movimiento.num_acciones
            if(delta.days == 0):
                self.order(clave_emisora, num_acciones)

trading = CompraVenta(movimientos)
data = trading.data
perf = trading.run(data)

print perf['capital_used'].head()
print perf['starting_cash'].head()
print perf['ending_cash'].head()
print perf['returns'].head()


[2014-09-12 03:27] INFO: Performance: Simulated 757 trading days out of 757.
[2014-09-12 03:27] INFO: Performance: first open: 2010-03-01 14:31:00+00:00
[2014-09-12 03:27] INFO: Performance: last close: 2013-03-01 21:00:00+00:00
ALSEA.MX
KOFL.MX
GFNORTEO.MX
['capital_used', 'ending_cash', 'ending_value', 'orders', 'period_close', 'period_open', 'pnl', 'portfolio_value', 'positions', 'returns', 'starting_cash', 'starting_value', 'transactions']
2010-03-01 21:00:00       0.000000
2010-03-02 21:00:00   -2897.953125
2010-03-03 21:00:00   -2996.062500
2010-03-04 21:00:00       0.000000
2010-03-05 21:00:00       0.000000
Name: capital_used, dtype: float64
2010-03-01 21:00:00    100000.000000
2010-03-02 21:00:00    100000.000000
2010-03-03 21:00:00     97102.046875
2010-03-04 21:00:00     94105.984375
2010-03-05 21:00:00     94105.984375
Name: starting_cash, dtype: float64
2010-03-01 21:00:00    100000.000000
2010-03-02 21:00:00     97102.046875
2010-03-03 21:00:00     94105.984375
2010-03-04 21:00:00     94105.984375
2010-03-05 21:00:00     94105.984375
Name: ending_cash, dtype: float64
2010-03-01 21:00:00    0.000000
2010-03-02 21:00:00   -0.000255
2010-03-03 21:00:00    0.000715
2010-03-04 21:00:00    0.000200
2010-03-05 21:00:00    0.001099
Name: returns, dtype: float64

In [ ]: