量化投资学习(1):第一个策略
2018-03-23 21:00
162 查看
可以自己import我们平台支持的第三方python模块,比如pandas、numpy等。 在这个方法中编写任何的初始化逻辑。context对象将会在你的算法策略的任何方法之间做传递。 def init(context) context.s1='000001.XSHE' 你所选择的证券的每一个交易数据更新,都将会触发此段逻辑 def handle_bar(context,bar_dict) 开始编写你的主要的算法逻辑 bar_dict[order_book_id] 可以拿到某个证券的bar信息 context.portfolio 可以拿到现在的投资组合状态信息 使用order_shares(id_or_ins,amout) 方法进行落单 TODO: 开始编写你的算法把 order_shares(context,s1,1000) order_shares(context.s1,1000)
每一个交易策略都需要定义init和handle_bar两个方法。在每次创建一个新的策略的时候,都会自动生成,你只需要在每个方法中填入你自己策略逻辑就可以了。
在策略运行的时候init方法会先于其它所有方法运行,且只运行一次。handle_bar在每次数据更新的时候会运行一次。比如说每日回测,在你限定的交易时间范围内,从最早的交易日到最新的交易日,按时间序列先后,每次数据更新都会运行一次handle_bar方法。
在init方法中,你可以看到我们传入了一个context参数,它是一个Python Dictionary。简单来讲,context就是一个字典,其中包含了很多变量,并可以不断往context里面加入变量。比如下面的例子就是用户在context中加入了一个stockcode变量,并把它赋值为”000001.XSHE”,之所以使用引号,表示的是stockcode变量的值为字符串类型,用于区别其它类型。update_universe用来订阅所有你感兴趣的股票。
def init(context) context.stockcode="000001.XSHE" context.stockcode1="000024.XSHE" update_universe([context.stockcode,context.stockcode2])
handle_bar的其中一个参数也是context,它其实是和init方法中的参数是同一个,因为init方法优先于其他任何方法,所以如果你需要定义一些变量,使得它们能穿梭于其他方法并被调用,那么你就可以采取往context中加入新的变量来达到需求
下面来介绍handle_bar中的另一个参数bar_dict,它也是一个字典,包含了每次数据更新的时候所有属性的值,比如说开盘价 (open), 收盘价 (close)等值,你可以参考Bar对象查看它所有的属性。
def handle_bar(context, bar_dict): order_book = bar_dict[context.stockcode].order_book_id open_price = bar_dict[context.stockcode].open close_price = bar_dict[context.stockcode].close MA20 = bar_dict[context.s1].mavg(20, frequency='day') ...
mavg(intervals,frequency=’day’)方法可以用来计算简单移动平均值。
下面来详细讲解如何利用简单移动平均线来写一个简单的金叉策略
移动平均线是一个广为使用的指标,其中最为基础的是简单移动均线 (simple moving average)。每天都会计算平均值,比如说10日均线,就是每天计算过去10日的平均值。随着时间推移,最开始的值会被更新的值取代,结果体现为平均值是随着时间移动。
图中的绿线为收盘价的走势图,红色线为它的20日简单均线图,紫色线为收盘价的50日简单均线图。你会发现当20日的均线往上穿过50日均线,收盘价会有上升趋势,那我们可以在交叉点出现时买入该股票。当20日均线向下穿过50日均线时,收盘价会有下降趋势,那我们可以在交叉点出现时卖出该股票。
首先,我们要先完成init的初始化,在这策略里我们选取一只股票,使用两条均线
def init(context): context.s1="000001.XSHE" update_universe([context.s1])
接下来,在每一个handle_bar里,我们需要完成当天的长均线和短均线的计算。
def handle_bar(context,bar_dict) MA_short=bar_dict[context.s1].mavg(20,frequency='day') MA_long=bar_dict[context.s1].mavg(50,frequency='day')
我们在获得均值之后,可以进一步按照金叉的逻辑预测来买卖股票,但需要注意的地方是:在买入时,需要计算我们现在持有的仓位,在卖出时,需要计算现有的资金能购买多少share的股票,对于portfolio和positions的属性计算可以参考Portfolio对象和Position对象
计算现在portfolio中股票的仓位 current_position=context.portfolio.positions[context.s1].quantity 计算现在portfolio中的现金可以购买多少股票 shares=context.portfolio.cash/bar_dict[context.s1].close
参考:https://www.ricequant.com/community/topic/169/
相关文章推荐
- 量化投资学习(2):金叉策略
- 量化投资学习【常见策略】海龟交易系统
- django编写第一个博客学习笔记(一)
- 学习struts2的第一个小实例
- Mybatis学习笔记-第一个增删改查的程序
- Hibernate学习笔记之主键生成策略和SchemaExport
- 第一个学习笔记
- 设计模式学习笔记-策略模式
- 【学习ARToolkit小记之八】 开发第一个ARToolkit程序(Developing your First Application)(续2)
- 集群与负载均衡技术学习笔记一 负载均衡策略
- 学习C#,开始了我的第一个进程。
- 深度学习框架TensorFlow学习总结-----第一个代码就是BUG
- 学习C#的第一个程序:笔记查找与记录
- Android学习——在Android中使用OpenCV的第一个程序
- Android:日常学习笔记(2)——分析第一个Android应用程序
- silverlight学习日记--第一个试水架构
- 张志宇 SERVELET JSP学习讲义-我的第一个Servlet
- 汇编语言学习——第四章 第一个汇编程序
- Objective-C学习-如何使用Xcode4.2和Interface Builder创建自己第一个界面产品
- netty学习八:在window上安装thrift以及第一个小demo