位置:丁香财经网 >> 区块链

期货如何回测数据(期货如何回测数据分析)

2023年05月05日 15:14

欧易okx交易所下载

欧易交易所又称欧易OKX,是世界领先的数字资产交易所,主要面向全球用户提供比特币、莱特币、以太币等数字资产的现货和衍生品交易服务,通过使用区块链技术为全球交易者提供高级金融服务。

APP下载   官网注册

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 pdimport matplotlib.pyplot as plt#正常显示画图时出现的中文和负号from pylab import mplmpl.rcParams['font.sans-serif']=['SimHei']mpl.rcParams['axes.unicode_minus']=Falseimport tushare as tsimport backtrader as btimport pyfolio as pf

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

class cal_ichimoku(object):    def __init__(self,code='cyb',start='2019-01-01',end='2022-06-01'):        self.code=code        self.start=start        self.end=end        self.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        #计算前导跨度A        self.data['lead_span_A'] = ((self.data.conversion_line + self.data.base_line) / 2).shift(lag_span_period)        # 计算前导跨度A        high_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()
「手把手教你」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        #计算前导跨度A        self.lead_span_A=((self.Conversion_line+self.Base_line)/2)(-self.params.lag_span_period)        #计算前导跨度B        self.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.9        if self.Crossover > 0 and self.buytime == 0:                                                       self.buytime = 1                    size=int(total_value/100/data.close[0])*100            self.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').datadf['openinterest']=0df=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 = 1000000cerebro.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)
「手把手教你」Ichimoku云图指标可视化与交易策略回测


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

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


「手把手教你」Ichimoku云图指标可视化与交易策略回测

「手把手教你」Ichimoku云图指标可视化与交易策略回测

「手把手教你」Ichimoku云图指标可视化与交易策略回测

「手把手教你」Ichimoku云图指标可视化与交易策略回测


「手把手教你」Ichimoku云图指标可视化与交易策略回测


「手把手教你」Ichimoku云图指标可视化与交易策略回测


「手把手教你」Ichimoku云图指标可视化与交易策略回测


「手把手教你」Ichimoku云图指标可视化与交易策略回测


04 结语


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

推荐阅读

股票dma的牛公式(股票dma指标详解)
什么园林股票好(园林持有的股票)
银行期货适当性评估(银行期货适当性评估指标)
期货兵器谱(期货小兵)
期货最广泛趋势指标(期货趋势指标公式)
博易云期货软件指标源码(博易云期货软件指标源码是什么)
兼具振荡与趋势的期货指标 兼具振荡与趋势的期货指标有
融资租赁全国排行榜(全国融资租赁公司排名)
300317股票股吧(2月8日珈伟新能(300317)龙虎榜数据)
炒期货最主要看哪些指标,炒期货主要看什么指标

标签: ichimoku 指标 回测

文章来源: 丁香财经网
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至405936398@qq.com 举报,一经查实,本站将立刻删除。
相关资讯
虚拟货币等同于信用货币吗 虚拟货币与人民币的区别
虚拟货币等同于信用货币吗 虚拟货币与人民币的区别 1970-01-01

,52),) def __init__(self): self.dataclo...

中国虚拟币处置平台排名(中国虚拟币处置平台排名最新)
中国虚拟币处置平台排名(中国虚拟币处置平台排名最新) 1970-01-01

,52),) def __init__(self): self.dataclo...

区块链虚拟货币有些?到底什么是区块链?区块链就是虚拟币吗?
区块链虚拟货币有些?到底什么是区块链?区块链就是虚拟币吗? 1970-01-01

,52),) def __init__(self): self.dataclo...

看广告给虚拟货币(看广告赚金币会降低账号活跃度么)
看广告给虚拟货币(看广告赚金币会降低账号活跃度么) 1970-01-01

,52),) def __init__(self): self.dataclo...

货币虚拟怎么转账 货币虚拟怎么转账的
货币虚拟怎么转账 货币虚拟怎么转账的 1970-01-01

,52),) def __init__(self): self.dataclo...

虚拟货币挖矿相关报告?虚拟挖矿机的工作原理
虚拟货币挖矿相关报告?虚拟挖矿机的工作原理 1970-01-01

,52),) def __init__(self): self.dataclo...