quantopian寻找策略之mean_reversion
股价有向均线回归的趋势,利用这个特点,可以在技术指标处于超卖阶段寻找那些上涨速度快的流通性好的股票买入,形成下面的策略。策略来源quantopian。
对于市场上流通性最好的1500只股票在pipeline中先进行一波过滤:
1.年收益率排名前500
2.20日平均成交量大于100万股
3.股价高于1刀
4.rsi小于50
把过滤出的股票按照200日收益降序排列取前十名放入待买股票列表。
接下来用标普500指数的200日均线的98%做风控,指数走弱全部清仓并且不开新仓。
卖出持仓中不在待买股票列表中的标的。
买入持仓中没有且在待买股票列表中的标的,仓位按股票个数平均分配。
这个策略主要是用200日收益去向250日收益去靠拢。
几个需要注意的函数:
class roc_200days(CustomFactor):inputs = [USEquityPricing.close] window_length = 200+1def compute(self, today, assets, out, close):print(len(close[-1]))out[:] = ((close[-1] - close[0]) / close[0]) * 100print(len(out))print(out)
运行时输出:
2010-01-04 21:45 PRINT 7932
2010-01-04 21:45 PRINT 7932
2010-01-04 21:45 PRINT [ 196.97048283 178.26086957 107.60141788 ..., nan 13.84790011112.76595745]
这里面定义了一个custom_factor,close是一个201*7932的ndarray。上面这个类roc_200days的作用是不断获取200日收益。
import quantopian.algorithm as algo
from quantopian.pipeline import Pipeline
from quantopian.pipeline.data.builtin import USEquityPricing
from quantopian.pipeline.filters import QTradableStocksUS, Q1500US
from quantopian.pipeline.factors import SimpleMovingAverage, RSI, CustomFactor, Returns, Latest
from quantopian.algorithm import attach_pipeline, pipeline_outputclass roc_200days(CustomFactor):inputs = [USEquityPricing.close] window_length = 200+1def compute(self, today, assets, out, close):out[:] = ((close[-1] - close[0]) / close[0]) * 100def initialize(context):set_commission(commission.PerTrade(cost=0.00))set_slippage(slippage.FixedSlippage(spread=0.00))set_long_only()schedule_function(is_positive_trend, date_rules.week_start(), time_rules.market_open(hours=0, minutes=59), half_days=False)schedule_function(rebalance_sell, date_rules.week_start(), time_rules.market_open(hours=1), half_days=False)schedule_function(rebalance_buy, date_rules.week_start(), time_rules.market_open(hours=2), half_days=False)schedule_function(my_record_vars, date_rules.every_day(), time_rules.market_close(), half_days=False)algo.attach_pipeline(make_pipeline(), 'my_pipeline')def make_pipeline():TOTAL_STOCKS = 500returns_1_yr = Returns(window_length = 252)base_universe = returns_1_yr.top(TOTAL_STOCKS, mask = Q1500US())avg_volume = SimpleMovingAverage(inputs=[USEquityPricing.volume],window_length=20)filter_volume = avg_volume > 1000000last_price = Latest(inputs=[USEquityPricing.close], window_length=1) filter_price = last_price > 1rsi = RSI(inputs=[USEquityPricing.close], window_length=3)filter_overbought = rsi < 50roc = roc_200days()stocks_to_trade = base_universe & filter_volume & filter_price & filter_overboughtreturn Pipeline(columns = {'stocks': stocks_to_trade,'avg_volume': avg_volume,'roc': roc,},screen = (stocks_to_trade))def before_trading_start(context, data):context.my_output = pipeline_output('my_pipeline')context.candidates = context.my_output.sort_values('roc', ascending=False).head(10).index.tolist()def is_positive_trend(context, data): can_trade = Falsespy = symbol('SPY')price_history = data.history(spy, fields='close', bar_count=200, frequency='1d') context.spy_close = data.current(spy,'close')context.sma200 = price_history.mean()context.sma200_buffered = context.sma200 * 0.98if context.spy_close > context.sma200_buffered:can_trade = True context.is_trend = can_tradedef rebalance_sell(context, data): if not context.is_trend:empty_bags(context, data)else: for security in context.portfolio.positions:if security not in context.candidates and data.can_trade(security):order_target_percent(security, 0) def rebalance_buy(context, data): if get_open_orders():log.info("Unexpected open orders: " + str(len(context.portfolio.positions)))print_orders()if context.is_trend is False:returnneeded_cash = get_cash_amount(context, data)for security in context.candidates:if security not in context.portfolio.positions and data.can_trade(security): if(needed_cash < context.portfolio.cash):order_value(security, needed_cash)def my_record_vars(context, data):record(spy=context.spy_close, sma200=context.sma200, sma200_buffered=context.sma200_buffered)def get_cash_amount(context, data):weight = 0num_stocks = 0for security in context.candidates:if security not in context.portfolio.positions and data.can_trade(security):if data.can_trade(security):num_stocks = num_stocks + 1 if num_stocks > 0:weight = 1.0 / num_stocks spend = context.portfolio.cash * weight return spenddef empty_bags(context, data):for security in context.portfolio.positions:if data.can_trade(security):order_target_percent(security, 0)def print_orders():open_orders = get_open_orders()if len(open_orders) == 0:returnfor security, orders in open_orders.iteritems():for order in orders:log.info("Active order for " + str(order.amount) + " shares of " + str(security))
quantopian寻找策略之mean_reversion相关推荐
- 组策略 从入门到精通(二) 如何区别跨越WAN网的计算机对组策略的套用
如果客户机与DC中间跨越了网络,造成传输速率慢的情况,我们希望通过策略中的一些元素,达成对这些计算机的另类处理.但我们并不知道这些计算机哪些与我们DC之间属于低速连接,哪些属于高速连接,那么我们要如何 ...
- 活动目录:域控制器策略大全
域服务器的作用是: 1.安全集中管理,统一安全策略 . 2.软件集中管理,按照公司要求限定所有机器只能运行必需的办公软件. 3.环境集中管理,利用AD可以统一客户端桌面,IE,TCP/IP等设置 4. ...
- 量化交易:大盘拟合稳定突破策略
作者: 阿布 阿布量化版权所有 未经允许 禁止转载 abu量化系统github地址(欢迎+star) 本节ipython notebook 上一节讲解的是A股市场的回测,本节讲解港股市场的回测示例. ...
- 用户画像、用户分级与指标提升策略数据分析(jd消费者行为数据分析)
使用数据集:京东消费者行为 数据来源:京东消费者行为 - Heywhale.com 使用软件与语言:Excel.Navicat15.MySQL8.0.Python3.Power BI 文章目录 一.分 ...
- 运维--域控服务器--策略配置
域控下常用策略实施 如何进入域控服务器的组织策略 1.进入命令行:gpmc.msc 2.开始→控制面板→管理工具→组策略管理 3.服务器管理器→工具→组策略管理 域管理策略 说明:策略可以放在star ...
- 量化投资:第3节 滑点策略与交易手续费
作者: 阿布 阿布量化版权所有 未经允许 禁止转载 abu量化系统github地址(欢迎+star) 本节ipython notebook 上一节使用AbuFactorBuyBreak和AbuFact ...
- mybatis 一对多_MyBatis面试题集合,90%会遇到这些问题
1.#{}和${}的区别是什么? ${}是Properties文件中的变量占位符,它可以用于标签属性值和sql内部,属于静态文本替换,比如${driver}会被静态替换为com.mysql.jdbc. ...
- 这谁顶得住?mybatis十八连环问!
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 1.#{}和${}的区别是什么? 答:${}是Properties ...
- MyBatis常见面试题汇总
文章目录 概述 简介 优点 缺点 适用场景 MyBatis与Hibernate有什么不同? ORM是什么 传统JDBC开发存在什么问题? JDBC编程有哪些不足之处,MyBatis 是如何解决的? M ...
最新文章
- 图片上传 fastDFS
- scala方法定义示例
- 一文总结:抽象类(abstract)与接口(interface)的特点和代码展示
- cacls文件服务器备份与恢复,实战安全设置WEB专用服务器技巧
- Even for transaction data request, metadata is still needed as prerequisite
- 动态规划训练13 [Catch That Cow poj3278]
- 属性的表示方法和对象的枚举
- TypeScript 类(Class)
- pandas按照字典格式替换dataframe的值
- mysql pdo 获取最后一条sql_一条sql语句的执行过程-mysql
- 关于使用电脑命令开启无线热点的那点事。。。
- python贪心算法几个经典例子_闲来无事整一下贪心算法 用python实现的
- 计算机网络之A、B、C类网络地址
- Maven中pom文件常见的标签使用以及介绍
- ENVI中辐射定标和大气校正
- kdj买卖指标公式源码_买卖点KDJ (副图指标 源码 )
- 如何设置用计算机程序打开方式,WPS安装后怎么设置为文档的默认打开方式的方法...
- 市场导向还是技术导向
- 问道手游平民玩家什么职业好
- linux版本kettle 中文乱码,kettle工具同步数据乱码-Linux下乱码问题二
热门文章
- 【数据结构与算法】摔鸡蛋
- springboot项目有哪几种运行方式
- Qt图形视图框架:视图增加标尺
- xshell6设置选中复制 右键粘贴复制内容
- 前端不让浏览器自动填充账号密码
- 论文阅读《Learning for Disparity Estimation through Feature Constancy》
- 一个新手要怎么学习3Dmax建模?
- 大数据开发和大数据分析应该怎么选择?
- 10.11_attention
- 以学生使用计算机写一篇英语作文,学英语的感受作文200:《学习心得》英语作文100字...