关闭

pyalgotrade教程2--第一笔交易

标签: pyalgotrade量化投资
7423人阅读 评论(0) 收藏 举报
分类:

        最快的速度扫描了一遍pyalgotrade的文档,从可理解性角度来讲,确实比backtrader好很多,但是功能方面似乎就有缺失了。功能缺失也有好处,就是能够更加灵活,不用再受到文档描述不清楚,不了解功能怎么用的痛苦了吧。

1.pyalgotrade的交易

        这里,还是老样子,用简单的SMA策略来学习一下pyalgotrade的基本交易方法。当现在价格上穿SMA时,开多单;当现在的价格,下穿SMA时,平掉先前的多头头寸。

    def onBars(self, bars):# 每一个数据都会抵达这里,就像becktest中的next
        # SMA的计算存在窗口,所以前面的几个bar下是没有SMA的数据的.
        if self.__sma[-1] is None:
            return
        #bar.getTyoicalPrice = (bar.getHigh() + bar.getLow() + bar.getClose())/ 3.0

        bar = bars[self.__instrument]
        # If a position was not opened, check if we should enter a long position.
        if self.__position is None:# 如果手上没有头寸,那么
            if bar.getPrice() > self.__sma[-1]:
                # 开多,如果现价大于移动均线,且当前没有头寸.
                self.__position = self.enterLong(self.__instrument, 100, True)
        # 当前有多头头寸,平掉多头头寸.
        elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():
            self.__position.exitMarket()
        这一部分基本就是交易逻辑。

enterLong(self.__instrument, 100, True)
        这就是开多单的命令,第一个就是开多单的标的,100是下单数目,最后一个是allOrNone参数,也就是说,是不是要么全部成交,要么一个不成,默认是false。

与backtrader一样,也存在各种各样的订单监听函数,

    def onEnterOk(self, position):
        execInfo = position.getEntryOrder().getExecutionInfo()
        self.info("BUY at %.2f" % (execInfo.getPrice()))

    def onEnterCanceled(self, position):
        self.__position = None

    def onExitOk(self, position):
        execInfo = position.getExitOrder().getExecutionInfo()
        self.info("SELL at $%.2f" % (execInfo.getPrice()))
        self.__position = None

    def onExitCanceled(self, position):
        # If the exit was canceled, re-submit it.
        self.__position.exitMarket()

        基本都是大同小异,功能上没有什么实质性区别。

2.SMA策略示例完整代码

# coding=utf-8
from pyalgotrade import strategy
from pyalgotrade.bar import Frequency
from pyalgotrade.barfeed.csvfeed import GenericBarFeed
from pyalgotrade.technical import ma
# 1.构建一个策略
class MyStrategy(strategy.BacktestingStrategy):
    def __init__(self, feed, instrument):
        super(MyStrategy, self).__init__(feed)
        self.__position  = None
        self.__sma = ma.SMA(feed[instrument].getCloseDataSeries(), 150)
        self.__instrument = instrument
        self.getBroker()
    def onEnterOk(self, position):
        execInfo = position.getEntryOrder().getExecutionInfo()
        self.info("BUY at %.2f" % (execInfo.getPrice()))

    def onEnterCanceled(self, position):
        self.__position = None

    def onExitOk(self, position):
        execInfo = position.getExitOrder().getExecutionInfo()
        self.info("SELL at $%.2f" % (execInfo.getPrice()))
        self.__position = None

    def onExitCanceled(self, position):
        # If the exit was canceled, re-submit it.
        self.__position.exitMarket()


    def onBars(self, bars):# 每一个数据都会抵达这里,就像becktest中的next
        # SMA的计算存在窗口,所以前面的几个bar下是没有SMA的数据的.
        if self.__sma[-1] is None:
            return
        #bar.getTyoicalPrice = (bar.getHigh() + bar.getLow() + bar.getClose())/ 3.0

        bar = bars[self.__instrument]
        # If a position was not opened, check if we should enter a long position.
        if self.__position is None:# 如果手上没有头寸,那么
            if bar.getPrice() > self.__sma[-1]:
                # 开多,如果现价大于移动均线,且当前没有头寸.
                self.__position = self.enterLong(self.__instrument, 100, True)
        # 当前有多头头寸,平掉多头头寸.
        elif bar.getPrice() < self.__sma[-1] and not self.__position.exitActive():
            self.__position.exitMarket()

# 2.获得回测数据,官网来源于yahoo,由于墙的关系,我们用本地数据
feed = GenericBarFeed(Frequency.DAY, None, None)
feed.addBarsFromCSV("fd", "fd.csv")

# 3.把策略跑起来

