热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

十字星形态图,在股市中的应用:十字星是一种K线基本型态。十字星,是一种只有上下影线,没有实体的K线图。开盘价即是收盘价&#

十字星形态图,在股市中的应用:

十字星是一种K线基本型态。十字星,是一种只有上下影线,没有实体的K线图。开盘价即是收盘价,表示在交易中,股价出现高于或低于开盘价成交,但收盘价与开盘价相等。其中:上影线越长,表示卖压越重。下影线越长,表示买盘旺盛。通常在股价高位或低位出现十字线,可称为转机线,意味着出现反转。

以上的文字笔者截取自百度百科,笔者对以上的定义做个解读:十字星作为反转形态出现,出现在底部那么就会上涨,出现在顶部,那么就会下跌,根据这个解读,就得出一个策略:底部十字星,全仓买入,顶部十字星,全仓卖出。

综上:今天笔者要回测的策略为:底部十字星,全仓买入,顶部十字星,全仓卖出

先上代码和结论:

import tushare as ts
import pandas as pdimport 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 npclass MyStrategy(bt.Strategy):# 策略参数params = dict(printlog=False)def __init__(self):self.star = dict()# 定义全局变量self.count = 0for 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)# 数据放入self中self.star[data._id] = resdef 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 / 10size = ((int(total_value / self.data.close[0]))) - ((int(total_value / self.data.close[0])) % 100) - 100self.buy(data=data, size=size)print('出现底部十字星,全仓买入,买入数量' + str(size) )# 买入后的出现顶部十字星全仓后卖出if pos > 0 and self.star[data._id][self.count] == 100:# 全部卖出# 跟踪订单避免重复self.sell(data=data, size=pos)print('出现顶部十字星,卖出数量' + str(pos) )#自增处理self.count = self.count + 1def 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.priceself.buycomm = order.executed.commelse: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:returnself.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'] = 0data['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'] = 0data = 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()

总资金: 85693.93
净收益: -14306.07

笔者的数据是依旧是中国国航 601111,csv的文件,前面的文章可以获取到,此处不再放出连接

结论是亏损,看来单纯的用十字星来作为反转形态,作为买卖点,针对中国国航是不可靠的,如果还有同学想要回测其他股票,可以下载csv修改,非软件专业的也可以,联系笔者,我帮着回测。

本文重点:介绍一个函数

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

计算十字星数据的函数,结果为-100底部十字星,结果为100顶部十字星,0非十字星


推荐阅读
  • 本文由编程笔记#小编为大家整理,主要介绍了logistic回归(线性和非线性)相关的知识,包括线性logistic回归的代码和数据集的分布情况。希望对你有一定的参考价值。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • 本文介绍了如何在方法参数中指定一个对象的协议,以及如何调用符合该协议的方法。以一个具体的示例说明了如何在方法参数中指定一个UIView子类对象,并且该对象需要符合PixelUI协议,同时方法需要能够访问该对象的属性。 ... [详细]
  • 【shell】网络处理:判断IP是否在网段、两个ip是否同网段、IP地址范围、网段包含关系
    本文介绍了使用shell脚本判断IP是否在同一网段、判断IP地址是否在某个范围内、计算IP地址范围、判断网段之间的包含关系的方法和原理。通过对IP和掩码进行与计算,可以判断两个IP是否在同一网段。同时,还提供了一段用于验证IP地址的正则表达式和判断特殊IP地址的方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • 小程序wxs中的时间格式化以及格式化时间和date时间互转
    本文介绍了在小程序wxs中进行时间格式化操作的问题,并提供了解决方法。同时还介绍了格式化时间和date时间的互相转换的方法。 ... [详细]
  • 本文详细介绍了使用C#实现Word模版打印的方案。包括添加COM引用、新建Word操作类、开启Word进程、加载模版文件等步骤。通过该方案可以实现C#对Word文档的打印功能。 ... [详细]
  • python3 nmap函数简介及使用方法
    本文介绍了python3 nmap函数的简介及使用方法,python-nmap是一个使用nmap进行端口扫描的python库,它可以生成nmap扫描报告,并帮助系统管理员进行自动化扫描任务和生成报告。同时,它也支持nmap脚本输出。文章详细介绍了python-nmap的几个py文件的功能和用途,包括__init__.py、nmap.py和test.py。__init__.py主要导入基本信息,nmap.py用于调用nmap的功能进行扫描,test.py用于测试是否可以利用nmap的扫描功能。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • 本文整理了Java中org.apache.solr.common.SolrDocument.setField()方法的一些代码示例,展示了SolrDocum ... [详细]
  • 原文链接:Python:获取“3年前的今天”的日期时间Python:getdatetimefor3yearsagotoday在Python中,如何获取3年前的今天的datetime ... [详细]
author-avatar
天使骨头_799
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有