Backtrader 文档学习-Strategy(下)

Backtrader 文档学习-Strategy(下)

1. notify_cashvalue

# 测试 #notify_cashvalue 方法特点
class Test_Strategy(bt.Strategy):  # 策略通用初始参数params = (('maperiod1', 5),('maperiod2', 20),('printlog', True),  # 写入日志标志('logfilename', 'Test_Strategy.log'), # 日志文件名('counter', 0), # 计数器('notify_trade_trigger',0),  # notify_trade触发计数        )def __init__(self):  #Open, High, Low, Close, Volumeself.dataopen = self.datas[0].openself.datahigh = self.datas[0].highself.datalow = self.datas[0].lowself.dataclose = self.datas[0].close  self.datavol = self.datas[0].volume# 5 20 日均线self.sma5 = bt.indicators.SimpleMovingAverage(self.dataclose, period=self.params.maperiod1)  self.sma20 = bt.indicators.SimpleMovingAverage(self.dataclose, period=self.params.maperiod2)  # doprint 打印日志标志def log(self, txt, dt=None, doprint=False):''' Logging function for this strategy'''if self.params.printlog or doprint:dt = dt or self.datas[0].datetime.date(0)#print('%s, %s' % (dt.isoformat(), txt))with open(self.params.logfilename, 'a') as file:file.write('%s, %s' % (dt.isoformat(), txt))file.write('\n')def start(self):    # 从0 开始#self.params.counter += 1#self.log('Test_Strategy start %s' % self.params.counter, doprint=True)passdef nextstart(self):self.params.counter += 1#self.log('Test_Strategy nextstart %s' % self.params.counter, doprint=True)def prenext(self):self.params.counter += 1#self.log('Test_Strategy prenext  %s' % self.params.counter, doprint=True)def next(self):  # 最简单的策略,观察各个属性和方法if self.sma5 > self.sma20:  self.order = self.buy()  else:  # 必须先买入,才能卖出,不能直接卖空       if self.position.size > 0 :self.order = self.sell()  self.params.counter += 1        self.order = None#self.log('Test_Strategy next %s' % self.params.counter, doprint=True)#获得订单状态变化的通知    def notify_order(self, order):pass   #通知所有开仓/更新/平仓交易    def notify_trade(self,trade) : # ,historyon=True#trade.status_names:['Created', 'Open', 'Closed']# 触发一次notify_trade 的计数器self.params.notify_trade_trigger += 1#print('self.params.notify_trade_trigger',self.params.notify_trade_trigger)# 平仓写日志if trade.isclosed:self.log("OPERATION isclosed PROFIT, GROSS %.2f, NET %.2f" % (trade.pnl, trade.pnlcomm))# 开仓写日志if trade.isopen:self.log("OPERATION isopen PROFIT, GROSS %.2f, NET %.2f" % (trade.pnl, trade.pnlcomm))def notify_fund(self,cash,value,fundvalue,shares):self.log('notify_fund:' , doprint=True)self.log('cash:%.2f' % cash, doprint=True)self.log('value:%.2f' % value, doprint=True)self.log('fundvalue:%.2f' % fundvalue, doprint=True)self.log('shares:%.2f' % shares, doprint=True)passdef notify_store(self ,msg):passdef notify_cashvalue(self,cash, value):self.log('notify_cashvalue:' , doprint=True)self.log('cash:%.2f' % cash, doprint=True)#self.log(dir(cash), doprint=True)self.log('value:%.2f' % value, doprint=True)#self.log(dir(value), doprint=True)passdef stop(self):self.params.counter += 1     #self.close()print('self.params.counter:',self.params.counter)#self.log('Test_Strategy stop  %s' % self.params.counter, doprint=True)self.log('(MA Period %2d) Ending Value %.2f' %(self.params.maperiod1, self.broker.getvalue()), doprint=True)if __name__ == '__main__':# delete log filelog_file = './Test_Strategy.log'delete_file(log_file)# 创建Cerebro引擎  导入2019-1-1 到 2019-3-31 三个月数据cerebro = declare_cerebar()# Set our desired cash startcerebro.broker.setcash(100000.0)# Set the commission - 0.1% ... divide by 100 to remove the %# 按万一的佣金 ,买卖操作都要扣除#cerebro.broker.setcommission(commission=0.0001)# Add a FixedSize sizer according to the stake#cerebro.addsizer(bt.sizers.FixedSize, stake=10)cerebro.addstrategy(Test_Strategy)  cerebro.run()print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())#cerebro.plot(iplot=False)

