MACD 回测

相关知识

  1. MACD Wiki
  2. MA 计算公式
  3. MACD 概念和简单使用

数据来源

现在暂时使用了聚宽的数据。相关的日K和小时K的拉取在API文档里面可以找到,也可以在我的GitHub里面找到拉取的代码,代码很乱,随便看看就好。

具体公式

主要是三个计算:

  1. 12日的EMA
  2. 26日的EMA
  3. 9日的MACD

从EMA(指数移动平均)公式可以看到:
S t = { Y 1 , t = 1 α ∗ Y t + ( 1 − α ) ∗ Y t − 1 , t > 1; while  α = 2 N + 1 S_t = \begin{cases} Y_1, & \text {t = 1} \\ \alpha*Y_t + (1 - \alpha) * Y_{t-1}, & \text {t > 1; while } \alpha = \frac{2}{N+1} \end {cases} St={Y1,αYt+(1α)Yt1,t = 1t > 1; while α=N+12
其中,N就代表的是12和26

我们就可以用这个公式把周期为12(代称为快线)和周期为26(慢线)的K线EMA算出来,为什么说周期K线而不是日K,因为K线还有其他的周期,比如短线的分钟线,和中线的周线,长线的月线,季线。所以应该说是[60min | 日 | 周 | 月 | 季]的K线的快\慢线。

然后可以用快慢线来计算出DIFF
D I F F = E M A ( C , 12 ) − E M A ( C , 26 ) DIFF = EMA(C, 12) - EMA(C, 26) DIFF=EMA(C,12)EMA(C,26)
最后算出DIFF9日的DEA线:
D E A = E M A ( D I F F , 9 ) DEA = EMA(DIFF, 9) DEA=EMA(DIFF,9)

实现

实现部分具体可以看代码,在strategy里面,Python和C++的都有,用C++再写一遍主要是Python实在慢,一只票还好,3600只就有点扛不住了,但是具体逻辑是一样的:主要就是逐行读csv文件,然后计算DIFF线和MACD线,并且求出它们的交叉情况。

简单策略

根据MACD的金死叉规则,然后写了一个tracker来跟踪具体的Profit and Lost,代码里面有一个pnl_tracker,可以自行设置初始资金,手续费,每次信号来临时买入的手数,回测07年到现在的数据。

结论

光根据MACD线来当作交易信号不太理想,特别是在盘整行情中频繁出现交易信号的时候,MACD只能作为一个参考指标来使用。

在Python中,MACD(移动平均收敛/发散)策略是一种常用的技术分析方法,用于股票、期货等金融市场的交易信号生成。(Backtesting)则是评估这种策略的历史表现,通过模拟过去的市场数据来预其在未来可能会产生的收益。 以下是一个简化的步骤来编写一个MACD策略并进行: 1. **安装库**:首先,你需要安装`pandas`, `numpy`, 和 `backtrader` 这些用于数据处理和的Python库。 ```bash pip install pandas numpy backtrader ``` 2. **数据准备**:获取历史价格数据,通常使用Yahoo Finance或其他金融数据API。例如: ```python import yfinance as yf data = yf.download(tickers='AAPL', start='2010-01-01', end='2023-06-30') ``` 3. **计算MACD指标**:使用`backtrader.indicators.MACD`函数计算MACD线、信号线和平滑异同移动平均线(Histogram)。 4. **编写策略规则**:当MACD线上穿信号线(即DIFF线超过DEA线),形成买入信号;当DIFF线下穿DEA线,则形成卖出信号。 5. **策略**:创建`backtrader.Strategy`实例,将MACD指标作为数据源,并实现买进、卖出的交易决策逻辑。例如: ```python from.backtrader import Strategy class MACDStrategy(Strategy): def __init__(self): self.macd = MACD(self.data.close) def next(self): if self.macd[0].crossabove(self.macd[1]): self.buy() elif self.macd[0].crossbelow(self.macd[1]): self.sell() 6. **运行**:设置初始资金、手续费等参数,然后执行并获取结果。 ```python cerebro = bt.Cerebro() cerebro.adddata(data) cerebro.addstrategy(MACDStrategy) result = cerebro.run() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值