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 回测模块,在回测框架中回测模块承担着重要的交易所的任务,
对提交的订单进行处理并对佣金、收益等计算。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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框架的用法!