myStrategy = MyStrategy(feed, "fd")
myStrategy.run()
myStrategy.info("Final portfolio value: $%.2f" % myStrategy.getResult())
        最后,我们看到把myStrategy.getResult()输出,就可以看到最后我们的资产净值。
2015-08-14 00:00:00 strategy [INFO] BUY at 3976.41
2015-08-19 00:00:00 strategy [INFO] SELL at $3646.80
2016-07-13 00:00:00 strategy [INFO] BUY at 3049.51
2016-08-02 00:00:00 strategy [INFO] SELL at $2950.08
2016-08-03 00:00:00 strategy [INFO] BUY at 2963.22
2016-12-30 00:00:00 strategy [INFO] Final portfolio value: $1394503.20




0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

pyalgotrade教程3--策略结果可视化与评价指标

pyalgotrade教程3--可视化与评价指标
  • qtlyx
  • qtlyx
  • 2017-06-24 14:51
  • 2171

pyalgotrade教程4--broker设置:交易费用,滑点模型

前面,我们完全没有考虑交易的手续费、交易的滑点等等。而实际在回测的时候,这些都是要实实在在考虑的因素。pyalgotrade里面通过实现一个broker类,来完成这一系列的设置。 1.broker设置...
  • qtlyx
  • qtlyx
  • 2017-06-25 17:45
  • 1938

pyalgotrade教程5--多标的策略

pyalgotrade相比于zipline而言,对于多个标的的投资,似乎是薄弱了一点,但也并不是不行呀。既然是多标的策略,那么肯定有多个csv的add,其实逻辑是很简单,就直接上demo吧,反正很好理...
  • qtlyx
  • qtlyx
  • 2017-06-26 21:17
  • 1481

pyalgotrade教程4--broker设置:交易费用,滑点模型

前面,我们完全没有考虑交易的手续费、交易的滑点等等。而实际在回测的时候,这些都是要实实在在考虑的因素。pyalgotrade里面通过实现一个broker类,来完成这一系列的设置。 1.broker设置...
  • qtlyx
  • qtlyx
  • 2017-06-25 17:45
  • 1938

淘宝开店的第一笔坎坷的交易

我刚刚在淘宝网上开了个小店,就是兼职的那种,也没有太多的时间守在电脑旁边,店面没怎么设计,唯一的优势就是有好的货源,家里可以通过关系上到便宜的正品货。然后就发了两个宝贝儿在上面,一种比较好的品牌的眼线...
  • sc505256478
  • sc505256478
  • 2011-09-26 23:21
  • 460

【量亿数据-金融数据-量化交易】PyAlgoTrade框架研究

最近研究量化交易,看了几个回测的框架,最后盯上PyAlgoTrade这个项目。感觉很不错,支持 策略回测和实盘交易,提供全面的技术分析接口,算是python的量化交易框架里比较出色的作品。所以对这个...
  • weixin_37997007
  • weixin_37997007
  • 2017-07-05 17:54
  • 154

pyalgotrade教程3--策略结果可视化与评价指标

pyalgotrade教程3--可视化与评价指标
  • qtlyx
  • qtlyx
  • 2017-06-24 14:51
  • 2171

vn.trader使用教程系列2-基础交易

原创文章,转载请注明出处:用Python的交易员 窗口组件 双击vn.trader文件夹下的vtMain.py后,会看到以上的程序主窗口,无法双击的用户一般是Anaconda安装时...
  • Trader_Python
  • Trader_Python
  • 2016-10-19 10:07
  • 3998

pyalgotrade教程5--多标的策略

pyalgotrade相比于zipline而言,对于多个标的的投资,似乎是薄弱了一点,但也并不是不行呀。既然是多标的策略,那么肯定有多个csv的add,其实逻辑是很简单,就直接上demo吧,反正很好理...
  • qtlyx
  • qtlyx
  • 2017-06-26 21:17
  • 1481

Python量化交易平台开发教程系列8-顶层GUI界面开发(2)

原创文章,转载请注明出处:用Python的交易员 前言 接上一篇,主要分为两块:展示动态语言特性简化GUI开发的组件以及功能调用组件。 动态语言的方便之处 ##########...
  • Trader_Python
  • Trader_Python
  • 2016-10-19 10:04
  • 1314
    个人资料
    • 访问:290644次
    • 积分:4240
    • 等级:
    • 排名:第8366名
    • 原创:161篇
    • 转载:30篇
    • 译文:0篇
    • 评论:182条
    欢迎

    个人微信号:luxiaoran0178

    量化知乎专栏:https://zhuanlan.zhihu.com/lyx-quant

    个人邮箱:qtluyixiao@163.com

    个人运营公众号:请搜索:tebs

    博客专栏
    最新评论