python 针对macd指标回测
Python中有多种库可以用于MACD指标回测,其中比较常用的是TA-Lib和pyalgotrade。
TA-Lib是一个开源的技术分析库,包含了多种常见的技术指标,包括MACD。使用TA-Lib可以很方便地计算MACD指标,并进行回测。以下是一个使用TA-Lib计算MACD指标并进行简单回测的示例代码:
import talib
import pandas as pd
import numpy as np
# 读取数据
data = pd.read_csv('data.csv', index_col='date', parse_dates=True)
# 计算MACD指标
macd, signal, hist = talib.MACD(data['close'], fastperiod=12, slowperiod=26, signalperiod=9)
# 生成交易信号
data['signal'] = np.where(macd > signal, 1, -1)
# 计算收益率
data['returns'] = data['close'].pct_change() * data['signal'].shift(1)
# 计算累计收益率
data['cum_returns'] = (1 + data['returns']).cumprod()
# 绘制累计收益曲线
data['cum_returns'].plot()
pyalgotrade是一个开源的量化交易库,提供了多种回测框架和策略实现方式。使用pyalgotrade可以很方便地实现MACD指标回测。以下是一个使用pyalgotrade实现MACD指标回测的示例代码:
from pyalgotrade import strategy
from pyalgotrade.technical import macd
from pyalgotrade.technical import cross
from pyalgotrade import plotter
from pyalgotrade.stratanalyzer import returns
class MyStrategy(strategy.BacktestingStrategy):
def __init__(self, feed, instrument):
super(MyStrategy, self).__init__(feed)
self.__instrument = instrument
self.__macd = macd.MACD(feed[instrument].close, 12, 26, 9)
self.__position = None
self.__returns = returns.Returns()
def on_enter_ok(self, position):
self.info("Enter position")
def on_exit_ok(self, position):
self.info("Exit position")
self.__position = None
def on_bar(self, bar):
if self.__macd[-1] is None:
return
if self.__position is None:
if cross.cross_above(self.__macd.get_signal(), self.__macd.get_histogram()):
self.__position = self.enter_long(self.__instrument, 1000)
elif not self.__position.exit_active() and cross.cross_below(self.__macd.get_signal(), self.__macd.get_histogram()):
self.__position.exit()
self.__returns.update(self.__position)
def get_analysis(self):
return self.__returns
# 加载数据
from pyalgotrade.barfeed import csvfeed
feed = csvfeed.GenericBarFeed(frequency=csvfeed.Frequency.DAY)
feed.addBarsFromCSV("data", "data.csv")
# 创建策略并运行
myStrategy = MyStrategy(feed, "data")
plt = plotter.StrategyPlotter(myStrategy)
myStrategy.run()
myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getBroker().getEquity())
plt.plot()
``
原文地址: https://www.cveoy.top/t/topic/co3h 著作权归作者所有。请勿转载和采集!