量化交易12-backtrader回测三日定律K线形态图
三日定律:
三日定律其实是来源与乔治·道格拉斯·泰勒的“预约法”,在后来它就被演变成了LSS三日周期法。泰勒说,市场波动最开始就是从内部开始驱动的,有内部消息者或者聪明人最先买进,逐步带动了市场的上扬后,到了第三天的话,市场走势虽然还是在向上运行,但是聪明的投资者已经开始趁势卖出兑现了,这其实就是泰勒定义的真个市场波动程序。
通常一只股票出现了连续上天相同的走势,第一天会哟与市场里先知先觉的玩家所发动的,而后知后觉的人会在第二天进行跟进,然而到了第三天的话,连哪些原本不知不觉的人都开始经常了,显然这就已经说明了走势接近尾声了。这其实也就是股市中的常说的那句俗语“三天不追涨,五天不杀跌。”“三日没有新高现,只卖不买没商量”的缘由。
K线形态引用自:http://www.yingjia360.com/kxtj/2017-12-21/41751.html
照着上面的理论, 笔者的理解为,股市砖家认为,三天的连续的走势,到了第四天会反转,得出策略:上涨三日卖出,下跌三日买入
上代码:
#出现三日定律,全仓买入,全仓卖出
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.cdl3inside = 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)
# 三日定律形态
cdl3insideRes = talib.CDL3INSIDE(opens, highs, lows, closes)
# 数据放入self中
print('三日定律,100是三天连续上涨,-100是三天连续下跌')
print(cdl3insideRes)
self.cdl3inside[data._id] = cdl3insideRes
def next(self):
# 得到当前的账户价值
total_value = self.broker.getcash()
for data in self.datas:
pos = self.getposition(data).size
# 三日连跌
if total_value > 0 and self.cdl3inside[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.cdl3inside[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(2020, 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()
执行结论:
总资金: 128617.2
净收益: 28617.2
数据源同上一章
三日定律函数:
talib.CDL3INSIDE(opens, highs, lows, closes)
-100三天连跌
100三天连涨
量化交易12-backtrader回测三日定律K线形态图相关推荐
- 量化交易如何进行回测+模拟+实盘?包括哪些回测框架?
大家在进行实盘交易前,必须对量化交易策略进行回测和模拟,以确定策略是否有效,并进行改进和优化.作为一般人而言,你能想到的,一般都有人做过了.回测框架也如此.当前小白看到的主要有如下五个回测框架: 1. ...
- PHP实现量化交易,量化交易干货丨如何使用DolphinDB计算K线
DolphinDB提供了功能强大的内存计算引擎,内置时间序列函数,分布式计算以及流数据处理引擎,在众多场景下均可高效的计算K线.本教程将介绍DolphinDB如何通过批量处理和流式处理计算K线.历史数 ...
- 量化交易9-backtrader回测十字星K线形态图
十字星形态图,在股市中的应用: 十字星是一种K线基本型态.十字星,是一种只有上下影线,没有实体的K线图.开盘价即是收盘价,表示在交易中,股价出现高于或低于开盘价成交,但收盘价与开盘价相等.其中:上影线 ...
- 数据分析师1.4量化交易策略的回测方法和技巧
1.具体流程 1.利用Python编写好策略,选择选好的股票池. 2.设置开始和结束的时间点,然后设定资金池 3.通过股票池和日期获得股票数据,然后按照设定的间隔,比如每天/每 分钟调用回测函数. 4 ...
- python k线图和指标_量化交易中,如何使用Python画K线、成交量、买卖点【邢不行】...
引言: 邢不行的系列帖子"量化小讲堂",通过实际案例教初学者使用python进行量化投资,了解行业研究方向,希望能对大家有帮助. [历史文章汇总] 请点击此处 这是邢不行第 68 ...
- 量化交易中,如何使用Python画K线、成交量、买卖点【邢不行】
之前有次直播的时候给大家演示过一个我们内部使用的工具 -- 择时策略查看器. 择时策略查看器 在查看器的界面上,不仅可以清楚地看到K线图.均线等各类技术指标,还能显示出择时策略交易信号的买点.卖点. ...
- 量化交易-Backtrader回测
目录 一.基础篇-backtrader简介 二.backtrader回测应用实例 三.backtrader数据全解析 3.1 数据中必须包含 3.2 一切皆是数据源 3.3 参数 3.4 Lines线 ...
- 量化策略——准备3 数据、Backtrader回测框架与quantstats评价指标
我们一般使用AKShare这个库来获取股票数据或策略中用得到的数据: AKShare github主页:https://github.com/akfamily/akshare 使用Backtrader ...
- A股月份效应的研究——基于python量化视角(backtrader回测)
A股月份效应的研究 前言 <易经>早就揭示出:物极必反,盛极必衰! 阴阳总是不断交替的.股票市场也一样,涨跌互现,涨多了会出现调整,跌多了会出现反弹,因此我们看到K线组合总是红(阳)绿(阴 ...
最新文章
- python【蓝桥杯vip练习题库】BASIC-15字符串对比(水题)
- LCA 求 树中两个点的距离
- tensorflow tf.data.TextLineDataset()对象 (包含来自一个或多个文本文件的行的“数据集”) 不懂是啥玩意??
- AOP日志-前置通知操作
- 分享一个好用的函数吧,将js中的对象转成url参数
- 飞鸽传书的这一新的通信方式采用云技术
- python kafka kerberos 验证 消费 生产
- 聚类和分类算法的区别
- idea中加入插入当前系统日期快捷键
- chrome浏览器糟糕WEBGL遇到了问题,如何解决
- 知识积累 | GATK的使用
- 黑马登录案例验证码无法正常显示原因
- PgAdmin导入导出单表数据---解决PgAdmin导入单表数据报错乱码问题
- Vivado使用技巧(2):综合运行与OOC
- 美团Java面试题,苹果手机java编程软件
- 中国科学技大学2014年数学分析考研试题
- 群晖3617可以有几个网卡_Nvme pcie千兆有线网卡
- pandas实现列转行
- ICLR2020论文阅读笔记reformer: THE EFFICIENT TRANSFORMER
- C# 开发备忘录(自定义日历)