本文记录了在Mac 10.13环境下安装配置 Python 下的回归工具 PyAlgoTrade 的过程。
运行环境
- python 2.7
- pyenv
- Mac Os 10.13
包安装
PyAlgoTrade
pip install pyalgotrade
matplotlib
python -mpip install -U pip
python -mpip install -U matplotlib
pandas
pip install pandas
pandas-datareader
pip install pandas-datareader
运行效果
stocktradeplot.jpg示例代码
#coding=utf-8
#mac is Moving Average Crossover
from pyalgotrade import strategy,plotter
from pyalgotrade.bar import Frequency
from pyalgotrade.barfeed.csvfeed import GenericBarFeed
from pyalgotrade.technical import ma
from pyalgotrade.stratanalyzer import returns
import datetime as dt
import pandas_datareader.data as web
import numpy as np
class MyStrategy(strategy.BacktestingStrategy):
def __init__(self,feed,instrument,smaPeriod1,smaPeriod2):
strategy.BacktestingStrategy.__init__(self,feed,10000)
self.__instrument = instrument
self.__sma1=ma.EMA(feed[instrument].getPriceDataSeries(),smaPeriod1)
self.__sma2=ma.EMA(feed[instrument].getPriceDataSeries(),smaPeriod2)
self.__shortPos = None
self.__longPos = None
def getSMA(self):
return self.__sma1,self.__sma2
def onEnterCanceled(self,position):
if self.__shortPos == position:
self.__shortPos = None
elif self.__longPos == position:
self.__longPos = None
else:
assert False
def onExitOk(self,position):
if self.__shortPos == position:
self.__shortPos = None
elif self.__longPos == position:
self.__longPos = None
else:
assert False
def onExitCanceled(self,position):
position.exitMarket()
def enterLongSignal(self,bar):
return self.__sma1[-1] > self.__sma2[-1]
def exitLongSignal(self):
return self.__sma1[-1] < self.__sma2[-1]
def exitShortSignal(self):
return self.__sma1[-1] > self.__sma2[-1]
def enterShortSignal(self):
return self.__sma1[-1] < self.__sma2[-1]
def onBars(self,bars):
if self.__sma1[-1] is None or self.__sma2[-1] is None:
return
bar = bars[self.__instrument]
if self.__longPos is not None:
if self.exitLongSignal():
self.__longPos.exitMarket()
elif self.__shortPos is not None:
if self.exitShortSignal():
self.__shortPos.exitMarket()
else:
if self.enterLongSignal(bar):
shares = int(self.getBroker().getCash() /
bars[self.__instrument].getPrice() * 0.9)
self.__longPos = self.enterLong(self.__instrument,shares,True)
def run_strategy(smaPeriod1,smaPeriod2):
feed = GenericBarFeed(Frequency.DAY,None,None)
feed.addBarsFromCSV("s000001","s000001.csv")
myStrategy = MyStrategy(feed,'s000001',smaPeriod1,smaPeriod2)
retAnalyzer = returns.Returns()
myStrategy.attachAnalyzer(retAnalyzer)
plt = plotter.StrategyPlotter(myStrategy)
plt.getInstrumentSubplot('s000001').addDataSeries('SMA1',myStrategy.getSMA()[0])
plt.getInstrumentSubplot('s000001').addDataSeries('SMA2',myStrategy.getSMA()[1])
plt.getOrCreateSubplot('returns').addDataSeries('returns',retAnalyzer.getReturns())
myStrategy.run()
plt.plot()
return myStrategy.getBroker().getEquity()
run_strategy(10,20)
至此,完成了所有插件的安装。并成功运行了第一个示例。可以开始慢慢研究 PyAlgoTrade 的各类API了。
样例数据
Date Time,Open,High,Close,Low,Volume,amount
2000-12-29 00:00:00,23.99,24.33,24.22,23.99,180120,5070815
2000-12-28 00:00:00,24.08,24.3,23.99,23.95,334011,9359495
2000-12-27 00:00:00,24.59,24.62,24.13,24.06,569336,16169689
2000-12-26 00:00:00,23.86,24.46,24.43,23.78,591466,16671897
2000-12-25 00:00:00,23.9,24.13,23.84,23.73,418610,11613743
2000-12-22 00:00:00,24.33,24.59,24.04,23.82,448530,12625467
2000-12-21 00:00:00,24.77,24.92,24.43,24.37,487400,13966501
2000-12-20 00:00:00,24.42,24.68,24.51,24.28,813306,23171987
2000-12-19 00:00:00,24.14,24.28,23.72,23.66,356910,9930823
2000-12-18 00:00:00,23.82,24.14,24.13,23.43,835629,23146962
问题解决
matplotlib
https://matplotlib.org/users/installing.html#macos
在我的安装过程中一直报错,提示如下的错误
>>> import matplotlib.pyplot as plt
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "//anaconda/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-macosx-10.5-x86_64.egg/matplotlib/pyplot.py", line 98, in <module>
_backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
File "//anaconda/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-macosx-10.5-x86_64.egg/matplotlib/backends/__init__.py", line 28, in pylab_setup
globals(),locals(),[backend_name],0)
File "//anaconda/lib/python2.7/site-packages/matplotlib-1.3.1-py2.7-macosx-10.5-x86_64.egg/matplotlib/backends/backend_macosx.py", line 21, in <module>
from matplotlib.backends import _macosx
**RuntimeError**: Python is not installed as a framework. The Mac OS X backend will not be able to function correctly if Python is not installed as a framework. See the Python documentation for more information on installing Python as a framework on Mac OS X. Please either reinstall Python as a framework, or try one of the other backends.
最终使用如下的方式解决。
在 ~/.matplotlib路径下创建一个文件 matplotlibrc 并加入如下的代码 backend: TkAgg
pandas_datareader
碰到以下的错误
import pandas_datareader.data as web
File "/Users/apple/.pyenv/versions/stock2.7/lib/python2.7/site-packages/pandas_datareader/__init__.py", line 2, in <module>
from .data import (DataReader, Options, get_components_yahoo,
File "/Users/apple/.pyenv/versions/stock2.7/lib/python2.7/site-packages/pandas_datareader/data.py", line 14, in <module>
from pandas_datareader.fred import FredReader
File "/Users/apple/.pyenv/versions/stock2.7/lib/python2.7/site-packages/pandas_datareader/fred.py", line 1, in <module>
from pandas.core.common import is_list_like
ImportError: cannot import name is_list_like
这是因为 is_list_like 已经被迁移到了 pandas.api.types 之下,需要修改 fred.py 文件,错误信息中可以找到文件的位置。然后将 from pandas.core.common import is_list_like 替换为 from pandas.api.types import is_list_like,之后就可以正常工作了。
网友评论