PyAlgoTrade的主要目的是帮助人们测试其交易策略。
PyAlgoTrade有六大组件:
- Strategies策略
- Feeds数据源
- Brokers经纪商
- DataSeries数据序列
- Technicals指标计算
- Optimizer优化
Strategies
定义的实现交易逻辑的类:何时买、何时卖,等等
Feeds
These are data providing abstractions. 例如,你可以使用CSV数据源从一个格式化后的csv(以逗号分割)文件中加载数据推送给策略。
数据源不仅限于bars。例如,可以利用Twitter数据源将Twitter的事件信息转化为交易决策(译者注:事件驱动)。
Brokers
经纪商模块负责执行订单。
DataSeries
DataSeries 是用于管理时间序列的抽象类
Technicals
这是你用来对DataSeries进行计算的一组过滤(指标)器。 例如简单移动平均线(SMA),相对强弱指标(RSI)等. 这些过滤(指标)器被建模为DataSeries 的装饰器。
Optimizer
这是能让你在不同电脑之间、或多进程、或二者结合以加快回测效率的一组类。
Feeds--Bar数据来源
PyAlgoTrade提供了四种权威的数据来源和一种自定义的数据来源。
一、自定义数据来源
一个从CSV文件中加载的BarFeed具有以下
Date Time,Open,High,Low,Close,Volume,Adj Close
2013-01-01 13:59:00,13.51001,13.56,13.51,13.56,273.88014126,13.51
class pyalgotrade.barfeed.csvfeed.BarFeed(frequency, maxLen=1024)
注意:
- CSV文件的第一行 必须 是列名。
- 复权收盘价 列允许为空。
以上数据来源类都有如下方法:
addBarsFromCSV(instrument, path, timezone=None)
为指定的品种从格式化后的CSV文件中加载bars,同时在bar数据源中注册品种。
参数:
- instrument (string.) – 品种标识。
- path (string.) – CSV文件的路径
- timezone (A pytz timezone.) – The timezone to use to localize bars.
详情 pyalgotrade.marketsession.
举例:
from pyalgotrade.barfeed import csvfeed
freed=csvfeed.BarFeed()
#"orcl"是品种标示
#"dat/ORCL-2000.csv"是文件路径
feed.addBarsFromCSV("orcl", "dat/ORCL-2000.csv")
csv中还有个方法,可以对文件的时间进行格式化。
class pyalgotrade.feed.csvfeed.Feed(dateTimeColumn, dateTimeFormat, converter=None, delimiter=', ', timezone=None, maxLen=1024)
参数:
- dateTimeColumn (string.) – 带有datetime列的列名.
- dateTimeFormat (string.) – datetime的转换格式. datetime.datetime.strptime 将用它对该列进行格式转换.
- converter (function.) – 一个有两个参数(列名和值)的转换函数。它将转换字符串到其他格式。默认转换为float,如果转换失败则返回string原值。
- delimiter (string.) – 字符串分隔符.
- maxLen (int.) –当队列已满,一旦添加新的条目进来,将会在相反位置删除对应数量的条目。具体详见pyalgotrade.dataseries.DataSeries
示例如下:
一个带有以下格式的文件
Date,USD,GBP,EUR
2013-09-29,1333.0,831.203,986.75
2013-09-22,1349.25,842.755,997.671
2013-09-15,1318.5,831.546,993.969
2013-09-08,1387.0,886.885,1052.911
...
像这样引入并使用:
from pyalgotrade.feed import csvfeed
feed = csvfeed.Feed("Date", "%Y-%m-%d")
feed.addValuesFromCSV("quandl_gold_2.csv")
for dateTime, value in feed:
print(dateTime, value)
输出结果:
1968-04-21 00:00:00 {'USD': 37.65, 'GBP': 15.6833, 'EUR': ''}
1968-04-28 00:00:00 {'USD': 38.65, 'GBP': 16.1271, 'EUR': ''}
1968-05-05 00:00:00 {'USD': 39.1, 'GBP': 16.3188, 'EUR': ''}
1968-05-12 00:00:00 {'USD': 39.6, 'GBP': 16.5625, 'EUR': ''}
1968-05-19 00:00:00 {'USD': 41.5, 'GBP': 17.3958, 'EUR': ''}
1968-05-26 00:00:00 {'USD': 41.75, 'GBP': 17.5104, 'EUR': ''}
1968-06-02 00:00:00 {'USD': 41.95, 'GBP': 17.6, 'EUR': ''}
1968-06-09 00:00:00 {'USD': 41.25, 'GBP': 17.3042, 'EUR': ''}
.
.
.
2013-07-28 00:00:00 {'USD': 1331.0, 'GBP': 864.23, 'EUR': 1001.505}
2013-08-04 00:00:00 {'USD': 1309.25, 'GBP': 858.637, 'EUR': 986.921}
2013-08-11 00:00:00 {'USD': 1309.0, 'GBP': 843.156, 'EUR': 979.79}
2013-08-18 00:00:00 {'USD': 1369.25, 'GBP': 875.424, 'EUR': 1024.964}
2013-08-25 00:00:00 {'USD': 1377.5, 'GBP': 885.738, 'EUR': 1030.6}
2013-09-01 00:00:00 {'USD': 1394.75, 'GBP': 901.292, 'EUR': 1055.749}
2013-09-08 00:00:00 {'USD': 1387.0, 'GBP': 886.885, 'EUR': 1052.911}
2013-09-15 00:00:00 {'USD': 1318.5, 'GBP': 831.546, 'EUR': 993.969}
2013-09-22 00:00:00 {'USD': 1349.25, 'GBP': 842.755, 'EUR': 997.671}
二、Yahoo! Finance
该数据文件来源于雅虎金融,其频率只支持日内和周内数据。
class pyalgotrade.barfeed.yahoofeed.Feed(frequency=86400, timezone=None, maxLen=1024)¶
- frequency – bars的频率. 只支持 pyalgotrade.bar.Frequency.DAY 或 pyalgotrade.bar.Frequency.WEEK 类型
- timezone (A pytz timezone.) – 默认情况下使用bars自身的时区. 详见 pyalgotrade.marketsession.(主要有;NASDAQ、NYSE、USEquities、MERVAL、BOVESPA、FTSE、TSE)。
三、Google Finance
加载下载自Google Finance的CSV文件中的bars。
class pyalgotrade.barfeed.googlefeed.Feed(frequency=86400, timezone=None, maxLen=1024)
- frequency – bars的频率. 当前只支持 pyalgotrade.bar.Frequency.DAY 类型。
四、Quandl
加载下载自Quandl的CSV文件中的bars
class pyalgotrade.barfeed.quandlfeed.Feed(frequency=86400, timezone=None, maxLen=1024)
- frequency – bars的频率. 只支持 pyalgotrade.bar.Frequency.DAY 或 pyalgotrade.bar.Frequency.WEEK 的类型
五、Ninja Trader
加载从NinjaTrader导出的CSV文件中的bars
class pyalgotrade.barfeed.ninjatraderfeed.Feed(frequency, timezone=None, maxLen=1024)
- frequency – bars的频率. 只支持 pyalgotrade.bar.Frequency.MINUTE 或
pyalgotrade.bar.Frequency.DAY。即支持分时数据和日内数据。