01

引言

Ichimoku Kinko Hyo,简称Ichimoku,是一名日本报纸作家提出的,用于衡量动量以及未来价格支撑和阻力区域的技术分析指标,目前被广泛用于判断外汇、期货、股票、黄金等投资品种的趋势和动量。该指标将各种技术策略组合成一个易于实现和解释的指标。“ichimoku”翻译成中文是“一目”的意思,相当于交易者只需要看一眼图表就能确定价格动量走势、支撑和阻力位。下面首先为大家介绍Ichimoku指标的基本原理,其次使用Python计算该指标并对其云图进行可视化,最后使用backtrader对该指标进行简单的历史回测。

02

Ichimoku指标计算与可视化

Ichimoku指标由五条线组成:

  • Tenkan-sen:转折线,通过在过去9交易日最高价和最低价之和除以2,用来表示关键支撑和阻力位,以及反转信号线。

  • Kijun-sen:基准线,通过在过去26个交易日最高价和最低价之和除以2,表示关键支撑位和阻力位,是趋势变化的确认,可用作追踪止损点。

  • Senkou Span A:前导跨度A或先行上线A,通过将tenkan-sen和kijun-sen相加除以2,由此产生的线形成了kumo(或云)的一个边缘,用于识别未来的支撑和阻力区域。

  • Senkou Span B:前导跨度B或先行上线B,通过将过去52个交易日最高价和最低价之和除以2,形成了kumo的另一个边缘,用于识别未来的支撑和阻力区域。

  • Chikou Span:滞后跨度或延迟线是当前周期的收盘价,在图表上显示往前30天的收盘价。该线用于显示可能的支撑和阻力区域。

使用Python计算Ichimoku指标,并对该指标的云图进行可视化。

导入Python相关模块

import pandas as pd
import matplotlib.pyplot as plt
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
import tushare as ts
import backtrader as bt
import pyfolio as pf

以Python的class类对数据获取、指标计算和可视化进行封装。

class cal_ichimoku(object):def __init__(self,code='cyb',start='2019-01-01',end='2022-06-01'):self.code=codeself.start=startself.end=endself.data=self.get_data()def get_data(self):df=ts.get_k_data(self.code,self.start,self.end)df.index=pd.to_datetime(df.date)return df[['open','high','low','close','volume']]def ichimoku(self,cl_period=9,bl_period=26,lag_span_period=26,lead_span_b_period=52):# 计算转换线high_1 = self.data['high'].rolling(cl_period).max()low_1 = self.data['low'].rolling(cl_period).min()#Tenkan-sen:转换线self.data['conversion_line'] = (high_1 + low_1) / 2# 计算基准线high_2 = self.data['high'].rolling(bl_period).max()low_2 = self.data['low'].rolling(bl_period).min()self.data['base_line'] = (high_2 + low_2) / 2#计算前导跨度Aself.data['lead_span_A'] = ((self.data.conversion_line + self.data.base_line) / 2).shift(lag_span_period)# 计算前导跨度Ahigh_3 = self.data['high'].rolling(lead_span_b_period).max()low_3 = self.data['high'].rolling(lead_span_b_period).min()self.data['lead_span_B'] = ((high_3 + low_3) / 2).shift(lead_span_b_period)# 滞后跨度self.data['lagging_span'] = self.data['close'].shift(-lag_span_period)# 删除缺失值self.data.dropna(inplace=True) def graph_ichimoku(self):fig, ax = plt.subplots(1, 1, sharex=True, figsize=(15, 7))ax.plot(self.data.index, self.data['close'], linewidth=2,label='收盘价')ax.plot(self.data.index, self.data['lead_span_A'],label='前导跨度A',color='k')ax.plot(self.data.index, self.data['lead_span_B'],label='前导跨度B',color='y')ax.fill_between(self.data.index, self.data['lead_span_A'], self.data['lead_span_B'],where=self.data['lead_span_A'] >= self.data['lead_span_B'], color='lightcoral')ax.fill_between(self.data.index, self.data['lead_span_A'], self.data['lead_span_B'],where=self.data['lead_span_A'] < self.data['lead_span_B'], color='lightgreen')plt.legend(loc=0)plt.grid()plt.show()

以‘600000’个股为例,其Ichimoku云图如下所示,

ich=cal_ichimoku(code='600000')
ich.ichimoku()
ich.graph_ichimoku()

图中红色和绿色区域就是云图指标的主要元素。A线和B线形成云图指标的阻力水平和支撑水平。一般而言,绿色的云彩变成红色代表上升趋势内的横盘,红色的云彩变成绿色则代表下跌趋势内的横盘。当转折线由下向上穿过基准线时是买入信号,当转折线由上向下穿过基准线时是卖出信号。下面根据买入卖出信号利用backtrader进行量化回测。

03

Ichimoku交易策略回测

交易策略:当收盘价在云层上方、转换线从下往上穿过基准线与其云层上方、延迟线位于云层上方时,买入做多;反之,当收盘价在云层下方、转换线从上往下穿过基准线与其云层下方、延迟线位于云层下方时,卖出做空。