程序修改:

  • 1、如果仓位是0 ,不能卖出;
  • 2、为了能够清楚容易计算cash和value ,把stake 和commission 都用默认值0 。

执行结果:

# cat Test_Strategy.log 
2020-01-02, notify_cashvalue:
2020-01-02, data close :132.08,open :132.00
2020-01-02, cash:100000.00
2020-01-02, value:100000.00
2020-01-02, notify_fund:
2020-01-02, cash:100000.00
2020-01-02, value:100000.00
2020-01-02, fundvalue:100.00
2020-01-02, shares:1000.00
2020-01-03, notify_cashvalue:
2020-01-03, data close :130.55,open :131.60
2020-01-03, cash:100000.00
2020-01-03, value:100000.00
2020-01-03, notify_fund:
2020-01-03, cash:100000.00
2020-01-03, value:100000.00
2020-01-03, fundvalue:100.00
2020-01-03, shares:1000.00
2020-01-06, notify_cashvalue:
2020-01-06, data close :129.20,open :130.00
2020-01-06, cash:100000.00
2020-01-06, value:100000.00
2020-01-06, notify_fund:
2020-01-06, cash:100000.00
2020-01-06, value:100000.00
2020-01-06, fundvalue:100.00
2020-01-06, shares:1000.00
2020-01-07, notify_cashvalue:
2020-01-07, data close :129.37,open :129.50
2020-01-07, cash:100000.00
2020-01-07, value:100000.00
2020-01-07, notify_fund:
2020-01-07, cash:100000.00
2020-01-07, value:100000.00
2020-01-07, fundvalue:100.00
2020-01-07, shares:1000.00
2020-01-08, notify_cashvalue:
2020-01-08, data close :128.89,open :128.99
2020-01-08, cash:100000.00
2020-01-08, value:100000.00
2020-01-08, notify_fund:
2020-01-08, cash:100000.00
2020-01-08, value:100000.00
2020-01-08, fundvalue:100.00
2020-01-08, shares:1000.00
2020-01-09, notify_cashvalue:
2020-01-09, data close :130.77,open :129.00
2020-01-09, cash:100000.00
2020-01-09, value:100000.00
2020-01-09, notify_fund:
2020-01-09, cash:100000.00
2020-01-09, value:100000.00
2020-01-09, fundvalue:100.00
2020-01-09, shares:1000.00
2020-01-10, notify_cashvalue:
2020-01-10, data close :133.62,open :130.50
2020-01-10, cash:100000.00
2020-01-10, value:100000.00
2020-01-10, notify_fund:
2020-01-10, cash:100000.00
2020-01-10, value:100000.00
2020-01-10, fundvalue:100.00
2020-01-10, shares:1000.00
2020-01-13, notify_cashvalue:
2020-01-13, data close :139.66,open :134.26
2020-01-13, cash:100000.00
2020-01-13, value:100000.00
2020-01-13, notify_fund:
2020-01-13, cash:100000.00
2020-01-13, value:100000.00
2020-01-13, fundvalue:100.00
2020-01-13, shares:1000.00
2020-01-14, notify_cashvalue:
2020-01-14, data close :138.56,open :140.10
2020-01-14, cash:100000.00
2020-01-14, value:100000.00
2020-01-14, notify_fund:
2020-01-14, cash:100000.00
2020-01-14, value:100000.00
2020-01-14, fundvalue:100.00
2020-01-14, shares:1000.00
2020-01-15, notify_cashvalue:
2020-01-15, data close :140.80,open :138.56
2020-01-15, cash:100000.00
2020-01-15, value:100000.00
2020-01-15, notify_fund:
2020-01-15, cash:100000.00
2020-01-15, value:100000.00
2020-01-15, fundvalue:100.00
2020-01-15, shares:1000.00
2020-01-16, notify_cashvalue:
2020-01-16, data close :140.66,open :140.80
2020-01-16, cash:100000.00
2020-01-16, value:100000.00
2020-01-16, notify_fund:
2020-01-16, cash:100000.00
2020-01-16, value:100000.00
2020-01-16, fundvalue:100.00
2020-01-16, shares:1000.00
2020-01-17, notify_cashvalue:
2020-01-17, data close :138.55,open :141.26
2020-01-17, cash:100000.00
2020-01-17, value:100000.00
2020-01-17, notify_fund:
2020-01-17, cash:100000.00
2020-01-17, value:100000.00
2020-01-17, fundvalue:100.00
2020-01-17, shares:1000.00
2020-01-20, notify_cashvalue:
2020-01-20, data close :137.56,open :140.55
2020-01-20, cash:100000.00
2020-01-20, value:100000.00
2020-01-20, notify_fund:
2020-01-20, cash:100000.00
2020-01-20, value:100000.00
2020-01-20, fundvalue:100.00
2020-01-20, shares:1000.00
2020-01-21, notify_cashvalue:
2020-01-21, data close :132.62,open :136.50
2020-01-21, cash:100000.00
2020-01-21, value:100000.00
2020-01-21, notify_fund:
2020-01-21, cash:100000.00
2020-01-21, value:100000.00
2020-01-21, fundvalue:100.00
2020-01-21, shares:1000.00
2020-01-22, notify_cashvalue:
2020-01-22, data close :131.70,open :130.99
2020-01-22, cash:100000.00
2020-01-22, value:100000.00
2020-01-22, notify_fund:
2020-01-22, cash:100000.00
2020-01-22, value:100000.00
2020-01-22, fundvalue:100.00
2020-01-22, shares:1000.00
2020-01-23, notify_cashvalue:
2020-01-23, data close :126.16,open :131.77
2020-01-23, cash:100000.00
2020-01-23, value:100000.00
2020-01-23, notify_fund:
2020-01-23, cash:100000.00
2020-01-23, value:100000.00
2020-01-23, fundvalue:100.00
2020-01-23, shares:1000.00
2020-02-03, notify_cashvalue:
2020-02-03, data close :113.54,open :113.54
2020-02-03, cash:100000.00
2020-02-03, value:100000.00
2020-02-03, notify_fund:
2020-02-03, cash:100000.00
2020-02-03, value:100000.00
2020-02-03, fundvalue:100.00
2020-02-03, shares:1000.00
2020-02-04, notify_cashvalue:
2020-02-04, data close :114.50,open :109.00
2020-02-04, cash:100000.00
2020-02-04, value:100000.00
2020-02-04, notify_fund:
2020-02-04, cash:100000.00
2020-02-04, value:100000.00
2020-02-04, fundvalue:100.00
2020-02-04, shares:1000.00
2020-02-05, notify_cashvalue:
2020-02-05, data close :117.51,open :115.90
2020-02-05, cash:100000.00
2020-02-05, value:100000.00
2020-02-05, notify_fund:
2020-02-05, cash:100000.00
2020-02-05, value:100000.00
2020-02-05, fundvalue:100.00
2020-02-05, shares:1000.00
2020-02-06, notify_cashvalue:
2020-02-06, data close :119.15,open :119.00
2020-02-06, cash:100000.00
2020-02-06, value:100000.00
2020-02-06, notify_fund:
2020-02-06, cash:100000.00
2020-02-06, value:100000.00
2020-02-06, fundvalue:100.00
2020-02-06, shares:1000.00
2020-02-07, notify_cashvalue:
2020-02-07, data close :120.58,open :119.25
2020-02-07, cash:100000.00
2020-02-07, value:100000.00
2020-02-07, notify_fund:
2020-02-07, cash:100000.00
2020-02-07, value:100000.00
2020-02-07, fundvalue:100.00
2020-02-07, shares:1000.00
2020-02-10, notify_cashvalue:
2020-02-10, data close :121.13,open :119.50
2020-02-10, cash:100000.00
2020-02-10, value:100000.00
2020-02-10, notify_fund:
2020-02-10, cash:100000.00
2020-02-10, value:100000.00
2020-02-10, fundvalue:100.00
2020-02-10, shares:1000.00
2020-02-11, notify_cashvalue:
2020-02-11, data close :124.79,open :121.15
2020-02-11, cash:100000.00
2020-02-11, value:100000.00
2020-02-11, notify_fund:
2020-02-11, cash:100000.00
2020-02-11, value:100000.00
2020-02-11, fundvalue:100.00
2020-02-11, shares:1000.00
2020-02-12, notify_cashvalue:
2020-02-12, data close :124.49,open :124.50
2020-02-12, cash:100000.00
2020-02-12, value:100000.00
2020-02-12, notify_fund:
2020-02-12, cash:100000.00
2020-02-12, value:100000.00
2020-02-12, fundvalue:100.00
2020-02-12, shares:1000.00
2020-02-13, notify_cashvalue:
2020-02-13, data close :124.14,open :124.88
2020-02-13, cash:100000.00
2020-02-13, value:100000.00
2020-02-13, notify_fund:
2020-02-13, cash:100000.00
2020-02-13, value:100000.00
2020-02-13, fundvalue:100.00
2020-02-13, shares:1000.00
2020-02-14, notify_cashvalue:
2020-02-14, data close :123.43,open :124.20
2020-02-14, cash:100000.00
2020-02-14, value:100000.00
2020-02-14, notify_fund:
2020-02-14, cash:100000.00
2020-02-14, value:100000.00
2020-02-14, fundvalue:100.00
2020-02-14, shares:1000.00
2020-02-17, notify_cashvalue:
2020-02-17, data close :124.30,open :123.18
2020-02-17, cash:100000.00
2020-02-17, value:100000.00
2020-02-17, notify_fund:
2020-02-17, cash:100000.00
2020-02-17, value:100000.00
2020-02-17, fundvalue:100.00
2020-02-17, shares:1000.00
2020-02-18, notify_cashvalue:
2020-02-18, data close :123.39,open :123.80
2020-02-18, cash:100000.00
2020-02-18, value:100000.00
2020-02-18, notify_fund:
2020-02-18, cash:100000.00
2020-02-18, value:100000.00
2020-02-18, fundvalue:100.00
2020-02-18, shares:1000.00
2020-02-19, notify_cashvalue:
2020-02-19, data close :126.00,open :123.78
2020-02-19, cash:100000.00
2020-02-19, value:100000.00
2020-02-19, notify_fund:
2020-02-19, cash:100000.00
2020-02-19, value:100000.00
2020-02-19, fundvalue:100.00
2020-02-19, shares:1000.00
2020-02-20, notify_cashvalue:
2020-02-20, data close :130.15,open :127.00
2020-02-20, cash:100000.00
2020-02-20, value:100000.00
2020-02-20, notify_fund:
2020-02-20, cash:100000.00
2020-02-20, value:100000.00
2020-02-20, fundvalue:100.00
2020-02-20, shares:1000.00
2020-02-21, notify_cashvalue:
2020-02-21, data close :130.00,open :130.00
2020-02-21, cash:100000.00
2020-02-21, value:100000.00
2020-02-21, notify_fund:
2020-02-21, cash:100000.00
2020-02-21, value:100000.00
2020-02-21, fundvalue:100.00
2020-02-21, shares:1000.00
2020-02-24, OPERATION isopen PROFIT, GROSS 0.00, NET 0.00
2020-02-24, notify_cashvalue:
2020-02-24, data close :127.10,open :129.40
2020-02-24, cash:99870.60
2020-02-24, value:99997.70
2020-02-24, notify_fund:
2020-02-24, cash:99870.60
2020-02-24, value:99997.70
2020-02-24, fundvalue:100.00
2020-02-24, shares:1000.00
2020-02-25, notify_cashvalue:
2020-02-25, data close :125.30,open :124.80
2020-02-25, cash:99745.80
2020-02-25, value:99996.40
2020-02-25, notify_fund:
2020-02-25, cash:99745.80
2020-02-25, value:99996.40
2020-02-25, fundvalue:100.00
2020-02-25, shares:1000.00
2020-02-26, notify_cashvalue:
2020-02-26, data close :124.10,open :123.83
2020-02-26, cash:99621.97
2020-02-26, value:99994.27
2020-02-26, notify_fund:
2020-02-26, cash:99621.97
2020-02-26, value:99994.27
2020-02-26, fundvalue:99.99
2020-02-26, shares:1000.00
2020-02-27, notify_cashvalue:
2020-02-27, data close :126.30,open :124.80
2020-02-27, cash:99497.17
2020-02-27, value:100002.37
2020-02-27, notify_fund:
2020-02-27, cash:99497.17
2020-02-27, value:100002.37
2020-02-27, fundvalue:100.00
2020-02-27, shares:1000.00
2020-02-28, notify_cashvalue:
2020-02-28, data close :120.60,open :124.00
2020-02-28, cash:99373.17
2020-02-28, value:99976.17
2020-02-28, notify_fund:
2020-02-28, cash:99373.17
2020-02-28, value:99976.17
2020-02-28, fundvalue:99.98
2020-02-28, shares:1000.00
2020-03-02, notify_cashvalue:
2020-03-02, data close :122.65,open :120.10
2020-03-02, cash:99253.07
2020-03-02, value:99988.97
2020-03-02, notify_fund:
2020-03-02, cash:99253.07
2020-03-02, value:99988.97
2020-03-02, fundvalue:99.99
2020-03-02, shares:1000.00
2020-03-03, notify_cashvalue:
2020-03-03, data close :124.37,open :123.70
2020-03-03, cash:99129.37
2020-03-03, value:99999.96
2020-03-03, notify_fund:
2020-03-03, cash:99129.37
2020-03-03, value:99999.96
2020-03-03, fundvalue:100.00
2020-03-03, shares:1000.00
2020-03-04, notify_cashvalue:
2020-03-04, data close :125.27,open :124.00
2020-03-04, cash:99253.37
2020-03-04, value:100004.99
2020-03-04, notify_fund:
2020-03-04, cash:99253.37
2020-03-04, value:100004.99
2020-03-04, fundvalue:100.00
2020-03-04, shares:1000.00
2020-03-05, notify_cashvalue:
2020-03-05, data close :133.20,open :126.55
2020-03-05, cash:99379.92
2020-03-05, value:100045.92
2020-03-05, notify_fund:
2020-03-05, cash:99379.92
2020-03-05, value:100045.92
2020-03-05, fundvalue:100.05
2020-03-05, shares:1000.00
2020-03-06, notify_cashvalue:
2020-03-06, data close :130.07,open :132.00
2020-03-06, cash:99247.92
2020-03-06, value:100028.34
2020-03-06, notify_fund:
2020-03-06, cash:99247.92
2020-03-06, value:100028.34
2020-03-06, fundvalue:100.03
2020-03-06, shares:1000.00
2020-03-09, notify_cashvalue:
2020-03-09, data close :126.30,open :128.00
2020-03-09, cash:99119.92
2020-03-09, value:100004.02
2020-03-09, notify_fund:
2020-03-09, cash:99119.92
2020-03-09, value:100004.02
2020-03-09, fundvalue:100.00
2020-03-09, shares:1000.00
2020-03-10, notify_cashvalue:
2020-03-10, data close :130.72,open :126.30
2020-03-10, cash:98993.62
2020-03-10, value:100039.38
2020-03-10, notify_fund:
2020-03-10, cash:98993.62
2020-03-10, value:100039.38
2020-03-10, fundvalue:100.04
2020-03-10, shares:1000.00
2020-03-11, notify_cashvalue:
2020-03-11, data close :129.90,open :132.50
2020-03-11, cash:98861.12
2020-03-11, value:100030.22
2020-03-11, notify_fund:
2020-03-11, cash:98861.12
2020-03-11, value:100030.22
2020-03-11, fundvalue:100.03
2020-03-11, shares:1000.00
2020-03-12, notify_cashvalue:
2020-03-12, data close :126.04,open :126.88
2020-03-12, cash:98734.24
2020-03-12, value:99994.64
2020-03-12, notify_fund:
2020-03-12, cash:98734.24
2020-03-12, value:99994.64
2020-03-12, fundvalue:99.99
2020-03-12, shares:1000.00
2020-03-13, notify_cashvalue:
2020-03-13, data close :122.60,open :120.00
2020-03-13, cash:98614.24
2020-03-13, value:99962.84
2020-03-13, notify_fund:
2020-03-13, cash:98614.24
2020-03-13, value:99962.84
2020-03-13, fundvalue:99.96
2020-03-13, shares:1000.00
2020-03-16, notify_cashvalue:
2020-03-16, data close :115.50,open :121.40
2020-03-16, cash:98492.84
2020-03-16, value:99878.84
2020-03-16, notify_fund:
2020-03-16, cash:98492.84
2020-03-16, value:99878.84
2020-03-16, fundvalue:99.88
2020-03-16, shares:1000.00
2020-03-17, notify_cashvalue:
2020-03-17, data close :112.36,open :114.50
2020-03-17, cash:98607.34
2020-03-17, value:99843.30
2020-03-17, notify_fund:
2020-03-17, cash:98607.34
2020-03-17, value:99843.30
2020-03-17, fundvalue:99.84
2020-03-17, shares:1000.00
2020-03-18, notify_cashvalue:
2020-03-18, data close :107.59,open :113.20
2020-03-18, cash:98720.54
2020-03-18, value:99796.44
2020-03-18, notify_fund:
2020-03-18, cash:98720.54
2020-03-18, value:99796.44
2020-03-18, fundvalue:99.80
2020-03-18, shares:1000.00
2020-03-19, notify_cashvalue:
2020-03-19, data close :102.11,open :105.80
2020-03-19, cash:98826.34
2020-03-19, value:99745.33
2020-03-19, notify_fund:
2020-03-19, cash:98826.34
2020-03-19, value:99745.33
2020-03-19, fundvalue:99.75
2020-03-19, shares:1000.00
2020-03-20, notify_cashvalue:
2020-03-20, data close :108.51,open :104.32
2020-03-20, cash:98930.66
2020-03-20, value:99798.74
2020-03-20, notify_fund:
2020-03-20, cash:98930.66
2020-03-20, value:99798.74
2020-03-20, fundvalue:99.80
2020-03-20, shares:1000.00
2020-03-23, notify_cashvalue:
2020-03-23, data close :104.51,open :104.00
2020-03-23, cash:99034.66
2020-03-23, value:99766.23
2020-03-23, notify_fund:
2020-03-23, cash:99034.66
2020-03-23, value:99766.23
2020-03-23, fundvalue:99.77
2020-03-23, shares:1000.00
2020-03-24, notify_cashvalue:
2020-03-24, data close :109.05,open :107.08
2020-03-24, cash:99141.74
2020-03-24, value:99796.04
2020-03-24, notify_fund:
2020-03-24, cash:99141.74
2020-03-24, value:99796.04
2020-03-24, fundvalue:99.80
2020-03-24, shares:1000.00
2020-03-25, notify_cashvalue:
2020-03-25, data close :114.00,open :113.10
2020-03-25, cash:99254.84
2020-03-25, value:99824.84
2020-03-25, notify_fund:
2020-03-25, cash:99254.84
2020-03-25, value:99824.84
2020-03-25, fundvalue:99.82
2020-03-25, shares:1000.00
2020-03-26, notify_cashvalue:
2020-03-26, data close :113.89,open :112.98
2020-03-26, cash:99367.82
2020-03-26, value:99823.38
2020-03-26, notify_fund:
2020-03-26, cash:99367.82
2020-03-26, value:99823.38
2020-03-26, fundvalue:99.82
2020-03-26, shares:1000.00
2020-03-27, notify_cashvalue:
2020-03-27, data close :115.81,open :115.60
2020-03-27, cash:99483.42
2020-03-27, value:99830.85
2020-03-27, notify_fund:
2020-03-27, cash:99483.42
2020-03-27, value:99830.85
2020-03-27, fundvalue:99.83
2020-03-27, shares:1000.00
2020-03-30, notify_cashvalue:
2020-03-30, data close :113.23,open :112.82
2020-03-30, cash:99596.24
2020-03-30, value:99822.70
2020-03-30, notify_fund:
2020-03-30, cash:99596.24
2020-03-30, value:99822.70
2020-03-30, fundvalue:99.82
2020-03-30, shares:1000.00
2020-03-31, notify_cashvalue:
2020-03-31, data close :115.20,open :115.00
2020-03-31, cash:99711.24
2020-03-31, value:99826.44
2020-03-31, notify_fund:
2020-03-31, cash:99711.24
2020-03-31, value:99826.44
2020-03-31, fundvalue:99.83
2020-03-31, shares:1000.00
2020-03-31, (MA Period  5) Ending Value 99826.44

