python回测量化交易策略收益率

本篇我们将对比经典量化回测框架pyalgotrade与ailabx,二者同时实现均线策略。

“积木式”实现策略示例

“买入并持有”策略: buy_and_hold = Strategy([ RunOnce(),

PrintBar(),SelectAll(),WeighEqually(),

])

“均线交叉策略”:

long_expr = 'cross_up(ma(close,5),ma(close,10))'

flat_expr = 'cross_down(ma(close,5),ma(close,10))'

ma_cross = Strategy([

SelectByExpr(long_expr=long_expr,flat_expr=flat_expr),WeighEqually(),

])

另外,传统量化平台本质上是用户思路的自动化,“自动化”只是量化的初级阶段。

“智能化”才是量化的核心与终级目标。

基于机器学习、深度学习、强化学习等人工智能前沿工具,机器自动发现数据中的模式,并优化相应的策略,是这个我们这个平台的核心目标。

开发环境与安装部署

anaconda python3.6

直接git或者下载源码包,安装相关依赖,然后运行main.py即可。

git clone https://github.com/ailabx/ailabx.git

cd ailabx

pip install requirements.txt

python main.py

 

先看pyalgotrade的代码实现:

from pyalgotrade import strategy
from pyalgotrade.technical import ma
from pyalgotrade.technical import cross
from pyalgotrade.tools import quandlclass SMACrossOver(strategy.BacktestingStrategy):def __init__(self, feed, instrument, smaPeriod):super(SMACrossOver, self).__init__(feed)self.__instrument = instrumentself.__position = None# We'll use adjusted close values instead of regular close values.self.setUseAdjustedValues(True)self.__prices = feed[instrument].getPriceDataSeries()self.__sma = ma.SMA(self.__prices, smaPeriod)def getSMA(self):return self.__smadef onEnterOk(self, position):execInfo = position.getEntryOrder().getExecutionInfo()self.info("BUY at %.2f" % (execInfo.getPrice()))def onEnterCanceled(self, position):self.__position = Nonedef onExitOk(self, position):execInfo = position.getExitOrder().getExecutionInfo()self.info("SELL at $%.2f" % (execInfo.getPrice()))self.__position = Nonedef onBars(self, bars):# If a position was not opened, check if we should enter a long position.if self.__position is None:if cross.cross_above(self.__prices, self.__sma) > 0:shares = int(self.getBroker().getCash() * 0.9 / bars[self.__instrument].getPrice())# Enter a buy market order. The order is good till canceled.self.__position = self.enterLong(self.__instrument, shares, True)# Check if we have to exit the position.elif not self.__position.exitActive() and cross.cross_below(self.__prices, self.__sma) > 0:self.__position.exitMarket()from pyalgotrade import plotter
from pyalgotrade.barfeed import quandlfeed
from pyalgotrade.stratanalyzer import returns
#import sma_crossoverdata = quandl.build_feed("WIKI", ['ORCL'], 2000, 2000, ".")
# Load the bar feed from the CSV file
feed = quandlfeed.Feed()
feed.addBarsFromCSV("orcl", "WIKI-ORCL-2000-quandl.csv")# Evaluate the strategy with the feed's bars.
myStrategy = SMACrossOver(feed, "orcl", 20)# Attach a returns analyzers to the strategy.
returnsAnalyzer = returns.Returns()
myStrategy.attachAnalyzer(returnsAnalyzer)# Attach the plotter to the strategy.
plt = plotter.StrategyPlotter(myStrategy)
# Include the SMA in the instrument's subplot to get it displayed along with the closing prices.
plt.getInstrumentSubplot("orcl").addDataSeries("SMA", myStrategy.getSMA())
# Plot the simple returns on each bar.
plt.getOrCreateSubplot("returns").addDataSeries("Simple returns", returnsAnalyzer.getReturns())# Run the strategy.
myStrategy.run()
myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())from pyalgotrade.stratanalyzer import returns, sharpe, drawdown, trades
sharpe_ratio = sharpe.SharpeRatio()
myStrategy.attachAnalyzer(sharpe_ratio)#print('sharpe:',sharpe_ratio.getSharpeRatio(0))# Plot the strategy.
plt.plot()

