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

十字星是一种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非十字星

量化交易9-backtrader回测十字星K线形态图相关推荐

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

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

  2. api接口通达信系统怎样开发量化回测及K线的显示买卖点程序?

    api接口通达信系统怎样开发量化回测及K线的显示买卖点程序如下: import numpy as np; from matplotlib import pyplot as plt; (1)# 主要是能 ...

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

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

  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. 干货全拿走-用ExcelVBA做个股多模型交叉验证择时交易套利及回测系统

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

最新文章

  1. react-native 集成极光推送jpush-react-native时的小问题
  2. 枚举enum与#define 宏的区别?
  3. 倾斜模型精细化处理_广州智迅诚单体化实景三维模型为智慧城市提供了平台数据基础...
  4. vc++ cserialport 打开多个串口_STM32之USART串口
  5. 你永远不知道女生裙子下面藏着什么
  6. LeetCode 454. 四数相加 II 思考分析
  7. ThinkPHP框架 _ 学习3
  8. Access数据库的模糊查询
  9. mc用什么版本的java_我的世界网易 Java 版哪个版本比较好?
  10. java中怎么自己画地图_用 4 行代码画一幅中国地图
  11. mindmanager2020官方下载永久激活版V20.1.237
  12. 百度api爬虫(1)从百度api中爬取地点数据
  13. 学界 | Ian Goodfellow最新论文:是猫还是狗?不光神经网络识别不了,你也能被忽悠...
  14. 银行软件测试论文参考文献,软件测试毕业论文参考文献.doc
  15. 蓝桥杯的比赛流程和必考点
  16. 解决ftp 出现Passive mode refused的办法
  17. SVN服务器管理工具——VisualSVN Server Manager
  18. java中的setting文件
  19. 新学期,新气象,新起点,新征程。
  20. 如何串联两个路由器(建议用第二种方法)

热门文章

  1. 如何在QQ中创建一个机器人,并获得到它的Token
  2. 指令双人攻击战斗模板
  3. 剪绳子(动态规划、贪心算法)
  4. ORACLE和MYSQL的九大区别
  5. 假设今年的工业产值为100万元,产值增长率为每年c%,请编程计算当c分别为6、8、10、12时工业产值分别过多少年可实现翻一番(即增加一倍)
  6. threeJS 创建反光效果
  7. 计算机扣款公式,迟到早退扣款公式怎么写?
  8. 总结:Linux安装Java并运行jar遇到的错误
  9. java 心态,小议学习Java的浮躁心态
  10. C/C++ 中野指针产生的问题