说明:

  • 方法引用
    是调用的analyzer._notify_cashvalue

Receives the cash/value notification before each next cycle
每次next循环中,接收cash和value 通知

self.notify_cashvalue(cash, value)
self.notify_fund(cash, value, fundvalue, fundshares)
for analyzer in itertools.chain(self.analyzers, self._slave_analyzers):analyzer._notify_cashvalue(cash, value)analyzer._notify_fund(cash, value, fundvalue, fundshares)
  • cash和value数值计算

next触发notify_cashvalue之后,计算cash和value
从2月24日开始有买入交易。
将数据导入Excel对比计算cash和value 值,数据计算原则:
在这里插入图片描述
说明:

  • 黄色是从买入转向卖出操作。
  • calc_开始的列是计算复现BT的数据计算关系
  • diff_开始的列是Excel计算后cash value 与BT的对比
  • 数据是000858

经过测试比对,BT的三个数据结果计算规则:

cash:
cash[0]=cash[-1] -open[0]*(size[0]-size[-1])

value:
value[0]=close[0]*size[0]+cash[0]

fundvalue:
fundvalue[0]=(close[0]-open[0])/shares[0]*size[0]+fundvalue[-1]

上面的计算是示意列之间的关系,并非实际上能在程序运行,因为value、cash、fundvalue 都是数值,非list数据。
在Excel中的公式 :
cash