再来看ailax积木式框架的实现:

'''
@author: 魏佳斌
@license: (C) Copyright 2018-2025, ailabx.com.@contact: 86820609@qq.com
@file: test_trading_env.py
@time: 2018-10-17 10:29
@desc:'''
import unittest,os
from quant.engine.trading_env import TradingEnv
from quant.engine.datafeed import DataFeed
from quant.engine.algos import *class TestTradingEnv(unittest.TestCase):def test_run_step(self):path = os.path.abspath(os.path.join(os.getcwd(), "../../data"))feed = DataFeed(data_path=path)feed.download_or_get_data(['ORCL',], 2000, 2000)long_expr = 'cross_up(close,ma(close,20))'flat_expr = 'cross_down(close,ma(close,20))'ma_cross = Strategy([SelectByExpr(long_expr=long_expr,flat_expr=flat_expr),WeighEqually(),Constraint({'max_weight':0.9})],name='均线交叉策略')env = TradingEnv(strategy=ma_cross,feed=feed)env.run_strategy()stra_stats = env.get_statistics()stats = [stra_stats]from quant.engine.trading_env import EnvUtilsutils =EnvUtils(stats=stats)utils.show_stats()

客观讲,ailabx只是做了一些配置。规则是通过两句表达式来给出,相当简洁:

long_expr = 'cross_up(close,ma(close,20))'
flat_expr = 'cross_down(close,ma(close,20))'m

项目在github上开源,欢迎star。

代码在github上开源ailabx

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/547317.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

移动端HTML5框架

一:移动端HTML5框架 http://jquerymobile.com/jQuery Mobilehttp://jqtjs.com/jQTouchhttp://www.sencha.com/products/touchSencha Touch二:三大框架区别 http://mobile.51cto.com/web-321296.htmhttp://www.leiphone.com/0907-warlial-html5-framework…

nodejs基于art-template模板引擎生成

