通用先引用乌云压顶的K线形态,定义以及理论意义:

K线卖出口诀:乌云压顶,卖出要紧

这里讲的“乌云”,是指股价上升到高位后,某日出现一条高开低走的大阴线,罩在前面一条阳线的头上,称之为“乌云压顶”。该形态的出现,表明获利盘在回吐筹码,股价将会出现一段下调行情,应卖出股票。

乌云压顶形态又称乌云线形态,是K线图较为常见顶部转形态图表之一。这种形态由两根K线组成,它们一般出现在上升趋势之后,在有些情况下也可能出现在水平调整区间的顶部。

乌云压顶(Dark-Cloud Cover)经常发生在一段上升行情的顶部,由一阴一阳两根K线组成,阴线在阳线收盘价之上开盘,在阳线实体内收盘,形成乌云盖顶之势,显示行情走软,阳线实体被阴线覆盖的越多,表明买气越弱,空方攻击力度越大。

以上的定义来自:K线卖出口诀:乌云压顶,卖出要紧

笔者基于上述的理论,定义出策略:出现底部十字星全仓买入,出现乌云压顶,全仓卖出

先上代码:

import tushare as ts
import pandas as pd

import datetime  # For datetime objects
import os.path  # To manage paths
import sys  # To find out the script name (in argv[0])
# Import the backtrader platform
import backtrader as bt
import talib as talib
import numpy as np

class MyStrategy(bt.Strategy):
    # 策略参数
    params = dict(
        printlog=False
    )

def __init__(self):
        self.star = dict()
        self.cloudcover = dict()
        # 定义全局变量
        self.count = 0
        for data in self.datas:
            # 转为tabib要求的数据格式
            opens = np.array(data.open.array)
            highs = np.array(data.high.array)
            lows = np.array(data.low.array)
            closes = np.array(data.close.array)
            print(opens)
            # 计算十字星数据,结果为-100底部十字星,结果为100顶部十字星,0非十字星
            res = talib.CDLDOJISTAR(opens, highs, lows, closes)
            # 乌云盖顶形态
            cloudcover = talib.CDLDARKCLOUDCOVER(opens, highs, lows, closes)
            # 数据放入self中
            print('十字星数据')
            self.star[data._id] = res
            print('乌云盖顶数据')
            self.cloudcover[data._id] = cloudcover

def next(self):
        # 得到当前的账户价值
        total_value = self.broker.getcash()
        for data in self.datas:
            pos = self.getposition(data).size
            # 函数出现100就代表出现十字星形态,做买入
            if total_value > 0 and self.star[data._id][self.count] == -100:
                p_value = total_value * 0.9 / 10
                size = ((int(total_value / self.data.close[0]))) - ((int(total_value / self.data.close[0])) % 100) - 100
                if(size > 100 ):
                    self.buy(data=data, size=size)
                    print('出现底部十字星,全仓买入,买入数量' + str(size) )

if pos > 0 and self.cloudcover[data._id][self.count] == 100 or self.cloudcover[data._id][self.count] == -100:
                 # 全部卖出
                 # 跟踪订单避免重复
                 self.sell(data=data, size=pos)
                 print('出现乌云盖顶,卖出数量' + str(pos))

#自增处理
        self.count = self.count + 1

def log(self, txt, dt=None, doprint=False):
        if self.params.printlog or doprint:
            dt = dt or self.datas[0].datetime.date(0)
            print(f'{dt.isoformat()},{txt}')

# 记录交易执行情况(可省略,默认不输出结果)
    def notify_order(self, order):
        # 如果order为submitted/accepted,返回空
        if order.status in [order.Submitted, order.Accepted]:
            return
        # 如果order为buy/sell executed,报告价格结果
        if order.status in [order.Completed]:
            if order.isbuy():
                self.log(f'买入:\n价格:{order.executed.price:.2f},\
                成本:{order.executed.value:.2f},\
                数量:{order.executed.size:.2f},\
                手续费:{order.executed.comm:.2f}')
                self.buyprice = order.executed.price
                self.buycomm = order.executed.comm
            else:
                self.log(f'卖出:\n价格:{order.executed.price:.2f},\
                成本: {order.executed.value:.2f},\
                数量:{order.executed.size:.2f},\
                手续费{order.executed.comm:.2f}')
            self.bar_executed = len(self)
            # 如果指令取消/交易失败, 报告结果
        elif order.status in [order.Canceled, order.Margin, order.Rejected]:
            self.log('交易失败')
        self.order = None

