pyalgotrade源码分析1--PyAlgoTrade简介

PyAlgoTrade 可解释为python算法交易,简称PAT

随着这几年量化的兴起,出现了很多基于python的量化交易平台,但是大所述量化交易平台都是以线上为主,不能进行离线操作,比如国内的
聚宽、优矿、米筐、京东量化等,很少有线下的python量化平台供初学者学习和使用。
在这里对线上和线下的python量化平台进行一个简要的分析和对比
目前国内的量化平台诸如聚宽、优矿、米筐、京东量化等,各平台优缺点请自行百度。

进行量化分析最主要的是需要数据的支持,没有数据的支持和验证,再好的想法也很能实现为策略,然而线上量化平台为我们提供的丰富的数据支持,
以及API。带来便利性的同时让量化成了黑箱,不知其内部原理和机制,扩展性差,不能自定义一些技术指标和统计指标。

本站点选择以PAT为学习和研究的平台,主要基于以下几点:
1、PAT是一套相对完整、成熟的python量化系统,其中集成了大多数的技术指标和统计指标
2、完整的文档,丰富的实例
3、基于事件驱动的回测平台
4、可离线使用,扩展性强,可自行定制技术指标和统计指标
PyAlgoTrade 基于事件驱动的回测框架,在这里对事件驱动进行简要的说明。事件驱动机制,和普通函数调用的不同之处在于,应用程序不是主动的调用某个API完成处理,而是由事件监听器监听事件并进行相应的处理。
事件驱动程序的基本结构是由一个事件源、事件以及监听器构成,事件源产生事件、监听器监听事件并进行相应的处理和计算。当一个对象的状态发生变化时,所有依赖它的对象都得到通知并自动更新。当事件源的属性发生变化时,所有监听该事件的事件监听器都会接收到消息并作出响应。
在PyAlgoTrade中事件驱动贯穿整个框架之中,在后续技术指标时更加详细的说明。

PyAlgoTrade 安装
PyAlgoTrade的安装时比较简单的,可直接通过pip进行安装
pip install pyalgotrade

 

PyAlgoTrade 包含以下基本模块


Strategies: 策略,交易的逻辑以及交易的时机等。
DataSeries: 数据序列,管理时间序列数据的抽象类
Feeds: 数据源, CSV文件为主,可通过自己的数据类型进行扩展
Brokers: 交易模块,负责执行订单
Technical: 技术, 可根据数据集,进行技术指标的计算
StrategyAnalyzer: 分析,是对策略结果如收益率、夏普率等进行计算
Optimizer: 优化器,允许测试、使用不同的电脑以及集群,便于扩展

Feeds 数据源

PyAlgoTrade中数据又是以bar的类型进行组装,没个数据集被称之为一个bar,在本案例中,正对本站点提供的数据集对bar类进行简单的扩展,
以适应自己的数据集,如果读者有自己的数据集可进行相应的调整。
在本项目中对原有的csvfeed进行更改和扩充,并添加的从dataFrame数据集添加bar的方法。

在扩展barFeed时只需要更改__columnNames中对应的字段名称和__dateTimeFormat时间的类型。


class GenericBarFeed(BarFeed):

def __init__(self, frequency=bar.Frequency.DAY, timezone=None, maxLen=None):

super(GenericBarFeed, self).__init__(frequency, maxLen)

self.__timezone = timezone
# Assume bars don\'t have adjusted close. This will be set to True after
# loading the first file if the adj_close column is there.
self.__haveAdjClose = False

self.__barClass = bar.BasicBar

self.__dateTimeFormat = "%Y-%m-%d"

self.__columnNames = {
"datetime": "date",
"open": "open",
"high": "high",
"low": "low",
"close": "close",
"volume": "volume",
"adj_close": "adjust_price",
}

 

然后定义自己加载的方法,在本方法中,需要一个解析类,以及具体的方法,本方法中,具体的方法是在父类中完成。


def addBarsFromDataFrame(self, instrument, dataframe, timezone=None):

if timezone is None:

timezone = self.__timezone

rowParser = GenericRowParser(
self.__columnNames, self.__dateTimeFormat, self.getDailyBarTime(), self.getFrequency(),
timezone, self.__barClass
)

super(GenericBarFeed, self).addBarsFromDataFrame(instrument, dataframe, rowParser)

if rowParser.barsHaveAdjClose():

self.__haveAdjClose = True

elif self.__haveAdjClose:

raise Exception("Previous bars had adjusted close and these ones don\'t have.")


def addBarsFromDataFrame(self, instrument, dataframe, rowParser):

loadedBars = []

for index in range(len(dataframe)):

row = dataframe.ix[index]

bar_ = rowParser.parseBar(row)

if bar_ is not None and (self.__barFilter is None or self.__barFilter.includeBar(bar_)):

loadedBars.append(bar_)

self.addBarsFromSequence(instrument, loadedBars)

至此我们可以通过addBarsFromDataFrame方法将dataframe数据集添加到bar中,进行回测。详细代码参加trade.feed.genericbarfeed

Brokers: 交易模块,可以将brokers简单理解为经纪人

 

在对Brokers进行说明之前还有一个重要的类需要说明,这个类就是Order订单类


Order类是订单类,保存并记录订单的类型,订单的状态,以及订单的执行结果
MarketOrder 市价订单(按市场当时最优价或市价立即购买或出手一定数量的合约)
LinitOrder 限价单(给定最高阶或者最低价,当价格达到这个限价是触发交易)
StopOrder 止损单(停止损失的订单。预设一个固定的止损价格。一旦被触发的止损价,将会以市场单发送到市场上)
StopLimitOrder 限价止损单(当价格达到某一止损价格时﹐止损限价订单即转为限价订单)

在回测中Brokers可简单理解为经纪人,只对主要的几个方法进行简要说明


setCommission 设置手续费
getCash 账户余额
getShares 股票的数量
sybmitOrder 提交订单


Backtesting 回测模块,在回测框架中回测模块承担着重要的交易所的任务,
对提交的订单进行处理并对佣金、收益等计算。

posted @   吾心依旧  阅读(578)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示