=D4-B5*(H5-H4)

value

=C5*H5+D5

fundvalue

=(C5-B5)/G5*H5+F4

fundvalue默认用股票值/基金的份额,做基金的value 。
在文档中 没有找到说明,只能是推测计算对比后,得出的结论。

2. notify_fund

见 1.notify_cashvalue
两个差别就是在于返回的参数不同而已。

3.notify_store

接收broker的通知信息

 def notify_store(self ,msg):print('msg: ',msg)pass

执行后,没有打印出任何信息,但是有买卖操作,有交易发生,broker应该是启动工作了。
难道是在broker中手工触发msg ,然后在notify_store中接收信息 ?延期到学校broker中再看看。

4. buy 和 sell

修改next方法,buy 和 sell 都通过参数来下单。

    def next(self):  # 最简单的策略,观察各个属性和方法if self.sma5 > self.sma20:  # buy(data=None, size=None, price=None, plimit=None, exectype=None, valid=None, tradeid=0, oco=None, trailamount=None, trailpercent=None, parent=None, transmit=True, **kwargs)# 设置买入10股,限价为当前价格的105%,止损为当前价格的95%  self.order = self.buy(size=10, price=self.dataclose * 1.05, plimit=self.dataclose * 0.95, exectype=bt.Order.Limit) #print(self.order)else:# sell(data=None, size=None, price=None, plimit=None, exectype=None, valid=None, tradeid=0, oco=None, trailamount=None, trailpercent=None, parent=None, transmit=True, **kwargs)if self.position.size > 0 :# 设置卖出10股,限价为当前价格的95%,止损为当前价格的105%  self.order = self.sell(size=10, price=self.dataclose * 0.95, plimit=self.dataclose * 1.05, exectype=bt.Order.Limit)  