class IchimokuStrategy(bt.Strategy):params = ( ('cl_period',9),('bl_period',26),('lag_span_period',26),('lead_b_period',52),)   def __init__(self):        self.dataclose = self.datas[0].close      self.datahigh = self.datas[0].high        self.datalow = self.datas[0].low     self.order = None      self.buyprice = 0      self.buycomm = 0      self.newstake = 0      self.buytime = 0       # 参数计算#计算转换线self.Highest_high1 = bt.indicators.Highest(self.datahigh(-1), period=self.params.cl_period, subplot=False)        self.Lowest_low1 = bt.indicators.Lowest(self.datalow(-1), period=self.params.cl_period, subplot=False)     self.Conversion_line=(self.Highest_high1+self.Lowest_low1)/2#计算基准线self.Highest_high2 = bt.indicators.Highest(self.datahigh(-1), period=self.params.bl_period, subplot=False)        self.Lowest_low2 = bt.indicators.Lowest(self.datalow(-1), period=self.params.bl_period, subplot=False)     self.Base_line=(self.Highest_high2+self.Lowest_low2)/2#计算前导跨度Aself.lead_span_A=((self.Conversion_line+self.Base_line)/2)(-self.params.lag_span_period)#计算前导跨度Bself.Highest_high3 = bt.indicators.Highest(self.datahigh(-1), period=self.params.lead_b_period, subplot=False)        self.Lowest_low3 = bt.indicators.Lowest(self.datalow(-1), period=self.params.lead_b_period, subplot=False)     self.lead_span_B=((self.Highest_high3+self.Lowest_low3)/2)(-self.params.lead_b_period)#计算价格的滞后值self.lagging_span= self.dataclose(-self.params.lag_span_period)    self.Crossover = bt.ind.CrossOver(self.dataclose, self.lead_span_A)         def next(self): if self.order:return        #入场        # 得到当前的账户价值total_value = self.broker.getvalue()*0.9if self.Crossover > 0 and self.buytime == 0:                                           self.buytime = 1        size=int(total_value/100/data.close[0])*100self.order = self.buy(size = size)        #出场        elif self.Crossover < 0 and self.buytime > 0:            self.order = self.close()            self.buytime = 0

使用tushare获取交易数据。

#获取数据在backtrader上回测
df=cal_ichimoku(code='600000',start='2012-01-01').data
df['openinterest']=0
df=df[['open','high','low','close','volume','openinterest']]
#df.head()

backtrader回测系统设置。

#初始化回测系统
cerebro = bt.Cerebro(cheat_on_open=True)
#添加策略
cerebro.addstrategy(IchimokuStrategy)
#添加数据
data=bt.feeds.PandasData(dataname=df)
cerebro.adddata(data)
#初始资金设置
startcash = 1000000
cerebro.broker.setcash(startcash)
# 设置佣金为0.08%
cerebro.broker.setcommission(commission=0.0008)#运行回测系统
cerebro.addanalyzer(bt.analyzers.PyFolio, _name='pyfolio')
results = cerebro.run()
strat = results[0]
pyfoliozer = strat.analyzers.getbyname('pyfolio')
returns, positions, transactions, gross_lev = pyfoliozer.get_pf_items()#获取回测结束后的总资金
portvalue = cerebro.broker.getvalue()
pnl = portvalue - startcash
#打印结果
print(f'初始资金:{startcash}')
print(f'总资金: {round(portvalue,2)}')
print(f'净收益: {round(pnl,2)}')
初始资金:1000000
总资金: 3828151.48
净收益: 2828151.48

backtrader回测图

plt.rcParams['figure.figsize']=[18, 8]
cerebro.plot(iplot=False)

下面进一步使用pyfolio展示更详细的量化回测结果。在2012-2022.06交易期间内,年化回报率为14.5%,总收益率283%,年化波动率36.5%,夏普比率只有0.55,最大回撤高达53.5%,各项指标显示该交易策略效果并没有特别好。

#使用pyfolio展示回测结果
pf.create_full_tear_sheet(returns)

04

结语

本文简单介绍了Ichimoku指标的基本原理,重点展示了如何使用Python计算该指标并对其云图进行可视化,以及利用该指标构建交易策略并通过backtrader进行历史回测。值得注意的是,本文只是以某个特例(‘600000’)进行回测,得到的结果好坏与否并不能简单代表该指标是否有效,还需要更多样本和案例的支持。动量和趋势是金融市场价格常常表现出来的一种现象,Ichimoku指标与其他动量指标一样,当价格形成一种相对稳定的趋势时(大牛市或大熊市),其预测能力较强,但当价格处于震荡状态时往往失效。此外,技术指标局限于历史价格本身,有点类似温度计,能够一定程度上测量过去和当前的温度,但无法给出明天的温度(无法解释动量如何产生,何时停止)。

关于Python金融量化

专注于分享Python在金融量化领域的应用。加入知识星球,可以免费获取30多g的量化投资视频资料、量化金融相关PDF资料、公众号文章Python完整源码、量化投资前沿分析框架,与博主直接交流、结识圈内朋友等。

