JoinQuant策略代码示例
- 总体回测前
'''
================================================================================
总体回测前
================================================================================
'''
#总体回测前要做的事情
def initialize(context):
set_params() #1设置策参数
set_variables() #2设置中间变量
set_backtest() #3设置回测条件 #
#设置策略参数
def set_params():
g.tc=15 # 调仓频率
g.N=4 #持仓数目
g.security = ["000001.XSHE","000002.XSHE","000006.XSHE","000007.XSHE","000009.XSHE"]#设置股票池 #
#设置中间变量
def set_variables():
return #
#设置回测条件
def set_backtest():
set_option('use_real_price', True) #用真实价格交易
log.set_level('order', 'error')
- 每天开盘前
'''
================================================================================
每天开盘前
================================================================================
'''
#每天开盘前要做的事情
def before_trading_start(context):
set_slip_fee(context) #4
# 根据不同的时间段设置滑点与手续费
def set_slip_fee(context):
# 将滑点设置为0
set_slippage(FixedSlippage(0))
# 根据不同的时间段设置手续费
dt=context.current_dt if dt>datetime.datetime(2013,1, 1):
set_commission(PerTrade(buy_cost=0.0003, sell_cost=0.0013, min_cost=5)) elif dt>datetime.datetime(2011,1, 1):
set_commission(PerTrade(buy_cost=0.001, sell_cost=0.002, min_cost=5)) elif dt>datetime.datetime(2009,1, 1):
set_commission(PerTrade(buy_cost=0.002, sell_cost=0.003, min_cost=5)) else:
set_commission(PerTrade(buy_cost=0.003, sell_cost=0.004, min_cost=5))
- 每天交易时(以双均线策略为例)
'''
================================================================================
每天交易时
================================================================================
'''
def handle_data(context, data):
# 将总资金等分为g.N份,为每只股票配资
capital_unit = context.portfolio.portfolio_value/g.N
toSell = signal_stock_sell(context,data)
toBuy = signal_stock_buy(context,data)
# 执行卖出操作以腾出资金
for i in range(len(g.security)):
if toSell[i]==1:
order_target_value(g.security[i],0)
# 执行买入操作
for i in range(len(g.security)):
if toBuy[i]==1:
order_target_value(g.security[i],capital_unit)
if not (1 in toBuy) or (1 in toSell):
# log.info("今日无操作")
send_message("今日无操作") #
#获得卖出信号
#输入:context, data
#输出:sell - list
def signal_stock_sell(context,data):
sell = [0]*len(g.security)
for i in range(len(g.security)):
# 算出今天和昨天的两个指数移动均线的值,我们这里假设长线是60天,短线是1天(前一天的收盘价)
(ema_long_pre,ema_long_now) = get_EMA(g.security[i],60,data)
(ema_short_pre,ema_short_now) = get_EMA(g.security[i],1,data)
# 如果短均线从上往下穿越长均线,则为死叉信号,标记卖出
if ema_short_now < ema_long_now and ema_short_pre > ema_long_pre and context.portfolio.positions[g.security[i]].sellable_amount > 0:
sell[i]=1
return sell #
#获得买入信号
#输入:context, data
#输出:buy - list
def signal_stock_buy(context,data):
buy = [0]*len(g.security)
for i in range(len(g.security)):
# 算出今天和昨天的两个指数移动均线的值,我们这里假设长线是60天,短线是1天(前一天的收盘价)
(ema_long_pre,ema_long_now) = get_EMA(g.security[i],60,data)
(ema_short_pre,ema_short_now) = get_EMA(g.security[i],1,data)
# 如果短均线从下往上穿越长均线,则为金叉信号,标记买入
if ema_short_now > ema_long_now and ema_short_pre < ema_long_pre and context.portfolio.positions[g.security[i]].sellable_amount == 0 :
buy[i]=1
return buy #
# 计算移动平均线数据
# 输入:股票代码-字符串,移动平均线天数-整数
# 输出:算术平均值-浮点数
def get_MA(security_code,days):
# 获得前days天的数据,详见API
a=attribute_history(security_code, days, '1d', ('close'))
# 定义一个局部变量sum,用于求和
sum=0
# 对前days天的收盘价进行求和
for i in range(1,days+1):
sum+=a['close'][-i]
# 求和之后除以天数就可以的得到算术平均值啦
return sum/days #
# 计算指数移动平均线数据
# 输入:股票代码-字符串,移动指数平均线天数-整数,data
# 输出:今天和昨天的移动指数平均数-浮点数
def get_EMA(security_code,days,data):
# 如果只有一天的话,前一天的收盘价就是移动平均
if days==1:
# 获得前两天的收盘价数据,一个作为上一期的移动平均值,后一个作为当期的移动平均值
t = attribute_history(security_code, 2, '1d', ('close'))
return t['close'][-2],t['close'][-1]
else:
# 如果全局变量g.EMAs不存在的话,创建一个字典类型的变量,用来记录已经计算出来的EMA值
if 'EMAs' not in dir(g):
g.EMAs={}
# 字典的关键字用股票编码和天数连接起来唯一确定,以免不同股票或者不同天数的指数移动平均弄在一起了
key="%s%d" %(security_code,days)
# 如果关键字存在,说明之前已经计算过EMA了,直接迭代即可
if key in g.EMAs:
#计算alpha值
alpha=(days-1.0)/(days+1.0)
# 获得前一天的EMA(这个是保存下来的了)
EMA_pre=g.EMAs[key]
# EMA迭代计算
EMA_now=EMA_pre*alpha+data[security_code].close*(1.0-alpha)
# 写入新的EMA值
g.EMAs[key]=EMA_now
# 给用户返回昨天和今天的两个EMA值
return (EMA_pre,EMA_now)
# 如果关键字不存在,说明之前没有计算过这个EMA,因此要初始化
else:
# 获得days天的移动平均
ma=get_MA(security_code,days)
# 如果滑动平均存在(不返回NaN)的话,那么我们已经有足够数据可以对这个EMA初始化了
if not(isnan(ma)):
g.EMAs[key]=ma
# 因为刚刚初始化,所以前一期的EMA还不存在
return (float("nan"),ma)
else:
# 移动平均数据不足days天,只好返回NaN值
return (float("nan"),float("nan"))
- 每天收盘后
'''
================================================================================
每天收盘后
================================================================================
'''
# 每日收盘后要做的事情(本策略中不需要)
def after_trading_end(context):
return
JoinQuant策略代码示例的更多相关文章
- 位置信息类API调用的代码示例合集:中国省市区查询、经纬度地址转换、POI检索等
以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 中国省市区查询:2017最新中国省市区地址 经纬度地址转换:经纬度 ...
- MapReduce框架结构及代码示例
一个完整的 mapreduce 程序在分布式运行时有三类实例进程: 1.MRAppMaster:负责整个程序的过程调度及状态协调 2.MapTask:负责 map 阶段的整个数据处理流程 3.Redu ...
- Spring 注解学习 详细代码示例
学习Sping注解,编写示例,最终整理成文章.如有错误,请指出. 该文章主要是针对新手的简单使用示例,讲述如何使用该注释,没有过多的原理解析. 已整理的注解请看右侧目录.写的示例代码也会在结尾附出. ...
- 高级渲染技巧和代码示例 GPU Pro 7
下载代码示例 移动设备正呈现着像素越来越高,屏幕尺寸越来越小的发展趋势. 由于像素着色的能耗非常大,因此 DPI 的增加以及移动设备固有的功耗受限环境为降低像素着色成本带来了巨大的压力. MSAA 有 ...
- Java8-Function使用及Groovy闭包的代码示例
导航 定位 概述 代码示例 Java-Function Groovy闭包 定位 本文适用于想要了解Java8 Function接口编程及闭包表达式的筒鞋. 概述 在实际开发中,常常遇到使用模板模式的场 ...
- [IOS 开发] 懒加载 (延迟加载) 的基本方式,好处,代码示例
懒加载的好处: 1> 不必将创建对象的代码全部写在viewDidLoad方法中,代码的可读性更强 2> 每个属性的getter方法中分别负责各自的实例化处理,代码彼此之间的独立性强,松耦合 ...
- SELECT控件操作的JS代码示例
SELECT控件操作的JS代码示例 1 检测是否有选中 if(objSelect.selectedIndex > -1) { //说明选中 } else { //说明没有选中 } 2.动态创建s ...
- 转:HIBERNATE一些_方法_@注解_代码示例---写的非常好
HIBERNATE一些_方法_@注解_代码示例操作数据库7步骤 : 1 创建一个SessionFactory对象 2 创建Session对象 3 开启事务Transaction : hibernate ...
- Python实现各种排序算法的代码示例总结
Python实现各种排序算法的代码示例总结 作者:Donald Knuth 字体:[增加 减小] 类型:转载 时间:2015-12-11我要评论 这篇文章主要介绍了Python实现各种排序算法的代码示 ...
随机推荐
- 在 CentOS7 安装 ELK【转】
ELK是一个成熟的日志系统,主要功能有收集.分析.检索,详细见 elastic官网. 本文主要介绍如何在CentOS7下安装最新版本的ELK,当然现在docker已经有完全配置成功的elk容器,安装配 ...
- mysql安装等操作
CentOS 6.5系统中安装配置MySQL数据库 卸载掉原有mysql rpm -qa | grep mysql // 这个命令就会查看该操作系统上是否已经安装了mysql数据库 rpm -e my ...
- linker 错误解决办法 地图
- File类、递归
File类.递归 1.1File类概述 java.io.File表示文件和目录路径名的抽象类.可以对文件和文件夹进行创建删除.获取.判断.遍历等功能. 1.2路径\文件分割符,相对路径绝度路径 1.2 ...
- LeetCode初级算法(动态规划+设计问题篇)
目录 爬楼梯 买卖股票的最佳时机 最大子序和 打家劫舍 动态规划小结 Shuffle an Array 最小栈 爬楼梯 第一想法自然是递归,而且爬楼梯很明显是一个斐波拉切数列,所以就有了以下代码: c ...
- not null 非空约束
例子:create table tb1( id int, name varchar(20) not null); 注意 空字符不等于null #手动,添加非空约束 (必须这个字段,没 ...
- jquery——解决鼠标移入移出导致盒子不停移动的bug
使用mouseover().mouseout()时会出现这样一种情况,鼠标快速多次移入移出后这个盒子会在鼠标不动后继续运动 代码如下: <!DOCTYPE html> <html l ...
- 【Java密码学】使用Bouncy Castle生成数字签名、数字信封
Bouncy Castle(轻量级密码术包)是一种用于 Java 平台的开放源码的轻量级密码术包,它支持大量的密码术算法,并提供 JCE 1.2.1 的实现.最近项目上正好用到了Bouncy Cast ...
- 程序员从初级到中级10个秘诀——摘自CSDN
程序员从初级到中级10个秘诀 1.学习先进的搜索技术.手段和及策略 2.帮助别人 教别人始终是学习一切东西的最好方法之一.相对而言,由于你在开发领域还是个新手,认为自己没什么可教给人家的,这可以理解. ...
- Spring Cloud(3):Ribbon的使用
基于搭建好的Eureka Server+Eureka Client:https://www.cnblogs.com/xuyiqing/p/10861541.html 有了服务,那么现在学习如何调用服务 ...