执行结果没有变化。

self.params.counter: 59
Final Portfolio Value: 98513.95

Order.Limit 和默认的Order.Market 一样。

把参数修改为Order.Stop ,结果变化:

self.params.counter: 59
Final Portfolio Value: 98513.95

没有研究出来对应价格和参数设置,参数作用的差别,原则。

5. buy_bracket 和 sell_bracket

买入组合限价单,卖出组合限价单。

    def next(self):  # 最简单的策略,观察各个属性和方法if self.sma5 > self.sma20:  # buy(data=None, size=None, price=None, plimit=None, exectype=None, valid=None, tradeid=0, oco=None, trailamount=None, trailpercent=None, parent=None, transmit=True, **kwargs)# 设置买入10股,限价为当前价格的105%,止损为当前价格的95%  self.order = self.buy_bracket(  size=10,  # 买入10股  price=self.data.close * 1.05,  # 限价买入,价格为当前收盘价的105%  plimit=self.data.close * 0.95,  # 设置止损为当前收盘价的95%  exectype=bt.Order.Limit  # 限价执行类型  )#print(self.order)else:if self.position.size > 0 :# sell(data=None, size=None, price=None, plimit=None, exectype=None, valid=None, tradeid=0, oco=None, trailamount=None, trailpercent=None, parent=None, transmit=True, **kwargs)# 设置卖出10股,限价为当前价格的95%,止损为当前价格的105%  self.order = self.sell_bracket(  size=10,  # 买入10股  price=self.data.close * 0.95,  # 限价卖出,价格为当前收盘价的95%  plimit=self.data.close * 1.05,  # 设置止损为当前收盘价的105%  exectype=bt.Order.Limit  # 限价执行类型  )self.params.counter += 1        

