Python自动化交易学习笔记(10)——1.添加卖出条件参数配置,2.交易单位大小

Demo10主要介绍如何自定义策略参数。

Demo10主要做了两处修改:

  1. 1
    2
    3
    4
    5
    6
    7
    1.在策略中添加了自定义参数:<br><br>params = (
            ('exitbars', 5),
        )
     
    2.在使用时,可使用self.params.exitbars进行调用: 
     
    if len(self) >= (self.bar_executed + self.params.exitbars):
    2.添加交易单位大小
    1
    2
    # 设置交易单位大小
    cerebro.addsizer(bt.sizers.FixedSize, stake = 100)

      

     

    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
    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())

      

    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/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

     

     

posted @   A汉克先生  阅读(515)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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下载安装
点击右上角即可分享
微信分享提示