Backtrader 量化回测实践(4)—— 投资组合股票回测同一策略
需要将一组股票作为一个投资组合,验证一个策略。观察操作是否具有一致性。比如在某一段时间,组合中的买卖操作,有一定的相似度。
对所有股票依次做单独的策略回测,不好对比,不好直观验证策略的优劣。
基于backtrader,编写多股票同时回测程序。
以MACD简单策略演示。
需要关注理解策略中的四个关键点 :
- init 初始化参数
- next 交易实施
- notice 过程监控
- datafeed 数据加载
1. init
def __init__(self):
# 创建MACD指标
# 组合股票信号使用dict存储
self.macds = dict()
# 枚举数据的序号和数据,d就是一个股票的数据lines
for i, d in enumerate(self.datas):
# 每一个数据指标一个dict
self.macds[d] = dict()
self.macds[d]['macd'] = bt.indicators.MACD(d.close,period_me1=self.p.short_period,
period_me2=self.p.long_period,period_signal=self.p.signal_period)
self.macds[d]['signal'] = self.macds[d]['macd'].lines.signal
# 初始化订单
self.order = None
说明:
(1)用dict保存多个股票指标信息
# 组合股票信号使用dict存储
self.macds = dict()
(2)每个股票是一个dict,保存对应的股票macd信息
# 每一个数据指标一个dict
self.macds[d] = dict()
2. next
next方法中,循环遍历所有待测的股票,对每只股票,获取时间及股票名称,打印输出、日志留存或者调试。
先判断当前股票position的size,判断是否已经买入该股票,如果没有买入,判断macd指标成立,即可买入。如果已经持有了该股票,判断macd指标失败,平仓卖出。
def next(self):
# 检查是否有未完成的订单
if self.order:
return
# 枚举数据的序号和数据,d就是一个股票的数据lines
for i, d in enumerate(self.datas):
# 获取时间及股票代码
dt, dn = self.datetime.date(), d._name
# 获取对应代码的仓位
pos = self.getposition(d).size
# 无仓位,则可以买入
if not pos:
# MACD买入信号 ,可以多次买入
if self.macds[d]['macd'] > self.macds[d]['signal']:
# data = d指定buy的代码
self.buy(data = d, size = self.p.pstake)
# 平仓 ,一次卖出
elif self.macds[d]['macd'] < self.macds[d]['signal']:
# data = d指定sell的代码
self.close(data = d)
说明:
(1)还是使用枚举的方式,循环组合股票列表,按股票获取仓位:
pos = self.getposition(d).size
(2)触发指标判断,通过dict的股票指标逐一判断
if self.macds[d]['macd'] > self.macds[d]['signal']:
(3)买卖要指定股票
self.buy(data = d, size = self.p.pstake)
3. notice
以notify_trade 为例,notify_order的概念一样。
def notify_trade(self, trade):
if not trade.isclosed:
return
#可以按trade.data取触发notify_trade的日期
dt = trade.data.datetime.date()
# trade是一次处理一个数据,不存在trader.datas!!!
if trade.isclosed:
self.log('%s :Closed, PnL Gross %.2f, Net %.2f,Net worth: %.2f' %
(trade.data._name, round(trade.pnl, 2), round(trade.pnlcomm, 2),self.broker.getvalue()))
说明:
(1)trade和order 都没有trade.datas或order.datas !!! 每一个触发都是独立的一个notice对象。
(2)区分不同股票的方法,trade.data._name或order.data._name 。
4.datafeed
# 添加策略
codes=['000858.SZ','000859.SZ','000860.SZ','000861.SZ','000862.SZ','000863.SZ','000868.SZ']
for code in codes:
stock_df = get_code(code)
data = btfeeds.PandasData(dataname=stock_df, fromdate=start_date, todate=end_date) # 加载数据
cerebro.adddata(data,name=code)
print(code)
说明:
(1)逐一加载数据,需要注明代码名称
cerebro.adddata(data,name=code)
5.代码示例
%matplotlib inline
# 创建MACD策略
class MACDStrategy(bt.Strategy):
params = (
("short_period", 12),
("long_period", 26),
("signal_period", 9),
("bprint", True),
("pstake", 10),
("pfast", 5),
("pslow", 20),
)
def __init__(self):
# 创建MACD指标
# 组合股票信号使用dict存储
self.macds = dict()
# 枚举数据的序号和数据,d就是一个股票的数据lines
for i, d in enumerate(self.datas):
# 每一个数据指标一个dict
self.macds[d] = dict()
self.macds[d]['macd'] = bt.indicators.MACD(d.close,period_me1=self.p.short_period,
period_me2=self.p.long_period,period_signal=self.p.signal_period)
self.macds[d]['signal'] = self.macds[d]['macd'].lines.signal
# 初始化订单
self.order = None
def log(self, txt, dt=None):
if self.params.bprint:
dt = dt or self.data.datetime.date()
print('%s, %s' % (dt.isoformat(), txt))
def next(self):
# 检查是否有未完成的订单
if self.order:
return
# 枚举数据的序号和数据,d就是一个股票的数据lines
for i, d in enumerate(self.datas):
# 获取时间及股票代码
dt, dn = self.datetime.date(), d._name
# 获取对应代码的仓位
pos = self.getposition(d).size
# 无仓位,则可以买入
if not pos:
# MACD买入信号 ,可以多次买入
if self.macds[d]['macd'] > self.macds[d]['signal']:
# data = d指定buy的代码
self.buy(data = d, size = self.p.pstake)
# 平仓 ,一次卖出
elif self.macds[d]['macd'] < self.macds[d]['signal']:
# data = d指定sell的代码
self.close(data = d)
def notify_order(self, order):
if order.status in [order.Submitted, order.Accepted]:
# 提交给代理或者由代理接收的买/卖订单 - 不做操作
return
# 检查订单是否执行完毕
# order是一次处理一个数据,不存在order.datas!!!
# order.data._name 区分order是哪个数据
if order.status in [order.Completed]:
if order.isbuy():
self.log(
'%s :BUY EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.data._name,
order.executed.price,
order.executed.value,
order.executed.comm))
self.buyprice = order.executed.price
self.buycomm = order.executed.comm
else: # 卖
self.log('%s :SELL EXECUTED, Price: %.2f, Cost: %.2f, Comm %.2f' %
(order.data._name,
order.executed.price,
order.executed.value,
order.executed.comm))
self.bar_executed = len(self)
elif order.status in [order.Canceled, order.Margin, order.Rejected]:
self.log('Order Canceled/Margin/Rejected')
# 无等待处理订单
self.order = None
def notify_trade(self, trade):
if not trade.isclosed:
return
#可以按trade.data取触发notify_trade的日期
dt = trade.data.datetime.date()
# trade是一次处理一个数据,不存在trader.datas!!!
if trade.isclosed:
self.log('%s :Closed, PnL Gross %.2f, Net %.2f,Net worth: %.2f' %
(trade.data._name, round(trade.pnl, 2), round(trade.pnlcomm, 2),self.broker.getvalue()))
# 创建Cerebro引擎
cerebro = bt.Cerebro()
# 添加策略
codes=['000858.SZ','000859.SZ','000860.SZ','000861.SZ','000862.SZ','000863.SZ','000868.SZ']
for code in codes:
stock_df = get_code(code)
data = btfeeds.PandasData(dataname=stock_df, fromdate=start_date, todate=end_date) # 加载数据
cerebro.adddata(data,name=code)
print(code)
cerebro.addstrategy(MACDStrategy)
# 设置初始资本
cerebro.broker.set_cash(100000.0)
# 运行Cerebro引擎
print('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 遍历所有数据
cerebro.run()
# 打印最后结果
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
# 输出策略结果
#cerebro.plot(iplot=False)
6.输出结果
可以看到多个股票在一个策略下,在一个时间段同时交易。
000858.SZ
000859.SZ
000860.SZ
000861.SZ
000862.SZ
000863.SZ
000868.SZ
Starting Portfolio Value: 100000.00
2016-02-26, 000858.SZ :BUY EXECUTED, Price: 23.18, Cost: 231.80, Comm 0.00
2016-02-26, 000859.SZ :BUY EXECUTED, Price: 4.50, Cost: 45.00, Comm 0.00
2016-02-26, 000860.SZ :BUY EXECUTED, Price: 19.40, Cost: 194.00, Comm 0.00
2016-02-26, 000861.SZ :BUY EXECUTED, Price: 5.16, Cost: 51.60, Comm 0.00
2016-02-26, 000862.SZ :BUY EXECUTED, Price: 5.99, Cost: 59.90, Comm 0.00
2016-02-26, 000863.SZ :BUY EXECUTED, Price: 7.75, Cost: 77.50, Comm 0.00
2016-02-26, 000868.SZ :BUY EXECUTED, Price: 6.85, Cost: 68.50, Comm 0.00
2016-02-29, 000860.SZ :SELL EXECUTED, Price: 18.90, Cost: 194.00, Comm 0.00
2016-02-29, 000860.SZ :Closed, PnL Gross -5.00, Net -5.00,Net worth: 99965.10
2016-03-01, 000858.SZ :SELL EXECUTED, Price: 22.55, Cost: 231.80, Comm 0.00
2016-03-01, 000863.SZ :SELL EXECUTED, Price: 7.30, Cost: 77.50, Comm 0.00
2016-03-01, 000858.SZ :Closed, PnL Gross -6.30, Net -6.30,Net worth: 99974.80
2016-03-01, 000863.SZ :Closed, PnL Gross -4.50, Net -4.50,Net worth: 99974.80
2016-03-03, 000858.SZ :BUY EXECUTED, Price: 23.92, Cost: 239.20, Comm 0.00
2016-03-03, 000863.SZ :BUY EXECUTED, Price: 8.19, Cost: 81.90, Comm 0.00
2016-03-18, 000860.SZ :BUY EXECUTED, Price: 19.26, Cost: 192.60, Comm 0.00
2016-04-11, 000858.SZ :SELL EXECUTED, Price: 27.48, Cost: 239.20, Comm 0.00
2016-04-11, 000868.SZ :SELL EXECUTED, Price: 7.31, Cost: 68.50, Comm 0.00
2016-04-11, 000858.SZ :Closed, PnL Gross 35.60, Net 35.60,Net worth: 100091.10
2016-04-11, 000868.SZ :Closed, PnL Gross 4.60, Net 4.60,Net worth: 100091.10
2016-04-12, 000860.SZ :SELL EXECUTED, Price: 20.80, Cost: 192.60, Comm 0.00
2016-04-12, 000860.SZ :Closed, PnL Gross 15.40, Net 15.40,Net worth: 100090.00
2016-04-15, 000868.SZ :BUY EXECUTED, Price: 7.60, Cost: 76.00, Comm 0.00
2016-04-20, 000863.SZ :SELL EXECUTED, Price: 9.93, Cost: 81.90, Comm 0.00
2016-04-20, 000863.SZ :Closed, PnL Gross 17.40, Net 17.40,Net worth: 100075.50
2016-04-21, 000861.SZ :SELL EXECUTED, Price: 5.64, Cost: 51.60, Comm 0.00
2016-04-21, 000868.SZ :SELL EXECUTED, Price: 7.06, Cost: 76.00, Comm 0.00
2016-04-21, 000861.SZ :Closed, PnL Gross 4.80, Net 4.80,Net worth: 100075.30
2016-04-21, 000868.SZ :Closed, PnL Gross -5.40, Net -5.40,Net worth: 100075.30
2016-04-25, 000859.SZ :SELL EXECUTED, Price: 5.62, Cost: 45.00, Comm 0.00
2016-04-25, 000859.SZ :Closed, PnL Gross 11.20, Net 11.20,Net worth: 100074.70
2016-04-26, 000862.SZ :SELL EXECUTED, Price: 6.64, Cost: 59.90, Comm 0.00
2016-04-26, 000862.SZ :Closed, PnL Gross 6.50, Net 6.50,Net worth: 100074.30
2016-04-28, 000862.SZ :BUY EXECUTED, Price: 6.91, Cost: 69.10, Comm 0.00
2016-04-29, 000862.SZ :SELL EXECUTED, Price: 6.75, Cost: 69.10, Comm 0.00
2016-04-29, 000862.SZ :Closed, PnL Gross -1.60, Net -1.60,Net worth: 100072.70
2016-05-03, 000858.SZ :BUY EXECUTED, Price: 28.68, Cost: 286.80, Comm 0.00
2016-05-04, 000860.SZ :BUY EXECUTED, Price: 23.09, Cost: 230.90, Comm 0.00
2016-05-05, 000862.SZ :BUY EXECUTED, Price: 7.02, Cost: 70.20, Comm 0.00
2016-05-06, 000863.SZ :BUY EXECUTED, Price: 10.07, Cost: 100.70, Comm 0.00
2016-05-09, 000862.SZ :SELL EXECUTED, Price: 6.67, Cost: 70.20, Comm 0.00
2016-05-09, 000863.SZ :SELL EXECUTED, Price: 9.49, Cost: 100.70, Comm 0.00
2016-05-09, 000862.SZ :Closed, PnL Gross -3.50, Net -3.50,Net worth: 100055.80
2016-05-09, 000863.SZ :Closed, PnL Gross -5.80, Net -5.80,Net worth: 100055.80
2016-05-18, 000858.SZ :SELL EXECUTED, Price: 29.10, Cost: 286.80, Comm 0.00
2016-05-18, 000858.SZ :Closed, PnL Gross 4.20, Net 4.20,Net worth: 100055.20
2016-05-23, 000860.SZ :SELL EXECUTED, Price: 21.97, Cost: 230.90, Comm 0.00
2016-05-23, 000860.SZ :Closed, PnL Gross -11.20, Net -11.20,Net worth: 100056.40
2016-05-25, 000862.SZ :BUY EXECUTED, Price: 6.69, Cost: 66.90, Comm 0.00
2016-05-25, 000863.SZ :BUY EXECUTED, Price: 9.68, Cost: 96.80, Comm 0.00
2016-05-25, 000868.SZ :BUY EXECUTED, Price: 6.52, Cost: 65.20, Comm 0.00
2016-05-30, 000861.SZ :BUY EXECUTED, Price: 4.99, Cost: 49.90, Comm 0.00
2016-05-30, 000863.SZ :SELL EXECUTED, Price: 9.35, Cost: 96.80, Comm 0.00
2016-05-30, 000863.SZ :Closed, PnL Gross -3.30, Net -3.30,Net worth: 100052.80
2016-05-31, 000859.SZ :BUY EXECUTED, Price: 4.86, Cost: 48.60, Comm 0.00
2016-06-01, 000863.SZ :BUY EXECUTED, Price: 9.80, Cost: 98.00, Comm 0.00
2016-06-06, 000858.SZ :BUY EXECUTED, Price: 31.33, Cost: 313.30, Comm 0.00
2016-06-06, 000860.SZ :BUY EXECUTED, Price: 23.26, Cost: 232.60, Comm 0.00
2016-06-15, 000862.SZ :SELL EXECUTED, Price: 6.83, Cost: 66.90, Comm 0.00
2016-06-15, 000863.SZ :SELL EXECUTED, Price: 9.43, Cost: 98.00, Comm 0.00
2016-06-15, 000862.SZ :Closed, PnL Gross 1.40, Net 1.40,Net worth: 100070.60
2016-06-15, 000863.SZ :Closed, PnL Gross -3.70, Net -3.70,Net worth: 100070.60
2016-06-16, 000862.SZ :BUY EXECUTED, Price: 7.14, Cost: 71.40, Comm 0.00
2016-06-24, 000860.SZ :SELL EXECUTED, Price: 23.15, Cost: 232.60, Comm 0.00
2016-06-24, 000860.SZ :Closed, PnL Gross -1.10, Net -1.10,Net worth: 100057.10
2016-06-27, 000862.SZ :SELL EXECUTED, Price: 6.82, Cost: 71.40, Comm 0.00
2016-06-27, 000862.SZ :Closed, PnL Gross -3.20, Net -3.20,Net worth: 100069.20
2016-06-28, 000859.SZ :SELL EXECUTED, Price: 5.18, Cost: 48.60, Comm 0.00
2016-06-28, 000861.SZ :SELL EXECUTED, Price: 4.89, Cost: 49.90, Comm 0.00
2016-06-28, 000859.SZ :Closed, PnL Gross 3.20, Net 3.20,Net worth: 100070.60
2016-06-28, 000861.SZ :Closed, PnL Gross -1.00, Net -1.00,Net worth: 100070.60
2016-06-29, 000861.SZ :BUY EXECUTED, Price: 4.93, Cost: 49.30, Comm 0.00
2016-07-05, 000858.SZ :SELL EXECUTED, Price: 32.62, Cost: 313.30, Comm 0.00
2016-07-05, 000858.SZ :Closed, PnL Gross 12.90, Net 12.90,Net worth: 100074.90
2016-07-06, 000858.SZ :BUY EXECUTED, Price: 32.94, Cost: 329.40, Comm 0.00
2016-07-06, 000859.SZ :BUY EXECUTED, Price: 5.39, Cost: 53.90, Comm 0.00
2016-07-07, 000860.SZ :BUY EXECUTED, Price: 24.70, Cost: 247.00, Comm 0.00
2016-07-08, 000863.SZ :BUY EXECUTED, Price: 9.44, Cost: 94.40, Comm 0.00
2016-07-11, 000868.SZ :SELL EXECUTED, Price: 7.59, Cost: 65.20, Comm 0.00
2016-07-11, 000868.SZ :Closed, PnL Gross 10.70, Net 10.70,Net worth: 100116.90
2016-07-12, 000859.SZ :SELL EXECUTED, Price: 5.34, Cost: 53.90, Comm 0.00
2016-07-12, 000859.SZ :Closed, PnL Gross -0.50, Net -0.50,Net worth: 100123.50
2016-07-19, 000860.SZ :SELL EXECUTED, Price: 24.14, Cost: 247.00, Comm 0.00
2016-07-19, 000860.SZ :Closed, PnL Gross -5.60, Net -5.60,Net worth: 100096.00
2016-07-20, 000859.SZ :BUY EXECUTED, Price: 5.52, Cost: 55.20, Comm 0.00
2016-07-21, 000858.SZ :SELL EXECUTED, Price: 35.31, Cost: 329.40, Comm 0.00
2016-07-21, 000858.SZ :Closed, PnL Gross 23.70, Net 23.70,Net worth: 100092.40
2016-07-22, 000859.SZ :SELL EXECUTED, Price: 5.40, Cost: 55.20, Comm 0.00
2016-07-22, 000862.SZ :BUY EXECUTED, Price: 7.32, Cost: 73.20, Comm 0.00
2016-07-22, 000859.SZ :Closed, PnL Gross -1.20, Net -1.20,Net worth: 100089.80
2016-07-28, 000861.SZ :SELL EXECUTED, Price: 4.82, Cost: 49.30, Comm 0.00
2016-07-28, 000863.SZ :SELL EXECUTED, Price: 9.33, Cost: 94.40, Comm 0.00
2016-07-28, 000861.SZ :Closed, PnL Gross -1.10, Net -1.10,Net worth: 100090.30
2016-07-28, 000863.SZ :Closed, PnL Gross -1.10, Net -1.10,Net worth: 100090.30
2016-08-03, 000862.SZ :SELL EXECUTED, Price: 7.24, Cost: 73.20, Comm 0.00
2016-08-03, 000863.SZ :BUY EXECUTED, Price: 9.70, Cost: 97.00, Comm 0.00
2016-08-03, 000862.SZ :Closed, PnL Gross -0.80, Net -0.80,Net worth: 100086.40
2016-08-10, 000862.SZ :BUY EXECUTED, Price: 7.50, Cost: 75.00, Comm 0.00
2016-08-15, 000859.SZ :BUY EXECUTED, Price: 5.26, Cost: 52.60, Comm 0.00
2016-08-16, 000860.SZ :BUY EXECUTED, Price: 23.16, Cost: 231.60, Comm 0.00
2016-08-16, 000861.SZ :BUY EXECUTED, Price: 5.06, Cost: 50.60, Comm 0.00
2016-08-16, 000868.SZ :BUY EXECUTED, Price: 7.09, Cost: 70.90, Comm 0.00
2016-08-17, 000858.SZ :BUY EXECUTED, Price: 36.30, Cost: 363.00, Comm 0.00
2016-08-22, 000858.SZ :SELL EXECUTED, Price: 35.59, Cost: 363.00, Comm 0.00
2016-08-22, 000858.SZ :Closed, PnL Gross -7.10, Net -7.10,Net worth: 100087.80
2016-08-23, 000860.SZ :SELL EXECUTED, Price: 21.82, Cost: 231.60, Comm 0.00
2016-08-23, 000860.SZ :Closed, PnL Gross -13.40, Net -13.40,Net worth: 100089.10
2016-08-31, 000863.SZ :SELL EXECUTED, Price: 10.03, Cost: 97.00, Comm 0.00
2016-08-31, 000863.SZ :Closed, PnL Gross 3.30, Net 3.30,Net worth: 100078.80
2016-09-01, 000861.SZ :SELL EXECUTED, Price: 5.28, Cost: 50.60, Comm 0.00
2016-09-01, 000861.SZ :Closed, PnL Gross 2.20, Net 2.20,Net worth: 100075.20
2016-09-02, 000862.SZ :SELL EXECUTED, Price: 8.01, Cost: 75.00, Comm 0.00
2016-09-02, 000862.SZ :Closed, PnL Gross 5.10, Net 5.10,Net worth: 100077.20
2016-09-09, 000861.SZ :BUY EXECUTED, Price: 5.40, Cost: 54.00, Comm 0.00
2016-09-09, 000862.SZ :BUY EXECUTED, Price: 8.50, Cost: 85.00, Comm 0.00
2016-09-13, 000861.SZ :SELL EXECUTED, Price: 5.20, Cost: 54.00, Comm 0.00
2016-09-13, 000861.SZ :Closed, PnL Gross -2.00, Net -2.00,Net worth: 100077.80
2016-09-19, 000859.SZ :SELL EXECUTED, Price: 5.48, Cost: 52.60, Comm 0.00
2016-09-19, 000868.SZ :SELL EXECUTED, Price: 6.87, Cost: 70.90, Comm 0.00
2016-09-19, 000859.SZ :Closed, PnL Gross 2.20, Net 2.20,Net worth: 100077.70
2016-09-19, 000868.SZ :Closed, PnL Gross -2.20, Net -2.20,Net worth: 100077.70
2016-09-23, 000860.SZ :BUY EXECUTED, Price: 20.63, Cost: 206.30, Comm 0.00
2016-09-26, 000858.SZ :BUY EXECUTED, Price: 33.20, Cost: 332.00, Comm 0.00
2016-09-27, 000858.SZ :SELL EXECUTED, Price: 32.25, Cost: 332.00, Comm 0.00
2016-09-27, 000860.SZ :SELL EXECUTED, Price: 19.80, Cost: 206.30, Comm 0.00
2016-09-27, 000858.SZ :Closed, PnL Gross -9.50, Net -9.50,Net worth: 100059.40
2016-09-27, 000860.SZ :Closed, PnL Gross -8.30, Net -8.30,Net worth: 100059.40
2016-09-28, 000862.SZ :SELL EXECUTED, Price: 8.78, Cost: 85.00, Comm 0.00
2016-09-28, 000862.SZ :Closed, PnL Gross 2.80, Net 2.80,Net worth: 100058.80
2016-09-30, 000858.SZ :BUY EXECUTED, Price: 32.62, Cost: 326.20, Comm 0.00
2016-09-30, 000860.SZ :BUY EXECUTED, Price: 20.01, Cost: 200.10, Comm 0.00
2016-10-11, 000863.SZ :BUY EXECUTED, Price: 9.64, Cost: 96.40, Comm 0.00
2016-10-12, 000859.SZ :BUY EXECUTED, Price: 5.59, Cost: 55.90, Comm 0.00
2016-10-12, 000868.SZ :BUY EXECUTED, Price: 6.90, Cost: 69.00, Comm 0.00
2016-10-14, 000861.SZ :BUY EXECUTED, Price: 5.37, Cost: 53.70, Comm 0.00
2016-10-24, 000861.SZ :SELL EXECUTED, Price: 5.14, Cost: 53.70, Comm 0.00
2016-10-24, 000861.SZ :Closed, PnL Gross -2.30, Net -2.30,Net worth: 100074.40
2016-10-25, 000863.SZ :SELL EXECUTED, Price: 9.59, Cost: 96.40, Comm 0.00
2016-10-25, 000863.SZ :Closed, PnL Gross -0.50, Net -0.50,Net worth: 100083.80
2016-10-27, 000863.SZ :BUY EXECUTED, Price: 9.68, Cost: 96.80, Comm 0.00
2016-11-01, 000863.SZ :SELL EXECUTED, Price: 9.51, Cost: 96.80, Comm 0.00
2016-11-01, 000863.SZ :Closed, PnL Gross -1.70, Net -1.70,Net worth: 100088.40
2016-11-04, 000860.SZ :SELL EXECUTED, Price: 20.38, Cost: 200.10, Comm 0.00
2016-11-04, 000860.SZ :Closed, PnL Gross 3.70, Net 3.70,Net worth: 100080.30
2016-11-08, 000862.SZ :BUY EXECUTED, Price: 9.17, Cost: 91.70, Comm 0.00
2016-11-15, 000858.SZ :SELL EXECUTED, Price: 34.34, Cost: 326.20, Comm 0.00
2016-11-15, 000860.SZ :BUY EXECUTED, Price: 20.84, Cost: 208.40, Comm 0.00
2016-11-15, 000861.SZ :BUY EXECUTED, Price: 5.13, Cost: 51.30, Comm 0.00
2016-11-15, 000858.SZ :Closed, PnL Gross 17.20, Net 17.20,Net worth: 100086.70
2016-11-16, 000863.SZ :BUY EXECUTED, Price: 9.36, Cost: 93.60, Comm 0.00
2016-11-18, 000863.SZ :SELL EXECUTED, Price: 9.30, Cost: 93.60, Comm 0.00
2016-11-18, 000863.SZ :Closed, PnL Gross -0.60, Net -0.60,Net worth: 100082.00
2016-11-25, 000862.SZ :SELL EXECUTED, Price: 9.13, Cost: 91.70, Comm 0.00
2016-11-25, 000862.SZ :Closed, PnL Gross -0.40, Net -0.40,Net worth: 100086.30
2016-11-28, 000858.SZ :BUY EXECUTED, Price: 35.60, Cost: 356.00, Comm 0.00
2016-11-28, 000868.SZ :SELL EXECUTED, Price: 7.10, Cost: 69.00, Comm 0.00
2016-11-28, 000868.SZ :Closed, PnL Gross 2.00, Net 2.00,Net worth: 100084.80
2016-12-01, 000859.SZ :SELL EXECUTED, Price: 5.80, Cost: 55.90, Comm 0.00
2016-12-01, 000861.SZ :SELL EXECUTED, Price: 5.06, Cost: 51.30, Comm 0.00
2016-12-01, 000859.SZ :Closed, PnL Gross 2.10, Net 2.10,Net worth: 100081.80
2016-12-01, 000861.SZ :Closed, PnL Gross -0.70, Net -0.70,Net worth: 100081.80
2016-12-05, 000860.SZ :SELL EXECUTED, Price: 20.20, Cost: 208.40, Comm 0.00
2016-12-05, 000860.SZ :Closed, PnL Gross -6.40, Net -6.40,Net worth: 100070.60
2016-12-09, 000861.SZ :BUY EXECUTED, Price: 5.10, Cost: 51.00, Comm 0.00
2016-12-13, 000861.SZ :SELL EXECUTED, Price: 4.85, Cost: 51.00, Comm 0.00
2016-12-13, 000861.SZ :Closed, PnL Gross -2.50, Net -2.50,Net worth: 100075.30
2016-12-15, 000858.SZ :SELL EXECUTED, Price: 35.70, Cost: 356.00, Comm 0.00
2016-12-15, 000860.SZ :BUY EXECUTED, Price: 20.79, Cost: 207.90, Comm 0.00
2016-12-15, 000858.SZ :Closed, PnL Gross 1.00, Net 1.00,Net worth: 100072.60
2016-12-22, 000862.SZ :BUY EXECUTED, Price: 8.52, Cost: 85.20, Comm 0.00
2016-12-26, 000859.SZ :BUY EXECUTED, Price: 5.71, Cost: 57.10, Comm 0.00
2016-12-27, 000860.SZ :SELL EXECUTED, Price: 20.56, Cost: 207.90, Comm 0.00
2016-12-27, 000860.SZ :Closed, PnL Gross -2.30, Net -2.30,Net worth: 100070.80
2016-12-29, 000863.SZ :BUY EXECUTED, Price: 8.40, Cost: 84.00, Comm 0.00
Final Portfolio Value: 100068.70
7. plot
如果股票数量太多,绘图都汇集到一起,没有意义。
volume不绘图
组合用三个股票演示一下:
# 输出策略结果
#cerebro.plot(style = "candlestick", iplot=False)
cerebro.plot(style = "candlestick",iplot=False,volume=False)