# 记录交易收益情况(可省略,默认不输出结果)
    def notify_trade(self, trade):
        if not trade.isclosed:
            return
        self.log(f'策略收益:\n毛收益 {trade.pnl:.2f}, 净收益 {trade.pnlcomm:.2f}')

pro = ts.pro_api('cbb257058b7cb228769b4949437c27c27e5132e882747dc80f01a5a5')

def ts_get_daily_stock(code, start_dt, end_dt):
    start_dt = start_dt.replace("'", "", 3);
    end_dt = end_dt.replace("'", "", 3);
    # start_dt = '20190101'
    # end_dt=''
    print(code, start_dt, end_dt)
    data = pro.daily(ts_code=code, start_date=start_dt, end_date=end_dt)
    data['trade_date'] = pd.to_datetime(data['trade_date'])
    data['trade_date'] = pd.to_datetime(data['trade_date'])
    data = data.sort_values(by='trade_date')
    data.index = data['trade_date']
    data['openinterest'] = 0
    data['volume'] = data['vol']
    data = data[
        ['open', 'close', 'high', 'low', 'volume']
    ]
    return data

# 读取选股的结果

df = pd.read_csv('stock_alpha.csv')
df.columns = ['ts_code', 'name', 'alpha', 'start_dt', 'end_dt']
min_a = df.sort_values(by='alpha')
min_a = min_a.iloc[:10, :]

code = []
code = min_a['ts_code']  # 股票代码

start_dts = []
start_dts = min_a['start_dt']  # 股票代码起始时间

end_dts = []
end_dts = min_a['end_dt']  # 股票代码结束时间

for i in range(len(code)):
    data = ts_get_daily_stock(code.iloc[i], start_dts.iloc[i], end_dts.iloc[i])  # 字段分别为股票代码、开始日期、结束日期
    data.to_csv(code.iloc[i] + '.csv')

cerebro = bt.Cerebro()
for i in range(len(code)):  # 循环获取股票历史数据
    dataframe = pd.read_csv(code.iloc[i] + '.csv', index_col=0, parse_dates=True)
    dataframe['openinterest'] = 0
    data = bt.feeds.PandasData(dataname=dataframe,
                               fromdate=datetime.datetime(2008, 2, 20),
                               todate=datetime.datetime(2022, 4, 5)
                               )
cerebro.adddata(data)

# 回测设置
startcash = 100000.0
cerebro.broker.setcash(startcash)
# 设置佣金为千分之一
cerebro.broker.setcommission(commission=0.001)
# 添加策略
cerebro.addstrategy(MyStrategy, printlog=True)
cerebro.run()
# 获取回测结束后的总资金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
# 打印结果
print(f'总资金: {round(portvalue,2)}')
print(f'净收益: {round(pnl,2)}')

cerebro.plot()

回测结果

总资金: 93905.92
净收益: -6094.08

笔者回测的数据依旧是中国国航的数据,结果是亏损的。

本章节和上一章节的内容差异不大,只是引入了一个新的乌云盖顶形态函数:

talib.CDLDARKCLOUDCOVER(opens, highs, lows, closes)

结果还是100或者-100