基础核心代码 var template require(art-template);var tName new Date().getTime();var htmlT <!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title></title></head><body><h1>{…

Pyalgotrade量化交易回测框架

现在就开始干活了。先要测试一下pyalgotrade回测数据对不对。我找了个参照标准:在聚宽上开通了个账号&#xff0c;按入门教程写了个策略:2016-2018年每个交易日买入100股平安银行(000001)&#xff0c;回测结果如下: 现在用pyalgotrade来实现一下这个策略。先用tushare下载平安银…

1.4三态缓存(tristate buffer)与 多路复用器(Multiplexers)

首先解释名词。由于想了好多例子&#xff0c;结果发现没有太好的。于是换一种办法&#xff0c;直接上图和真值表。。这个东西就是多路复用器&#xff08;MUX&#xff09;从图中和真值表可以总结出&#xff1a;当s为0选择D0通过&#xff0c;也就是YD0&#xff0c;而不在乎D1上的…

art-template用户注册方法

应用场景nodejs Express框架&#xff0c;使用art-template模板引擎。 后台注册方法代码&#xff1a; var template require(art-template);template.helper(myRegFunc, function (str1, str2) {return "我是后台方法: " str1 str2;}); 前台使用&#xff1a; <…

如何导出已安装的安卓app为apk包

下载 “夜神模拟器” &#xff0c; 鼠标长安应用&#xff0c;拖拽到 “apk导出”处 即可

easyui-datagrid行数据field原样输出html标签

easyui-datagrid 绑定的行 field 原样输出html标签。处理效果如图&#xff1a; Html页面代码如下&#xff1a; ...<tr><th field"id" width"5" align"center">编号</th><th field"name" width"20" ali…

Mapreduce的排序、全排序以及二次排序

一&#xff1a;背景 Hadoop中虽然有自动排序和分组&#xff0c;由于自带的排序是按照Key进行排序的&#xff0c;有些时候&#xff0c;我们希望同时对Key和Value进行排序。自带的排序功能就无法满足我们了&#xff0c;还好Hadoop提供了一些组件可以让开发人员进行二次排序。 二…

webstorm使用技巧

WebStorm快捷键收集&#xff1a;模式visual studio 代码提示&#xff1a;ctrl alt 空格 代码补全&#xff1a;alt / 代码换行&#xff1a;ctrl shift 上下箭头 重新运行&#xff1a;ctrl F5 最近使用试图&#xff1a;ctrl E 围绕包裹代码&#xff1a; ctrl alt …

iOS7时代我们用什么来追踪和识别用户?

要识别用户&#xff0c;首先就是要选择一个标识符&#xff0c;通过这个标识符来识别这个用户的设备&#xff08;而不是用户&#xff09;&#xff0c;这个标识符要能够保证一个设备上返回的值是一样的&#xff0c;并且在其他设备上不会出现相同的值。 在iOS7之前&#xff0c;曾经…

Python爬虫淘宝商品详情页价格、类似数据

在讲爬取淘宝详情页数据之前&#xff0c;先来介绍一款 Chrome 插件&#xff1a;Toggle JavaScript (它可以选择让网页是否显示 js 动态加载的内容)&#xff0c;如下图所示&#xff1a; 当这个插件处于关闭状态时&#xff0c;待爬取的页面显示的数据如下: 当这个插件处于打开状态…

js提取正则中的字符串

代码如下&#xff1a; var results data.match(/(start).*?()/);if (results ! null){console.log(data[0]);}

微信公众号开发(—)接口与服务器关联

微信公众号开发(—) 以下都是借鉴的微信公众平台的文档加老师指点和自行的理解。 1.一台有微信的手机.(别问我老人机可以不 有微信就可以&#xff01;&#xff01;&#xff01;) 2.需要有一个微信公众平台的测试号&#xff08;订阅号,服务号也可以按自己需求来&#xff09;. 3.…

让zabbix图像中文不再是乱码

默认的&#xff0c;如果想要给zabbix的图像起个中文名&#xff0c;那么当你兴致勃勃的看图像时&#xff0c;会发现中文的地方都是乱码。怎么办呢&#xff1f;首先&#xff0c;从你的windows机器的控制面板—字体中选择一个中文字符集&#xff0c;然后上传至zabbix服务器的wwwro…

nodejs支持ssi实现include shtml页面

express 对于include的代码默认不处理&#xff0c;直接输出&#xff0c;没办法执行include的内容&#xff0c;但可以通过Nginx实现。 1、 配置nginx设置开启ssi模式。 server {…ssi on;ssi_silent_errors on;ssi_types text/shtml;… 2、添加include页面 <!--# include vi…

Windows PC软件反编译逆向破解

文章目录 一.OllyDbg工具简介二.OllyDbg分析Crakeme示例1三.OllyDbg分析Crakeme示例2四.总结作者的github资源&#xff1a; 系统安全&#xff1a;https://github.com/eastmountyxz/SystemSecurity-ReverseAnalysis网络安全&#xff1a;https://github.com/eastmountyxz/Networ…

微信公众号天气与聊天机器人小功能

微信公众号小功能 以下都是借鉴的微信公众平台的文档加老师指点和自行的理解。 &#xff08;1&#xff09;微信公众号发送地区回复现在和未来五天天气情况 &#xff08;2&#xff09;发送语音和智能机器人聊天 一、调用天气预报接口 实现微信公众号发送地区回复现在和未来五天…

如何实现:判断数据库中某表是否有记录,若为空,则插入一条记录。若不为空则查询某记录...

select count(*) as num1 from tableif num1 0insert into ...elseselect * from table.... SQL的过程如下&#xff1a;Select top 1 * from tableif rowcount>0 --上一次影响条数 insert into Table --插入语句else Select * from Table --查询转载于:https:/…

安卓app逆向破解脱壳教程

From&#xff1a;Hook 神器家族的 Frida 工具使用详解&#xff1a;https://blog.csdn.net/FlyPigYe/article/details/90258758 详解 Hook 框架 frida ( 信抢红包 )&#xff1a;https://www.freebuf.com/company-information/180480.html APP逆向神器之Frida【Android初级篇】…

nodejs生成多层目录和生成文件的通用方法

/***生成多层目录* param dir 多层目录* param split 分隔符&#xff0c;ex:/ 对应的目录地址:2015/10/10* param mode 目录权限&#xff08;读写权限&#xff09;&#xff0c;默认0777* param callback*/var createDirsSync function (dir, split, mode, callback) {console.…