Python自动化交易学习笔记(九)——将添加佣金数据,来使回测更逼近与真实交易。
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):
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('Close, %.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 + 5):
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.broker.setcommission(commission=0.001)
# 打印开始信息
print('开始权益: %.2f' % cerebro.broker.getvalue())
# 遍历所有数据
cerebro.run()
# 打印最后结果
print('结束权益: %.2f' % cerebro.broker.getvalue())
**********************************************************
简单一策略:
信号:连续二天收盘收跌;
买入:第三天收盘价开仓;
卖出:买入后第6天;(不管涨跌都卖出)
**********************************************************
前面已经实现了策略的买入和卖出条件,demo9中将添加佣金数据,来使回测更逼近与真实交易。
佣金(commission),在A股就是按照成交价格的百分比付给券商的费用。代码中将佣金率设置为0.1%,无论买还是卖都需要支付佣金。
佣金的设置只需要如下一行代码即可:
1 | cerebro.broker.setcommission(commission = 0.001 ) |
这里对两个概念做一下简单说明:
position用于表示当前的状态,由size和price两个成员属性构成,其中size表示当前持有资产数量,price表示当前价格,比如以5.34的价格买入1股600173
,那么此时position.size=1,position.price=16.90。当把这1股600173卖出时,position.size=0,position.price=0。
trade表示一笔交易,当position.size由0变为X时,表示交易开启,当position.size由X变回0时,表示交易结束。代码中的trade.pnl表示当前这笔交易的在不算佣金的情况下的盈亏情况,trade.pnlcomm表示当前这笔交易的在计算佣金的情况下的盈亏情况,实际上trade.pnlcomm=trade.pnl-佣金。
程序Demo8-加入佣金费:
————————————————
参考:https://blog.csdn.net/m0_46603114/article/details/104972754
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | C:\Python38\python.exe F: / test / src / com / gzh / demo9.py 开始权益: 100000.00 2019 - 10 - 08 , Close, 5.22 2019 - 10 - 09 , Close, 5.27 2019 - 10 - 10 , Close, 5.26 2019 - 10 - 11 , Close, 5.24 2019 - 10 - 11 , 买入, 5.24 2019 - 10 - 14 , 已执行买入, 价格: 5.34 , 成交: 5.34 , 佣金 0.01 2019 - 10 - 14 , Close, 5.23 2019 - 10 - 15 , Close, 5.17 2019 - 10 - 16 , Close, 5.20 2019 - 10 - 17 , Close, 5.25 2019 - 10 - 18 , Close, 5.12 2019 - 10 - 21 , Close, 5.10 2019 - 10 - 21 , 卖出, 5.10 2019 - 10 - 22 , 已执行卖出, 卖出价格: 5.10 , 买入价格: 5.34 , 佣金 0.01 2019 - 10 - 22 , 利润, 赢亏 - 0.24 , 合计(加佣金) - 0.25 2019 - 10 - 22 , Close, 5.25 2019 - 10 - 23 , Close, 5.23 2019 - 10 - 24 , Close, 5.29 2019 - 10 - 25 , Close, 5.29 2019 - 10 - 28 , Close, 5.22 2019 - 10 - 29 , Close, 5.23 2019 - 10 - 30 , Close, 5.17 2019 - 10 - 31 , Close, 5.12 2019 - 10 - 31 , 买入, 5.12 2019 - 11 - 01 , 已执行买入, 价格: 5.12 , 成交: 5.12 , 佣金 0.01 2019 - 11 - 01 , Close, 5.23 2019 - 11 - 04 , Close, 5.24 2019 - 11 - 05 , Close, 5.22 2019 - 11 - 06 , Close, 5.12 2019 - 11 - 07 , Close, 5.15 2019 - 11 - 08 , Close, 5.12 2019 - 11 - 08 , 卖出, 5.12 2019 - 11 - 11 , 已执行卖出, 卖出价格: 5.09 , 买入价格: 5.12 , 佣金 0.01 2019 - 11 - 11 , 利润, 赢亏 - 0.03 , 合计(加佣金) - 0.04 2019 - 11 - 11 , Close, 5.02 2019 - 11 - 11 , 买入, 5.02 2019 - 11 - 12 , 已执行买入, 价格: 5.02 , 成交: 5.02 , 佣金 0.01 2019 - 11 - 12 , Close, 5.02 2019 - 11 - 13 , Close, 5.00 2019 - 11 - 14 , Close, 5.07 2019 - 11 - 15 , Close, 5.00 2019 - 11 - 18 , Close, 4.94 2019 - 11 - 19 , Close, 5.05 2019 - 11 - 19 , 卖出, 5.05 2019 - 11 - 20 , 已执行卖出, 卖出价格: 5.08 , 买入价格: 5.02 , 佣金 0.01 2019 - 11 - 20 , 利润, 赢亏 0.06 , 合计(加佣金) 0.05 2019 - 11 - 20 , Close, 5.07 2019 - 11 - 21 , Close, 5.00 2019 - 11 - 22 , Close, 4.95 2019 - 11 - 22 , 买入, 4.95 2019 - 11 - 25 , 已执行买入, 价格: 4.93 , 成交: 4.93 , 佣金 0.00 2019 - 11 - 25 , Close, 4.98 2019 - 11 - 26 , Close, 4.95 2019 - 11 - 27 , Close, 4.92 2019 - 11 - 28 , Close, 4.89 2019 - 11 - 29 , Close, 4.91 2019 - 12 - 02 , Close, 4.91 2019 - 12 - 02 , 卖出, 4.91 2019 - 12 - 03 , 已执行卖出, 卖出价格: 4.91 , 买入价格: 4.93 , 佣金 0.00 2019 - 12 - 03 , 利润, 赢亏 - 0.02 , 合计(加佣金) - 0.03 2019 - 12 - 03 , Close, 4.95 2019 - 12 - 04 , Close, 4.94 2019 - 12 - 05 , Close, 5.05 2019 - 12 - 06 , Close, 5.10 2019 - 12 - 09 , Close, 5.10 2019 - 12 - 10 , Close, 5.03 2019 - 12 - 11 , Close, 5.06 2019 - 12 - 12 , Close, 5.02 2019 - 12 - 13 , Close, 5.03 2019 - 12 - 16 , Close, 5.01 2019 - 12 - 17 , Close, 5.09 2019 - 12 - 18 , Close, 5.10 2019 - 12 - 19 , Close, 5.06 2019 - 12 - 20 , Close, 5.00 2019 - 12 - 20 , 买入, 5.00 2019 - 12 - 23 , 已执行买入, 价格: 4.98 , 成交: 4.98 , 佣金 0.00 2019 - 12 - 23 , Close, 4.95 2019 - 12 - 24 , Close, 4.98 2019 - 12 - 25 , Close, 5.20 2019 - 12 - 26 , Close, 5.26 2019 - 12 - 27 , Close, 5.16 2019 - 12 - 30 , Close, 5.18 2019 - 12 - 30 , 卖出, 5.18 2019 - 12 - 31 , 已执行卖出, 卖出价格: 5.20 , 买入价格: 4.98 , 佣金 0.01 2019 - 12 - 31 , 利润, 赢亏 0.22 , 合计(加佣金) 0.21 2019 - 12 - 31 , Close, 5.21 2020 - 01 - 02 , Close, 5.21 2020 - 01 - 03 , Close, 5.27 2020 - 01 - 06 , Close, 5.23 2020 - 01 - 07 , Close, 5.22 2020 - 01 - 07 , 买入, 5.22 2020 - 01 - 08 , 已执行买入, 价格: 5.20 , 成交: 5.20 , 佣金 0.01 2020 - 01 - 08 , Close, 5.08 2020 - 01 - 09 , Close, 5.24 2020 - 01 - 10 , Close, 5.21 2020 - 01 - 13 , Close, 5.21 2020 - 01 - 14 , Close, 5.17 2020 - 01 - 15 , Close, 5.11 2020 - 01 - 15 , 卖出, 5.11 2020 - 01 - 16 , 已执行卖出, 卖出价格: 5.11 , 买入价格: 5.20 , 佣金 0.01 2020 - 01 - 16 , 利润, 赢亏 - 0.09 , 合计(加佣金) - 0.10 2020 - 01 - 16 , Close, 5.06 2020 - 01 - 16 , 买入, 5.06 2020 - 01 - 17 , 已执行买入, 价格: 5.07 , 成交: 5.07 , 佣金 0.01 2020 - 01 - 17 , Close, 5.01 2020 - 01 - 20 , Close, 4.99 2020 - 01 - 21 , Close, 4.99 2020 - 01 - 22 , Close, 4.99 2020 - 01 - 23 , Close, 4.88 2020 - 02 - 03 , Close, 4.39 2020 - 02 - 03 , 卖出, 4.39 2020 - 02 - 04 , 已执行卖出, 卖出价格: 4.22 , 买入价格: 5.07 , 佣金 0.00 2020 - 02 - 04 , 利润, 赢亏 - 0.85 , 合计(加佣金) - 0.86 2020 - 02 - 04 , Close, 4.43 2020 - 02 - 05 , Close, 4.43 2020 - 02 - 06 , Close, 4.66 2020 - 02 - 07 , Close, 4.73 2020 - 02 - 10 , Close, 4.72 2020 - 02 - 11 , Close, 4.70 2020 - 02 - 11 , 买入, 4.70 2020 - 02 - 12 , 已执行买入, 价格: 4.70 , 成交: 4.70 , 佣金 0.00 2020 - 02 - 12 , Close, 4.77 2020 - 02 - 13 , Close, 4.68 2020 - 02 - 14 , Close, 4.66 2020 - 02 - 17 , Close, 4.75 2020 - 02 - 18 , Close, 4.67 2020 - 02 - 19 , Close, 4.64 2020 - 02 - 19 , 卖出, 4.64 2020 - 02 - 20 , 已执行卖出, 卖出价格: 4.64 , 买入价格: 4.70 , 佣金 0.00 2020 - 02 - 20 , 利润, 赢亏 - 0.06 , 合计(加佣金) - 0.07 2020 - 02 - 20 , Close, 4.66 2020 - 02 - 21 , Close, 4.77 2020 - 02 - 24 , Close, 4.70 2020 - 02 - 25 , Close, 4.73 2020 - 02 - 26 , Close, 4.85 2020 - 02 - 27 , Close, 4.86 2020 - 02 - 28 , Close, 4.84 结束权益: 99998.91 Process finished with exit code 0 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2019-06-18 git下载安装