量化交易10-backtrader回测乌云盖顶K线形态图相关推荐

  1. 量化交易如何进行回测+模拟+实盘?包括哪些回测框架?

    大家在进行实盘交易前,必须对量化交易策略进行回测和模拟,以确定策略是否有效,并进行改进和优化.作为一般人而言,你能想到的,一般都有人做过了.回测框架也如此.当前小白看到的主要有如下五个回测框架: 1. ...

  2. 量化交易12-backtrader回测三日定律K线形态图

    三日定律: 三日定律其实是来源与乔治·道格拉斯·泰勒的"预约法",在后来它就被演变成了LSS三日周期法.泰勒说,市场波动最开始就是从内部开始驱动的,有内部消息者或者聪明人最先买进, ...

  3. 量化交易9-backtrader回测十字星K线形态图

    十字星形态图,在股市中的应用: 十字星是一种K线基本型态.十字星,是一种只有上下影线,没有实体的K线图.开盘价即是收盘价,表示在交易中,股价出现高于或低于开盘价成交,但收盘价与开盘价相等.其中:上影线 ...

  4. 数据分析师1.4量化交易策略的回测方法和技巧

    1.具体流程 1.利用Python编写好策略,选择选好的股票池. 2.设置开始和结束的时间点,然后设定资金池 3.通过股票池和日期获得股票数据,然后按照设定的间隔,比如每天/每 分钟调用回测函数. 4 ...

  5. 量化交易-Backtrader回测

    目录 一.基础篇-backtrader简介 二.backtrader回测应用实例 三.backtrader数据全解析 3.1 数据中必须包含 3.2 一切皆是数据源 3.3 参数 3.4 Lines线 ...

  6. 量化策略——准备3 数据、Backtrader回测框架与quantstats评价指标

    我们一般使用AKShare这个库来获取股票数据或策略中用得到的数据: AKShare github主页:https://github.com/akfamily/akshare 使用Backtrader ...

  7. A股月份效应的研究——基于python量化视角(backtrader回测)

    A股月份效应的研究 前言 <易经>早就揭示出:物极必反,盛极必衰! 阴阳总是不断交替的.股票市场也一样,涨跌互现,涨多了会出现调整,跌多了会出现反弹,因此我们看到K线组合总是红(阳)绿(阴 ...

  8. backtrader回测框架实例

    backtrader是基于Python的量化回测框架,功能丰富,操作方便.其优点是运行速度快,支持pandas的矢量运算:内置多种技术指标计算,还支持股票分析技术指标库talib:支持参数自动寻优运算 ...

  9. 11、【股票策略】用backtrader回测在A股上复利年化收益率超20%的“狗股策略”?

    11.用backtrader回测在A股上复利年化收益率超20%的"狗股策略"? 更进一步的回测代码可以参考版本4:[股票策略]使用backtrader测试狗股策略版本4-在版本3的 ...

  10. 干货全拿走-用ExcelVBA做个股多模型交叉验证择时交易套利及回测系统

    之前分不同的模块做了多个基于Excel的股票量化模型,具体可以看这篇文章: https://blog.csdn.net/m0_64899365/article/details/126921893?sp ...

最新文章

  1. 动漫风格迁移 AnimeGANv2 ,发布线上运行 Demo
  2. easyui展示年月
  3. 强大自己,从学习开始!2020年最有内容的订阅号,每一个都是万里挑一!
  4. Linux下用gSOAP开发Web Service服务端和客户端程序(一)
  5. Convolutional Neural Networks卷积神经网络
  6. GAN生成对抗网络-SSGAN原理与基本实现-半监督学习GAN-08
  7. linux ejb远程调用,[转载]在容器外使用EJB 3.0 Persistence
  8. if的作用域问题 *输出1~6的随机数*
  9. Android Studio快捷键(MAC版)
  10. java 线程状态_Java线程的状态
  11. R语言ETL工程系列:R语言基础设置
  12. vi/vim编辑器使用方法详解
  13. ADMM算法求解一个简单的例子
  14. matlab 实现同态滤波算法 并于直方均衡化相比较 看看谁的效果更好
  15. 数学建模系列-预测模型(一)---神经网络模型
  16. c# RoundUp函数
  17. python画运动物体的轨迹_canvas动画—圆形扩散、运动轨迹
  18. 苹果手机如何深度清理_苹果手机还可以这样清理垃圾,怪不得用这么久还流畅如丝...
  19. Notepad++的JsonViewer 插件安装失败的解决
  20. 万向和肖风的区块链版图

热门文章

  1. 一个投标经理的标书检查笔记,拿来就用!
  2. 无法使用密钥激活Parallels Desktop 9 for Mac
  3. HBase shell删除表失败:ERROR: Table user is enabled. Disable it first.
  4. 独家策划-----让“超女”和“好男”联姻
  5. microchip-01 MPLAB IDE安装
  6. ide-eval-resetter
  7. 帆软报表填报之内置数据自定义表、数据连接、服务器数据集配置
  8. 电脑小白快来!这有电脑常见故障解决方法
  9. Jieba中文分词 (二) ——词性标注与关键词提取
  10. Python数据分析入门教程(五):数据运算