执行结果:

self.params.counter: 59
Final Portfolio Value: 99735.50

6. close 和getposition

close() 是强制平仓命令
getposition()是获取当前仓位数值
在next中增加相关代码测试:

    def next(self):  # 最简单的策略,观察各个属性和方法if self.sma5 > self.sma20:  self.order = self.buy()  else:if self.position.size > 0 :self.order = self.sell()  # 仓位达到10时强制平仓if self.position.size == 10 :self.order = self.close()pos = self.getposition()print('Now is closing :')print('持仓数量:',pos.size)print('持仓成本单价:',pos.price)print('日期:',pos.datetime.date())print(pos)

执行结果:

Now is closing :
持仓数量: 10
持仓成本单价: 126.75585714285712
日期: 2020-03-12
--- Position Begin
- Size: 10
- Price: 126.75585714285712
- Price orig: 126.74206349206348
- Closed: 0
- Opened: 1
- Adjbase: 126.04
--- Position End
self.params.counter: 59
Final Portfolio Value: 99920.54

执行过程中,仓位增加到10,平仓后继续买入,下一个仓位是1。
在这里插入图片描述

7.学习小结

  • (1)fundvalue
    比如测cash 、value 、fundvalue 三个参数时,没有官网示例解释,对于数值需要推测,比较费时间。开始的时候有stake和comm参数,核对数据关系时,无法找到规律。从简参数默认设置,用Excel找到规律。
    没有理解fund的概念 ,默认fund就是购入股票/份额,自动开始计算基金价值了。通过计算才理解。

  • (2)buy 和 sell
    是关键方法,应该有详细的使用说明,才能准确的使用,应该也是strategy的核心功能,官网示例少。
    通过测试,分析参数作用和交易数据变化,比较困难。网上也找不到比较详细的说明示例。
    同理 buy_bracket / sell_bracket
    原来想通过buy 和 sell 实现灵活的交易,看起来操作起来还是有困难。

  • (3)notify_store
    有的方法,通过字面理解,不知道如何使用或者触发。
    notify_store就不知道msg怎么传出参数信息。
    很困惑。

