代码

# 克隆自聚宽文章:https://www.joinquant.com/post/20590
# 标题:ETF单均线跟踪轮动
# 作者:那時花開海布裡 '''
=================================================
总体回测前设置参数和回测
=================================================
'''
def initialize(context):
set_params() #1设置策参数
set_variables() #2设置中间变量
set_backtest() #3设置回测条件 #1 设置参数
def set_params():
# 设置基准收益
set_benchmark('000300.XSHG')
g.lag = 13
g.hour = 14
g.minute = 25 g.hs = '000300.XSHG' #300指数
g.zz = '399006.XSHE'#创业板指数
g.sz = '000016.XSHG' #50指数 g.ETF300 = '000300.XSHG'#'300指数
g.ETF500 = '399006.XSHE'#'300指数
g.ETF50 = '000016.XSHG' #50指数
g.ETFrili = '511880.XSHG' #银华日利 #2 设置中间变量
def set_variables():
return #3 设置回测条件
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):
# 获得当前时间
hour = context.current_dt.hour
minute = context.current_dt.minute # 每天收盘时调整仓位
if hour == g.hour and minute == g.minute:
signal = get_signal(context) if signal == 'sell_the_stocks':
sell_the_stocks(context)
print(context.portfolio.positions[g.ETFrili].total_amount)
elif signal == 'ETF300' or signal == 'ETF500':
buy_the_stocks(context,signal)
elif signal == 's500b300':
sell_the_stocks(context)
buy_the_stocks(context,'ETF300')
elif signal == 'sell_the_stocks':
sell_the_stocks(context)
buy_the_stocks(context,'ETF500')
elif signal == 's500b50':
sell_the_stocks(context)
buy_the_stocks(context,'ETF50')
elif signal == 's300b50':
sell_the_stocks(context)
buy_the_stocks(context,'ETF50')
elif signal == 's50b300':
sell_the_stocks(context)
buy_the_stocks(context,'ETF300')
elif signal == 's50b500':
sell_the_stocks(context)
buy_the_stocks(context,'ETF500')
#5
#获取信号
def get_signal(context): #沪深300与创业板和上证50的当前股价
hs300,cp300,av300 = getStockPrice(g.hs, g.lag)
zz500,cp500,av500 = getStockPrice(g.zz, g.lag)
sz50,cp50,av50 = getStockPrice(g.sz, g.lag)
#计算前13日变动
hs300increase = (cp300 - hs300) / hs300
zz500increase = (cp500 - zz500) / zz500
sz50increase = (cp50 - sz50) / sz50 hold300 = context.portfolio.positions[g.ETF300].total_amount
hold500 = context.portfolio.positions[g.ETF500].total_amount
hold50 = context.portfolio.positions[g.ETF50].total_amount if (hold300>0 and cp300<av300 and cp500<av500 and cp50<av50) or (hold500>0 and cp300<av300 and cp500<av500 and cp50<av50 ) or (hold50>0and cp300<av300 and cp500<av500 and cp50<av50):
return 'sell_the_stocks' elif hs300increase>zz500increase and hs300increase>sz50increase and (hold300==0 and hold500==0 and hold50==0) and cp300>av300:
return 'ETF300'
elif zz500increase>hs300increase and zz500increase>sz50increase and (hold50==0 and hold300==0 and hold500==0) and cp500>av500:
return 'ETF500'
elif sz50increase>hs300increase and sz50increase>zz500increase and (hold50==0 and hold300==0 and hold500==0) and cp500>av500:
return 'ETF50' elif hold500>0 and zz500increase<hs300increase and hs300increase>sz50increase and cp300>av300:
return 's500b300'
elif hold500>0 and zz500increase<sz50increase and hs300increase<sz50increase and cp50>av50:
return 's500b50'
elif hold300>0 and zz500increase>hs300increase and zz500increase>sz50increase and cp500>av500:
return 's300b500'
elif hold300>0 and sz50increase>hs300increase and sz50increase>zz500increase and cp50>av50:
return 's300b50'
elif hold50>0 and hs300increase>sz50increase and hs300increase>zz500increase and cp300>av300:
return's50b300'
elif hold50>0 and zz500increase>sz50increase and zz500increase>hs300increase and cp500>av500:
return's50b500' #6
#取得股票某个区间内的所有收盘价(用于取前13日和当前价格)
def getStockPrice(stock, interval):
h = attribute_history(stock, interval*240, unit='1m', fields=('close'), skip_paused=True)
return (h['close'].values[0],h['close'].values[-1],h['close'].mean()) def getCurrentPrice(stock):
h= attribute_history(stock, 1, unit='1m', fields=('close'), skip_paused=True)
return (h['close'].values[-1]) #7
#卖出股票
def sell_the_stocks(context):
for stock in context.portfolio.positions.keys():
return (log.info("Selling %s" % stock), order_target_value(stock, 0),order_value('511880.XSHG', context.portfolio.cash)) #8
#买入股票
def buy_the_stocks(context,signal):
holdrili = context.portfolio.positions[g.ETFrili].total_amount
prili = getCurrentPrice(g.ETFrili)
if holdrili ==0 :
return (log.info("Buying %s"% signal ),order_value(eval('g.%s'% signal), context.portfolio.cash))
elif holdrili !=0:
return (log.info("Buying %s"% signal ),order_target_value(g.ETFrili, 0),order_value(eval('g.%s'% signal), holdrili*prili))
'''
=================================================
每日收盘后(本策略中不需要)
=================================================
'''
def after_trading_end(context):
return

代码, 清晰版

# 克隆自聚宽文章:https://www.joinquant.com/post/20590
# 标题:ETF单均线跟踪轮动
# 作者:那時花開海布裡 '''
=================================================
总体回测前设置参数和回测
=================================================
'''
def initialize(context):
set_params() #1设置策参数
set_variables() #2设置中间变量
set_backtest() #3设置回测条件 #1 设置参数
def set_params():
# 设置基准收益
set_benchmark('000300.XSHG')
g.lag = 13
g.hour = 14
g.minute = 25 g.hs = '000300.XSHG' #300指数
g.zz = '399006.XSHE'#创业板指数
g.sz = '000016.XSHG' #50指数 g.ETF300 = '000300.XSHG'#'300指数
g.ETF500 = '399006.XSHE'#'300指数
g.ETF50 = '000016.XSHG' #50指数
g.ETFrili = '511880.XSHG' #银华日利 #2 设置中间变量
def set_variables():
return #3 设置回测条件
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):
# 获得当前时间
hour = context.current_dt.hour
minute = context.current_dt.minute # 每天收盘时调整仓位
if hour == g.hour and minute == g.minute:
signal = get_signal(context) if signal == 'sell_the_stocks':
sell_the_stocks(context)
print(context.portfolio.positions[g.ETFrili].total_amount)
elif signal == 'ETF300' or signal == 'ETF500':
buy_the_stocks(context,signal)
elif signal == 's500b300':
sell_the_stocks(context)
buy_the_stocks(context,'ETF300')
elif signal == 'sell_the_stocks':
sell_the_stocks(context)
buy_the_stocks(context,'ETF500')
elif signal == 's500b50':
sell_the_stocks(context)
buy_the_stocks(context,'ETF50')
elif signal == 's300b50':
sell_the_stocks(context)
buy_the_stocks(context,'ETF50')
elif signal == 's50b300':
sell_the_stocks(context)
buy_the_stocks(context,'ETF300')
elif signal == 's50b500':
sell_the_stocks(context)
buy_the_stocks(context,'ETF500')
#5
#获取信号
def get_signal(context): #沪深300与创业板和上证50的当前股价
hs300,cp300,av300 = getStockPrice(g.hs, g.lag)
zz500,cp500,av500 = getStockPrice(g.zz, g.lag)
sz50,cp50,av50 = getStockPrice(g.sz, g.lag)
#计算前13日变动
hs300increase = (cp300 - hs300) / hs300
zz500increase = (cp500 - zz500) / zz500
sz50increase = (cp50 - sz50) / sz50 hold300 = context.portfolio.positions[g.ETF300].total_amount
hold500 = context.portfolio.positions[g.ETF500].total_amount
hold50 = context.portfolio.positions[g.ETF50].total_amount dpj = zz500increase<sz50increase and hs300increase<sz50increase and cp50>av50
zpj = zz500increase<hs300increase and hs300increase>sz50increase and cp300>av300
xpj = zz500increase>hs300increase and zz500increase>sz50increase and cp500>av500 pos_isEmpty = (hold300==0 and hold500==0 and hold50==0)
all_isDown = (cp300<av300 and cp500<av500 and cp50<av50) #if (hold300>0 and all_isDown) or \
# (hold500>0 and all_isDown) or \
# (hold50>0 and all_isDown):
if (not pos_isEmpty) and all_isDown:
return 'sell_the_stocks' elif pos_isEmpty:
if zpj:
return 'ETF300'
elif xpj:
return 'ETF500'
elif dpj:
return 'ETF50' elif hold500>0 and zpj:
return 's500b300'
elif hold500>0 and dpj:
return 's500b50'
elif hold300>0 and xpj:
return 's300b500'
elif hold300>0 and dpj:
return 's300b50'
elif hold50>0 and zpj:
return's50b300'
elif hold50>0 and xpj:
return's50b500' #6
#取得股票某个区间内的所有收盘价(用于取前13日和当前价格)
def getStockPrice(stock, interval):
h = attribute_history(stock, interval*240, unit='1m', fields=('close'), skip_paused=True)
return (h['close'].values[0],h['close'].values[-1],h['close'].mean()) def getCurrentPrice(stock):
h= attribute_history(stock, 1, unit='1m', fields=('close'), skip_paused=True)
return (h['close'].values[-1]) #7
#卖出股票
def sell_the_stocks(context):
for stock in context.portfolio.positions.keys():
return (log.info("Selling %s" % stock), order_target_value(stock, 0),order_value('511880.XSHG', context.portfolio.cash)) #8
#买入股票
def buy_the_stocks(context,signal):
holdrili = context.portfolio.positions[g.ETFrili].total_amount
prili = getCurrentPrice(g.ETFrili)
if holdrili ==0 :
return (log.info("Buying %s"% signal ),order_value(eval('g.%s'% signal), context.portfolio.cash))
elif holdrili !=0:
return (log.info("Buying %s"% signal ),order_target_value(g.ETFrili, 0),order_value(eval('g.%s'% signal), holdrili*prili))
'''
=================================================
每日收盘后(本策略中不需要)
=================================================
'''
def after_trading_end(context):
return

joinquant 策略的更多相关文章

  1. JoinQuant策略代码示例

    总体回测前 ''' ================================================================================ 总体回测前 === ...

  2. 金融量化分析【day112】:量化交易策略基本框架

    摘要 策略编写的基本框架及其实现 回测的含义及其实现 初步学习解决代码错误 周期循环的开始时间 自测与自学 通过前文对量化交易有了一个基本认识之后,我们开始学习做量化交易.毕竟就像学游泳,有些东西讲是 ...

  3. Python之关于量化投资实现代码--根据策略提出的代码--还未完善

    # 根据缺口的模式选股买股票 ''' -------------------------------------------- 1.总体回测前要做的事情 initialize(context) 1.1 ...

  4. 高性能Javascript--脚本的无阻塞加载策略

    Javascript在浏览器中的性能,可以说是前端开发者所要面对的最重要的可用性问题. 在Yahoo的Yslow23条规则当中,其中一条是将JS放在底部 .原因是,事实上,大多数浏览器使用单进程处理U ...

  5. javascript设计模式:策略模式

    前言 策略模式有效利用组合.委托.多态等技术和思想,可以有效避免多重条件选择语句. 策略模式对开放-封闭原则提供了很好的支持,将算法封装在strategy中,使得他们易于切换.理解.扩展. 策略模式中 ...

  6. Unity3D 5.3 新版AssetBundle使用方案及策略

    1.概览 Unity3D 5.0版本之后的AssetBundle机制和之前的4.x版本已经发生了很大的变化,一些曾经常用的流程已经不再使用,甚至一些老的API已经被新的API所取代. 因此,本文的主要 ...

  7. StrategyPattern (策略模式)

    /** * 策略模式 * @author TMAC-J * 根据环境的不同选择不同的策略,把策略用接口抽象出来 */ public class StrategyPattern { interface ...

  8. 直播推流端弱网优化策略 | 直播 SDK 性能优化实践

    弱网优化的场景 网络直播行业经过一年多的快速发展,衍生出了各种各样的玩法.最早的网络直播是主播坐在 PC 前,安装好专业的直播设备(如摄像头和麦克风),然后才能开始直播.后来随着手机性能的提升和直播技 ...

  9. JAVA 设计模式之策略模式

    定义:定义一组算法,将每个算法都封装起来,并且使他们之间可以互换. 类型:行为类模式 策略模式是对算法的封装,把一系列的算法分别封装到对应的类中,并且这些类实现相同的接口,相互之间可以替换.在前面说过 ...

随机推荐

  1. java异常处理throw和throws的区别

    throws和throw区别 throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理. 而throw则是指抛出的一个具体的异常 ...

  2. Simple implementation and results of genetic algorithm.

    This experiment was done for the final assignment of my Professional English class. This part has be ...

  3. alter table 修改表结构规范

    use database_name; ) )), ADD INDEX index_time ( `timeId` ); # 添加主键: alter table table_name add prima ...

  4. Python 原生2种 邮件发送(发送验证码) 的方法

    import smtplib from email.mime.text import MIMEText # 第三方 SMTP 服务 mail_host = "smtp.sina.cn&quo ...

  5. phpstudy安装好之后mysql无法启动(亲测可行)

    安装好phpstudy后,Apache可以启动,Mysql无法启动. 尝试解决办法:可能是之前已经装过Mysql,要把系统服务里面的MySQL删除,留下MySQLa服务. 在cmd命令行下输入:sc ...

  6. 基于VSCode的vue单文件组件模板设置---一次设置,可爽终生

    第一步: 第二步: 第三步: 打开vue.json文件后,如果是初次设置,应该如下图所示,绿色注释部分不用管,注意那两个白色大括号 第四步:在大括号内全部粘贴如下代码,保存即可完成vue模板的设置 & ...

  7. re模块元字符

    #元字符在re模块中有特殊意义的字符,有:^ $. * + {} [] () | \ ^$ #表示开头结尾,注意:[^]表示取反 . #点,表示任意一个字符,包括空格(一个空白字符),\t(换行符). ...

  8. Codevs1922 骑士共存问题

    1922 骑士共存问题 题目描述 Description 在一个n*n个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的n*n个方格的国 ...

  9. Liferay 7.1发布啦

    下载地址: https://cdn.lfrs.sl/releases.liferay.com/portal/7.1.0-m1/liferay-ce-portal-tomcat-7.1-m1-20180 ...

  10. 高可用服务 AHAS 在消息队列 MQ 削峰填谷场景下的应用

    在消息队列中,当消费者去消费消息的时候,无论是通过 pull 的方式还是 push 的方式,都可能会出现大批量的消息突刺.如果此时要处理所有消息,很可能会导致系统负载过高,影响稳定性.但其实可能后面几 ...