【手把手教你】Ichimoku云图指标可视化与交易策略回测相关推荐

  1. 手把手教你python实现量价形态选股知乎_【手把手教你】Python实现基于事件驱动的量化回测...

    01引言 使用矢量化方法(pandas)建立的基于研究的量化回测框架,不考虑交易的委托成交行为,与真实市场情况差距比较大.今天为大家介绍的是基于事件驱动的回测框架,这是一种十分复杂的回测系统,力图模拟 ...

  2. 【手把手教你】获取股票数据并进行量化回测——基于ADX和MACD趋势策略

    01 引言 不少喜欢量化的读者向我反馈,虽然已经掌握了Python的编程基础,但仍不知道如何切入到股票量化分析上,一是对如何获取股票数据还不太熟悉:二是拿到股票数据后不知道怎么做量化回测.实际上公众号 ...

  3. python数据分析图_Python数据分析:手把手教你用Pandas生成可视化图表的教程

    大家都知道,Matplotlib 是众多 Python 可视化包的鼻祖,也是Python最常用的标准可视化库,其功能非常强大,同时也非常复杂,想要搞明白并非易事.但自从Python进入3.0时代以后, ...

  4. python 海龟交易法则_【手把手教你】用Python量化海龟交易法则

    止损:什么时候放弃一个亏损的头寸? 离市:什么时候退出一个盈利的头寸? 策略:如何买卖? 趋势追踪--唐奇安通道 海龟交易法则利用唐奇安通道的突破点作为买卖信号指导交易,简单而言唐奇安通道是由一条上轨 ...

  5. python海龟交易策略_【手把手教你】用Python量化海龟交易法则 - 简书

    下面使用简化版的海龟交易法则进行历史回测,即不考虑仓位管理和动态止损/止盈条件,以唐奇安通道突破作为买入卖出信号. 交易规则为: (1)当今天的收盘价,大于过去20个交易日中的最高价时,以收盘价买入: ...

  6. 「手把手教你」用Python量化海龟交易法则

    1引言 对于纯多头或空头的方向性策略而言,只有当证券价格是均值回归或趋势的,交易策略才能盈利.否则,如果价格是随机游走的,交易将无利可图(法玛有效市场假说).换句话说,目前各种纷繁复杂的所谓量化策略大 ...

  7. 【手把手教你】用Python量化海龟交易法则

    点击"简说Python",选择"置顶/星标公众号" 福利干货,第一时间送达! 本文授权转载自Python金融量化,禁二次转载 作者:CuteHand 阅读文本大 ...

  8. 京东量化教你如何用简单的策略回测盈利

    阅读原文:http://club.jr.jd.com/quant/topic/963245 今天来教大家使用量化平台中Python的部分,完成一个简单的策略回测. 首先,回测界面是长这个样子的 可以看 ...

  9. 【手把手教你】基于均线排列的价格动量策略回测

    01 引言 动量策略是通过利用市场波动从现有趋势的延续中获利.简单来说,高买高卖,反之亦然("低买高卖"是均值回归策略思想,与动量策略相反).价值投资通常基于均值的长期回归,而动量 ...

最新文章

  1. [Linux内核]软中断与硬中断
  2. java中如何应对读改写场景
  3. 【 MATLAB 】使用 MATLAB 实现模拟信号的近似及其连续傅里叶变换
  4. 如何统计各个班级的相关数据(如班级排名、最高分等)呢?
  5. Magic Leap大举进军AR医疗:新品率先与医疗机构合作,挖走HoloLens老客户
  6. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
  7. 触发器 :new和 :old的使用
  8. linux 笔记: screen
  9. SQL优化:从设计表结构开始(层次型表结构设计方法)
  10. 布隆过滤器速度_详解布隆过滤器的原理、使用场景和注意事项
  11. 造车梦又要“窒息”了?贾跃亭被美国认定骗局,收到退市警告!FF回应了......
  12. AD16修改规则加宽电源线与地线
  13. 关于在arm裸板编程时使用printf问题的解决方法
  14. 【BZOJ1475】方格取数 [最小割]
  15. springboot之websocket集成
  16. 揭秘盒马鲜生,如何打破收益增长天花板!
  17. H3CNE中Vlan间路由
  18. 鲁宾逊《非标准分析》中译版正式上线
  19. 区块链 图灵完备是什么
  20. 涂涂乐 通过shader实现目标区域正交图片提取,移动端可用

热门文章

  1. 信息报送不及时整改措施_上报材料不及时整改措施.doc
  2. 如何让多个div横向排列(html+css)
  3. 中国式婚姻的10个错误观点(转载)
  4. 树莓派gpio编程c语言,树莓派底层编程-GPIO篇
  5. 快速理解 一,二,三范式
  6. 新托福写作:活用简单词
  7. Kafka:什么是kafka? ①
  8. 正交分解与完全正交分解的数学解释
  9. c语言酶切算法,科学网—FitHiC V1算法解析(一) - 卢锐的博文
  10. 【前端面试题】10—21道关于性能优化的面试题