如果能像pandas的官网介绍操作,丰富的示例,那么方便很多。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/336462.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3:Axios配置及使用

Axios官方 一、安装: //使用 npm: $ npm install axios//使用 bower: $ bower install axios//使用 yarn: $ yarn add axios 在package-lock.json文件可以查看axios版本 二、配置: milliaAxios.js 配置axios import axios from axios // 创建一个 ax…

dubbo与seata集成

1.seata是什么? Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。 2.seata的注解 GlobalTransactional:全局事务注解,添加了以后可实现分布式事务的回滚和提交,用法与spring…

小白兼职做抖店,一个月能做到5000利润吗?抖店现状问题解答

我是王路飞。 全职状态下做抖店的话,精细化操作的单店月利润保守数据在10000-30000(该数据来自醒醒团队内部学员一般水平下月营收数据均值,仅供参考) 但如果是新手小白(没有电商经验),且是兼职…

公众号开发

需求,用户在小程序内识别公众号二维码。打卡公众号点击签到小程序内赠送对应金币。 首先需要在配置公众号基本配置。 对应后端代码 public function gzh(){//获取参数$get_data $this->request->request();$signature $get_data["signature"];$…

python_selenium零基础爬虫学习案例_知网文献信息

案例最终效果说明: 去做这个案例的话是因为看到那个博主的分享,最后通过努力,我基本实现了进行主题、关键词、更新时间的三个筛选条件去获取数据,并且遍历数据将其导出到一个CSV文件中,代码是很简单的,没有…

小红书违禁词判断标准,怎么看有没有敏感词

每个平台为了创造良好的社区环境,都会制定相应的社区管理准则,账号一旦出现违规行为,账号的相关内容会被限流,严重者,不给予展示或封禁。今天来马文化传媒和大家分享下小红书违禁词判断标准,怎么看有没有敏…

参数小,性能强!开源多模态模型—TinyGPT-V

安徽工程大学、南洋理工大学和理海大学的研究人员开源了多模态大模型——TinyGPT-V。 TinyGPT-V以微软开源的Phi-2作为基础大语言模型,同时使用了视觉模型EVA实现多模态能力。尽管TinyGPT-V只有28亿参数,但其性能可以媲美上百亿参数的模型。 此外&…

Element+vue3.0 tabel合并单元格span-method

Elementvue3.0 tabel合并单元格 span-method :span-method"objectSpanMethod"详解: 在 objectSpanMethod 方法中,rowspan 和 colspan 的值通常用来定义单元格的行跨度和列跨度。 一般来说,rowspan 和 colspan 的值应该是大于等于…

LeetCode 94. 二叉树的中序遍历

94. 二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。 示例 1: 输入:root [1,null,2,3] 输出:[1,3,2] 示例 2: 输入:root [] 输出:[] 示例 3: 输入&…

入门实战丨Python小游戏经典案例

文章目录 写在前面判断与循环小游戏猜数游戏龙的世界 写在后面 写在前面 本期内容:两个个简单的Python小游戏入门案例。 实验需求:python 实验目标:掌握基本的判断与循环语句。 判断与循环 判断与循环是编程中非常重要的两个概念&#x…

私域新手必看:这可能是你最快速的入门指南!

一、认知层:为什么必须做私域? 了解这个问题,必须得观察一下中国现状。根据中国互联网络信息中心(CNNIC)发布第48次《中国互联网络发展状况统计报告》显示,截至 2021 年 6 月: 而典型电商平台的…

解决方案|镭速助力汽车行业实现数据高速传输数字化进程

在新一代信息技术驱动的数字经济时代,数据已然成为新型生产要素,是国家基础性资源和战略性资源,在汽车市场全球化背景下,产品、数据跨境、区域协同将成为车企未来常态。 1、数字时代,车企数据管理面临新课题 汽车产业…