Python自動化交易學習筆記(10)——1.新增賣出條件引數配置,2.交易單位大小
阿新 • • 發佈:2021-06-18
Demo10主要介紹如何自定義策略引數。
Demo10主要做了兩處修改:
-
1.在策略中添加了自定義引數:
2.新增交易單位大小
params = ( ('exitbars', 5), ) 2.在使用時,可使用self.params.exitbars進行呼叫: if len(self) >= (self.bar_executed + self.params.exitbars):# 設定交易單位大小 cerebro.addsizer(bt.sizers.FixedSize, stake = 100)
from __future__ import (absolute_import, division, print_function, unicode_literals) import datetime # 用於datetime物件操作 import os.path # 用於管理路徑 import sys # 用於在argvTo[0]中找到指令碼名稱 import backtrader as bt # 引入backtrader框架 # 建立策略 class TestStrategy(bt.Strategy): params = ( ('exitbars', 5), ) def log(self, txt, dt=None): ''' 策略的日誌函式''' dt = dt or self.datas[0].datetime.date(0) print('%s, %s' % (dt.isoformat(), txt)) def __init__(self): # 引用data[0]資料的收盤價資料 self.dataclose = self.datas[0].close # 用於記錄訂單狀態 self.order = None self.buyprice = None self.buycomm = None def notify_order(self, order): if order.status in [order.Submitted, order.Accepted]: # 提交給代理或者由代理接收的買/賣訂單 - 不做操作 return # 檢查訂單是否執行完畢 # 注意:如果沒有足夠資金,代理會拒絕訂單 if order.status in [order.Completed]: if order.isbuy(): self.log( '買入執行, 價格: %.2f, 成交金額: %.2f, 佣金 %.2f' % (order.executed.price, order.executed.value, order.executed.comm)) self.buyprice = order.executed.price self.buycomm = order.executed.comm else: # 賣 self.log('賣出執行, 價格: %.2f, 買入成交金額: %.2f, 佣金 %.2f' % (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 self.log('權益, 贏虧 %.2f, 總贏虧(含佣金) %.2f' % (trade.pnl, trade.pnlcomm)) def next(self): # 日誌輸出收盤價資料 self.log('收盤價, %.2f' % self.dataclose[0]) # 檢查是否有訂單等待處理,如果是就不再進行其他下單 if self.order: return # 檢查是否已經進場 if not self.position: # 還未進場,則只能進行買入 # 當日收盤價小於前一日收盤價 if self.dataclose[0] < self.dataclose[-1]: # 前一日收盤價小於前前日收盤價 if self.dataclose[-1] < self.dataclose[-2]: # 買買買 self.log('買入訊號, %.2f' % self.dataclose[0]) # 記錄訂單避免二次下單 self.order = self.buy() # 如果已經在場內,則可以進行賣出操作 else: # 賣賣賣 if len(self) >= (self.bar_executed + self.params.exitbars): self.log('賣出訊號, %.2f' % self.dataclose[0]) # 記錄訂單避免二次下單 self.order = self.sell() # 建立cerebro實體 cerebro = bt.Cerebro() # 新增策略 cerebro.addstrategy(TestStrategy) # 先找到指令碼的位置,然後根據指令碼與資料的相對路徑關係找到資料位置 # 這樣指令碼從任意地方被呼叫,都可以正確地訪問到資料 modpath = os.path.dirname(os.path.abspath(sys.argv[0])) datapath = os.path.join(modpath, 'F:/GZH/自動化交易/歷史資料/sh.600173history_k_data2021-12-31-2021-12-31.csv') # 建立價格資料 data = bt.feeds.GenericCSVData( dataname = datapath, fromdate = datetime.datetime(2019, 10, 1), todate = datetime.datetime(2020, 2, 29), nullvalue = 0.0, dtformat = ('%Y/%m/%d'), datetime = 0, open = 1, high = 2, low = 3, close = 4, volume = 5, openinterest = -1 ) # 在Cerebro中添加價格資料 cerebro.adddata(data) # 設定啟動資金 cerebro.broker.setcash(100000.0) # 設定交易單位大小 cerebro.addsizer(bt.sizers.FixedSize, stake = 100) # 設定佣金為千分之一 cerebro.broker.setcommission(commission=0.001) # 列印開始資訊 print('開始權益: %.2f' % cerebro.broker.getvalue()) # 遍歷所有資料 cerebro.run() # 列印最後結果 print('最終權益: %.2f' % cerebro.broker.getvalue())
C:\Python38\python.exe F:/test/src/com/gzh/demo10.py 開始權益: 100000.00 2019-10-08, 收盤價, 5.22 2019-10-09, 收盤價, 5.27 2019-10-10, 收盤價, 5.26 2019-10-11, 收盤價, 5.24 2019-10-11, 買入訊號, 5.24 2019-10-14, 買入執行, 價格: 5.34, 成交金額: 534.00, 佣金 0.53 2019-10-14, 收盤價, 5.23 2019-10-15, 收盤價, 5.17 2019-10-16, 收盤價, 5.20 2019-10-17, 收盤價, 5.25 2019-10-18, 收盤價, 5.12 2019-10-21, 收盤價, 5.10 2019-10-21, 賣出訊號, 5.10 2019-10-22, 賣出執行, 價格: 5.10, 買入成交金額: 534.00, 佣金 0.51 2019-10-22, 權益, 贏虧 -24.00, 總贏虧(含佣金) -25.04 2019-10-22, 收盤價, 5.25 2019-10-23, 收盤價, 5.23 2019-10-24, 收盤價, 5.29 2019-10-25, 收盤價, 5.29 2019-10-28, 收盤價, 5.22 2019-10-29, 收盤價, 5.23 2019-10-30, 收盤價, 5.17 2019-10-31, 收盤價, 5.12 2019-10-31, 買入訊號, 5.12 2019-11-01, 買入執行, 價格: 5.12, 成交金額: 512.00, 佣金 0.51 2019-11-01, 收盤價, 5.23 2019-11-04, 收盤價, 5.24 2019-11-05, 收盤價, 5.22 2019-11-06, 收盤價, 5.12 2019-11-07, 收盤價, 5.15 2019-11-08, 收盤價, 5.12 2019-11-08, 賣出訊號, 5.12 2019-11-11, 賣出執行, 價格: 5.09, 買入成交金額: 512.00, 佣金 0.51 2019-11-11, 權益, 贏虧 -3.00, 總贏虧(含佣金) -4.02 2019-11-11, 收盤價, 5.02 2019-11-11, 買入訊號, 5.02 2019-11-12, 買入執行, 價格: 5.02, 成交金額: 502.00, 佣金 0.50 2019-11-12, 收盤價, 5.02 2019-11-13, 收盤價, 5.00 2019-11-14, 收盤價, 5.07 2019-11-15, 收盤價, 5.00 2019-11-18, 收盤價, 4.94 2019-11-19, 收盤價, 5.05 2019-11-19, 賣出訊號, 5.05 2019-11-20, 賣出執行, 價格: 5.08, 買入成交金額: 502.00, 佣金 0.51 2019-11-20, 權益, 贏虧 6.00, 總贏虧(含佣金) 4.99 2019-11-20, 收盤價, 5.07 2019-11-21, 收盤價, 5.00 2019-11-22, 收盤價, 4.95 2019-11-22, 買入訊號, 4.95 2019-11-25, 買入執行, 價格: 4.93, 成交金額: 493.00, 佣金 0.49 2019-11-25, 收盤價, 4.98 2019-11-26, 收盤價, 4.95 2019-11-27, 收盤價, 4.92 2019-11-28, 收盤價, 4.89 2019-11-29, 收盤價, 4.91 2019-12-02, 收盤價, 4.91 2019-12-02, 賣出訊號, 4.91 2019-12-03, 賣出執行, 價格: 4.91, 買入成交金額: 493.00, 佣金 0.49 2019-12-03, 權益, 贏虧 -2.00, 總贏虧(含佣金) -2.98 2019-12-03, 收盤價, 4.95 2019-12-04, 收盤價, 4.94 2019-12-05, 收盤價, 5.05 2019-12-06, 收盤價, 5.10 2019-12-09, 收盤價, 5.10 2019-12-10, 收盤價, 5.03 2019-12-11, 收盤價, 5.06 2019-12-12, 收盤價, 5.02 2019-12-13, 收盤價, 5.03 2019-12-16, 收盤價, 5.01 2019-12-17, 收盤價, 5.09 2019-12-18, 收盤價, 5.10 2019-12-19, 收盤價, 5.06 2019-12-20, 收盤價, 5.00 2019-12-20, 買入訊號, 5.00 2019-12-23, 買入執行, 價格: 4.98, 成交金額: 498.00, 佣金 0.50 2019-12-23, 收盤價, 4.95 2019-12-24, 收盤價, 4.98 2019-12-25, 收盤價, 5.20 2019-12-26, 收盤價, 5.26 2019-12-27, 收盤價, 5.16 2019-12-30, 收盤價, 5.18 2019-12-30, 賣出訊號, 5.18 2019-12-31, 賣出執行, 價格: 5.20, 買入成交金額: 498.00, 佣金 0.52 2019-12-31, 權益, 贏虧 22.00, 總贏虧(含佣金) 20.98 2019-12-31, 收盤價, 5.21 2020-01-02, 收盤價, 5.21 2020-01-03, 收盤價, 5.27 2020-01-06, 收盤價, 5.23 2020-01-07, 收盤價, 5.22 2020-01-07, 買入訊號, 5.22 2020-01-08, 買入執行, 價格: 5.20, 成交金額: 520.00, 佣金 0.52 2020-01-08, 收盤價, 5.08 2020-01-09, 收盤價, 5.24 2020-01-10, 收盤價, 5.21 2020-01-13, 收盤價, 5.21 2020-01-14, 收盤價, 5.17 2020-01-15, 收盤價, 5.11 2020-01-15, 賣出訊號, 5.11 2020-01-16, 賣出執行, 價格: 5.11, 買入成交金額: 520.00, 佣金 0.51 2020-01-16, 權益, 贏虧 -9.00, 總贏虧(含佣金) -10.03 2020-01-16, 收盤價, 5.06 2020-01-16, 買入訊號, 5.06 2020-01-17, 買入執行, 價格: 5.07, 成交金額: 507.00, 佣金 0.51 2020-01-17, 收盤價, 5.01 2020-01-20, 收盤價, 4.99 2020-01-21, 收盤價, 4.99 2020-01-22, 收盤價, 4.99 2020-01-23, 收盤價, 4.88 2020-02-03, 收盤價, 4.39 2020-02-03, 賣出訊號, 4.39 2020-02-04, 賣出執行, 價格: 4.22, 買入成交金額: 507.00, 佣金 0.42 2020-02-04, 權益, 贏虧 -85.00, 總贏虧(含佣金) -85.93 2020-02-04, 收盤價, 4.43 2020-02-05, 收盤價, 4.43 2020-02-06, 收盤價, 4.66 2020-02-07, 收盤價, 4.73 2020-02-10, 收盤價, 4.72 2020-02-11, 收盤價, 4.70 2020-02-11, 買入訊號, 4.70 2020-02-12, 買入執行, 價格: 4.70, 成交金額: 470.00, 佣金 0.47 2020-02-12, 收盤價, 4.77 2020-02-13, 收盤價, 4.68 2020-02-14, 收盤價, 4.66 2020-02-17, 收盤價, 4.75 2020-02-18, 收盤價, 4.67 2020-02-19, 收盤價, 4.64 2020-02-19, 賣出訊號, 4.64 2020-02-20, 賣出執行, 價格: 4.64, 買入成交金額: 470.00, 佣金 0.46 2020-02-20, 權益, 贏虧 -6.00, 總贏虧(含佣金) -6.93 2020-02-20, 收盤價, 4.66 2020-02-21, 收盤價, 4.77 2020-02-24, 收盤價, 4.70 2020-02-25, 收盤價, 4.73 2020-02-26, 收盤價, 4.85 2020-02-27, 收盤價, 4.86 2020-02-28, 收盤價, 4.84 最終權益: 99891.03 Process finished with exit code 0