添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

想要将深度学习算法应用于回测过程中,通过查阅资料,发现需要实现自定义技术指标(Indicator)。本文先实现一个简单的自定义指标,为后续深度学习的应用做个铺垫。

本文示例策略的买入条件为均线(选取10日线)向上,收阴线,且收盘价在均线上方。卖出条件为笔记(二十)中阐述的保护点卖出策略。

回测初始资金100000元,单笔操作单位1000股,佣金千分之一,回测时间自2018年1月1日至2020年3月20日。

自定义指标代码如下:

class NegativeIndicator(bt.Indicator):
    lines = ('buy_sig',)
    params = (('ma_period', 10), ('up_period', 3))
    def __init__(self):
        self.addminperiod(self.p.ma_period)
        ma = bt.ind.SMA(period = self.p.ma_period, plot = True)
        # 买入条件
        # 收阴线
        self.l.buy_sig = bt.And(self.data.close < self.data.open,
        # 收在均线上方
        self.data.close > ma,
        # 均线向上
        ma == bt.ind.Highest(ma, period = self.p.up_period)

这里的自定义指标继承于backtrader的Indicator类,类内包含一个名为buy_sig的lines对象。参数ma_period用于控制选择哪条均线,up_period用于控制判断均线向上的周期。

要注意的是在__init__方法里所用到的指标都是lines对象,是一系列数值的组合。如果指标的计算挪到next方法里,那么要在指标后加上下标[0]来计算,这是由于next方法里的指标应为单个的数值。

策略类也相对简单,主要是在__init__方法中引入自定义的指标:

    def __init__(self):
        # 买入条件
        self.buy_sig = NegativeIndicator().buy_sig
        # 为了在最后图表中显示均线
        bt.ind.SMA(period = NegativeIndicator().p.ma_period)
        self.order = None

回测000001后的最终资产为101893.73元。
在这里插入图片描述
回测000002后的最终资产为98094.33元。
在这里插入图片描述
回测601318后的最终资产为87259.10元。
在这里插入图片描述

友情提示:本系列学习笔记只做数据分析,记录个人学习过程,不作为交易依据,盈亏自负。

自定义Indicator代码:

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 NegativeIndicator(bt.Indicator):
    lines = ('buy_sig',)
    params = (('ma_period', 10), ('up_period', 3))
    def __init__(self):
        self.addminperiod(self.p.ma_period)
        ma = bt.ind.SMA(period = self.p.ma_period, plot = True)
        # 买入条件
        # 收阴线
        self.l.buy_sig = bt.And(self.data.close < self.data.open,
        # 收在均线上方
        self.data.close > ma,
        # 均线向上
        ma == bt.ind.Highest(ma, period = self.p.up_period)
# 创建策略
class St(bt.Strategy):
    params = dict(
        stoptype=bt.Order.StopTrail,
        trailamount=0.0,
        trailpercent=0.05,
    def __init__(self):
        # 买入条件
        self.buy_sig = NegativeIndicator().buy_sig
        # 为了在最后图表中显示均线
        bt.ind.SMA(period = NegativeIndicator().p.ma_period)
        self.order = None
    def notify_order(self, order):
        if order.status in [order.Completed, order.Expired]:
            self.order = None
    def next(self):
        # 无场内资产
        if not self.position:
            # 未提交买单
            if None == self.order:
                # 到达了买入条件
                if self.buy_sig:
                    self.order = self.buy()
        elif self.order is None:
            # 提交stoptrail订单
            self.order = self.sell(exectype=self.p.stoptype,
                                   trailamount=self.p.trailamount,
                                   trailpercent=self.p.trailpercent)
cerebro = bt.Cerebro()  # 创建cerebro
# 先找到脚本的位置,然后根据脚本与数据的相对路径关系找到数据位置
# 这样脚本从任意地方被调用,都可以正确地访问到数据
modpath = os.path.dirname(os.path.abspath(sys.argv[0]))
datapath = os.path.join(modpath, '../TQDat/day/stk/000001.csv')
# 创建价格数据
data = bt.feeds.GenericCSVData(
        dataname = datapath,
        fromdate = datetime.datetime(2018, 1, 1),
        todate = datetime.datetime(2020, 3, 31),
        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 = 1000)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission=0.001)
cerebro.addstrategy(St)  # 添加策略
cerebro.run()  # 遍历所有数据
# 打印最后结果
print('Final Portfolio Value: %.2f' % cerebro.broker.getvalue())
cerebro.plot(style = 'candlestick')  # 绘图

为了便于相互交流学习,新建了微信群,感兴趣的读者请加微信。
在这里插入图片描述

本文主要记录保护点卖出策略,给买入的股票设立保护点,随着股票收盘价的提升,保护点不断提高,股价一旦跌破保护点,即卖出股票。 示例的买入条件为,5日线金叉60日线,且股价进行小幅回踩(较金叉日收盘价下跌1%)。卖出条件为,股价跌破保护点。保护点首先设置为买入当天收盘价减去一个资金回撤值(率),示例把回撤率设置为5%。后续如果股票的收盘价上升,则用新的收盘价更新保护点,如果股票的收盘价下跌,则保留原有保护点。回测初始资金100000元,单笔操作单位1000股,佣金千分之一,回测时间自2018年1月1日至2020年3月20日。 策略核心代码位于策略类的next方法中: def next(se
# @Time : 2020/5/23 13:01 # @File : gpb_backtrade.py # @Software: PyCharm # @desc : from datetime import datetime import pandas as pd import backtrader as bt
一、核心组件 (1)数据加载(Data Feed):将交易策略的数据加载到回测框架中。 (2)交易策略(Strategy) strategy.py:该模块是编程过程中最复杂的部分,需要设计交易决策,得出买入/卖出信号。 (3)回测框架设置( Cerebro)cerebro.py:需要设置(i)初始资金(ii)佣金(iii)数据馈送(iv)交易策略(v)交易头寸大小。 (4)运行回测:运行Cerebro回测并打印出所有已执行的交易。 (5)评估性能(Analyzers):以图形和风险收益等指标对交易策略的回测
上篇文章记录了因子扩展的过程,这篇文章利用这些因子,来演示如何实现特定选股规则准确率的判断。本文代码主要实现以下功能: 通过遍历历史数据,实现某个选股规则下,N日内收益M%的准确率判断(例如10日内收益超过6%)。 记录符合选股规则的个股及日期,并分为正负样本分别保存为文件,便于后续分析。正样本是指,在当前规则下,N日内能收益M%的某次选股;负样本是指,在当前规则下,N日内未能收益M%的某次选股。 对所有选股的最大收益进行图形化显示。 持股2周(10个交易日),收益6% # 持股天数
在完成指标计算之后,我们就可以写程序遍历所有股票数据,来筛选出满足条件股票了。 在笔记(14)中,我们看到在几组回测实验中,选取5日线及60日线的金叉买入、死叉卖出策略,最终能获取最高(仅限于几组实验数据)的资产。本文将尝试选取出前一日5日线金叉60日线的股票。 实验数据截止至2020年3月20日,即我们的策略要选取截止至2020年3月20日,最新的两根K线出现5日线金叉60日线的股票,相关代码为: # 判断金叉 def golden_crossover(df, fast, slow): # K线数目不足,次新股 if df.shape[0] df[slow_indicato
安装backtrader:pip install backtrader 官方backtrader文档:https://www.backtrader.com/docu/quickstart/quickstart.html#our-first-strategy  作为backtrader的第一个教学代码,我不想像其...