简述

这个还是根据之前的策略七实现的。主要是换用了另外的alpha因子三而已。

效果图

代码

# 导入函数库
import statsmodels.api as sm
from statsmodels import regression
import numpy as np
import pandas as pd
import time
from datetime import date
import scipy.stats as stats# 一键回测说明:
# 百度聚宽-》注册账号-》我的策略里面创建策略-》复制代码到里面
# 右边回测 开始时间:2017-1-1 终止时间:今天 资金:10000000# 初始化函数,设定基准等等
def initialize(context):g.tc= 2  # 调仓频率# 下面是框架固定部分,不需要修改    g.N = 20  # 持仓数目g.t = 0  # 记录运行的天数g.weight_list = [1]  # 因子的权重参数log.set_level('order', 'error')set_option('use_real_price', True)  # 用真实价格交易set_slippage(FixedSlippage(0))  # 将滑点设置为0set_commission(PerTrade(buy_cost=0.0000, sell_cost=0.000, min_cost=0))  # 手续费设置为0# set_benchmark('000905.XSHG')  #中证500为业绩基准set_benchmark('000300.XSHG')  # 沪深300为业绩基准# 选股范围为全市场选股:上证+深证股票# g.stockrange= get_index_stocks('000001.XSHG')+get_index_stocks('399106.XSHE')g.stockrange = get_index_stocks('000300.XSHG')init_cash_ = context.portfolio.starting_cash/5g.init_cash = init_cash_# 操作期货set_subportfolios([SubPortfolioConfig(cash=init_cash_, type='stock'),SubPortfolioConfig(cash=init_cash_ * 4 , type='futures')])g.futures_rate = 0.01  # 100倍的杠杆set_option('futures_margin_rate', g.futures_rate)g.stoppedStockName = []g.stoppedStockTime = []# 每当g.calDays ==  0的时候就更新一下初始值g.orignalValue = 0g.TotalDays = 30g.calDays = 0g.levels = [0.075, 0.15, 0.30]#      -20        -8        -1         0        1     8   20# 全买     买2/3      买1/3     卖1/6     买1/6  ...g.betaName = 'IF9999.CCFX'run_daily(mktopen, time='every_bar')## 每根日线运行一次
def handle_data(context, data):if g.t == 0:# 设置可行股票池:用set_feasible_stocks函数剔除当前或者计算样本期间停牌的股票g.all_stocks = pickStock(context, g.stockrange)previousStr = str(context.previous_date)# adjustedBeta# adjustedBeta(context)stock_sort = get_all_cleaned_factor_ranked(g.all_stocks, g.weight_list, previousStr)# 调仓rebalance_position(context, stock_sort)# order_stock_sell(context,data,stock_sort)# order_stock_buy(context,data,stock_sort)       # g.t+=1 # speed upg.t = (g.t + 1) % g.tc## 调整因子
def get_all_cleaned_factor_ranked(stocks, weight_list, previousStr):value = my_alpha3(stocks)# value = my_alpha2(stocks)value = (-value).argsort()[:g.N]return list(map(lambda x: stocks[x], value))'''
factor1
'''def single_alpha1(stock):df = get_price(stock, count=26, fields=['close'])returns = (df[1:] - df[:-2]) / df[:-2]  # 25 linesvalue = [0] * 5for i in range(5):if np.array(returns).tolist()[-1 - i] < 0:value[i] = returns.ix[-20 - i:-1 - i].std() ** 2else:value[i] = df['close'][-1 - i] ** 2return 5 - np.array(value).argmax()def my_apha1(stocks):value = list(map(single_alpha1, stocks))MAX = max(value)MIN = min(value)value = (np.array(value) - MIN) / (MAX - MIN)return value'''
END factor1
''''''
factor2
'''def single_alpha2(stock):df = get_price(stock, count=8, fields=['open', 'close', 'volume'])volume = np.log(df['volume'].tolist())delta_volume = volume[2:] - volume[:-2]close = df['close']open_ = df['open']rate = (close - open_) / open_rate = np.array(rate)[2:]return delta_volume, ratedef my_alpha2(stocks):values = list(map(single_alpha2, stocks))T_values = list(zip(*values))T_values = list(map(doubleListRank, T_values))T_values = list(map(list, zip(*T_values)))values = np.array(map(Neg_correlation, T_values))return valuesdef Neg_correlation(adlist):return -stats.pearsonr(np.array(adlist[0]), np.array(adlist[1]))[0]def doubleListRank(ddlist):ddlist6 = list(zip(*ddlist))ddlist6 = list(map(rank, ddlist6))return list(map(list, zip(*ddlist6)))def rank(alist):MAX = max(alist)MIN = min(alist)return (np.array(alist) - MIN) / (MAX - MIN)# (-1 * correlation(rank(delta(log(volume), 2)), rank(((close - open)/ open)), 6))
# 6天以来的相关系数() 两个数值分别是
# rank(delta(log(volume), 2))'''
END factor2
''''''
factor3
'''def single_alpha3(stock):df = get_price(stock, count=10, fields=['open', 'volume'])return np.array(df['open']), np.array(df['volume'])def my_alpha3(stocks):values = list(map(single_alpha3, stocks))T_values = list(zip(*values))T_values = list(map(doubleListRank, T_values))T_values = list(map(list, zip(*T_values)))values = np.array(map(Neg_correlation, T_values))return values'''
END factor3
''''''
初步筛选股票
'''# pick stocks
def pickStock(context, stocks):# universe = set_feasible_stocks(stocks)universe = filter_specials(stocks, context)# 过滤上市时间小于60天的股票for stock in universe:days_public = (context.current_dt.date() - get_security_info(stock).start_date).daysif days_public < 60:universe.remove(stock)g.lenth = len(universe)return universe# 过滤停牌的股票
def set_feasible_stocks(stock_list):current_data = get_current_data()stock_list = [stock for stock in stock_list if not current_data[stock].paused]  # 不考虑停盘的股票return stock_list# 将多因子的dataframe进行排序,并且将有空值的行去掉
def rank_stock(all_factor, weight_list):C = len(all_factor.columns)ranked = all_factor.iloc[:, 0].rank() * weight_list[0]if C > 1:for j in range(1, C):ranked = all_factor.iloc[:, j].rank() * weight_list[j] + rankedranked = pd.DataFrame(ranked)ranked.columns = ['rank']one_sort = ranked.sort('rank', ascending=g.ascending)stock_sort = one_sort.index[:g.N]return stock_sort#过滤退市,停牌,STdef filter_specials(stock_list,context):curr_data = get_current_data()stock_list = [stock for stock in stock_list if \(not curr_data[stock].paused)  # 未停牌and (not curr_data[stock].is_st)  # 非STand ('ST' not in curr_data[stock].name)and ('*' not in curr_data[stock].name)and ('退' not in curr_data[stock].name)and (curr_data[stock].low_limit < curr_data[stock].day_open < curr_data[stock].high_limit)                   ]return stock_list'''
END 初步筛选股票
''''''
调仓
'''def rebalance_position(context, stocks_list):current_holding = context.subportfolios[0].positions.keys()stocks_to_sell = list(set(current_holding) - set(stocks_list))total_value = context.subportfolios[0].total_valuerebalance_beta(context)stocks_list = checkNoStopped(stocks_list)# 卖出bulk_orders(stocks_to_sell, 0)# 买入  bulk_orders(stocks_list, total_value / len(stocks_list))if len(g.stoppedStockName) != 0:for i in range(len(g.stoppedStockName)):g.stoppedStockTime[i] -= 1Name = []Time = []for i in range(len(g.stoppedStockName)):if g.stoppedStockTime[i] != 0:Name.append(g.stoppedStockName[i])Time.append(g.stoppedStockTime[i])g.stoppedStockName = Nameg.stoppedStockTime = Timedef checkNoStopped(stocks_list):temp = set(stocks_list)temp -= (temp & set(g.stoppedStockName))return tempdef rebalance_beta(context):if g.calDays == 0:g.orignalValue = context.subportfolios[0].total_valueelse:total_value = context.subportfolios[0].total_valuerate = (total_value - g.orignalValue) / g.orignalValuemoney = context.subportfolios[1].transferable_cash / g.futures_rateprint rate if rate >= 0 and rate < g.levels[0]:bete_order(-money / 2.0)elif rate <= -g.levels[0] and rate >= -g.levels[1]:bete_order(money * 5. / 6)elif rate < -g.levels[1] and rate >= -g.levels[2]:bete_order(money * 6.0 / 7)elif rate < -g.levels[2]:bete_order(money)elif rate < 0 and rate >= -g.levels[0]:bete_order(money / 2.0)elif rate > g.levels[0] and rate <= g.levels[1]:bete_order(-money * 5. / 6)elif rate > g.levels[1] and rate <= g.levels[2]:bete_order(-money * 6.0 / 7)elif rate > g.levels[2]:bete_order(-money)# print (context.subportfolios[0].total_value - g.init_cash) / g.init_cashg.calDays = (g.calDays + 1) % g.TotalDays# 批量买卖股票
def bulk_orders(stocks_list, target_value):for i in stocks_list:order_target_value(i, target_value, pindex=0)def bete_order(money):amount = int( money / get_current_data()[g.betaName].last_price)order_target(g.betaName, amount , side='long', pindex=1)  # 做空def mktopen(context):# 每分钟止损stop(context)# 止损
def stop(context):# 循环查看持仓的每个股票for stock in context.subportfolios[0].positions:# 如果股票最新价格除以平均成本小于0.8,即亏损超过20%if context.subportfolios[0].positions[stock].price / context.subportfolios[0].positions[stock].avg_cost < 0.95:# 调整stock的持仓为0,即卖出order_target(stock, 0)g.stoppedStockName.append(stock)g.stoppedStockTime.append(30)'''
END 调仓
''''''
调仓初版
'''##获得卖出信号,并执行卖出操作
# 输入:context, data,已排序股票列表stock_sort-list类型
# 输出:none
def order_stock_sell(context, data, stock_sort):# 对于不需要持仓的股票,全仓卖出for stock in context.portfolio.positions:# 除去排名前g.N个股票(选股!)if stock not in stock_sort:stock_sell = stockorder_target_value(stock_sell, 0)# 获得买入信号,并执行买入操作
# 输入:context, data,已排序股票列表stock_sort-list类型
# 输出:none
def order_stock_buy(context, data, stock_sort):# 对于需要持仓的股票,按分配到的份额买入for stock in stock_sort:stock_buy = stockorder_target_value(stock_buy, g.everyStock)'''
END 调仓初版
'''

【量化投资】策略八(聚宽)相关推荐

  1. 教你量化投资001——使用聚宽实现基于价值投资的选股

    使用聚宽有一段时间了,目前已经略有小成.所以分享一些使用心得,帮助大家入门. 目前价值投资的理念越来越深入人心,那么如果基于安全边际与低估来选择理想的好价格股票呢. 永续年金估值模型为我们提供了一个选 ...

  2. 【量化系列】使用聚宽实现净利润跳空策略

    ​​​​​​​ 目录 1 什么是净利润跳空策略? 2聚宽量化环境简介 3本策略实现的逻辑 代码 一些说明 回测结果 ​编辑 1 什么是净利润跳空策略? 净利润跳空是指上市公司发布超预期的业绩公告后,股 ...

  3. 缠论 python 量化_【JoinQuant聚宽社区干货】量化学习资料、经典交易策略、Python入门...

    ======================= 量化投资学习资料 ======================= 量化投资经典学习资料下载:http://www.joinquant.com/post/ ...

  4. python聚宽量化_Python量化交易之四_聚宽数据

    介绍 之前测试过一些免费API,比如tushare现在只能下载两年半数据,163有的股票数据无法下载,pandas_reader速度很慢,并且只能下载A股的各股数据,对基金和指数支持不佳.这两天尝试了 ...

  5. 聚宽 get_price 多个股票数据_Python量化交易之四_聚宽数据

    介绍 之前测试过一些免费API,比如tushare现在只能下载两年半数据,163有的股票数据无法下载,pandas_reader速度很慢,并且只能下载A股的各股数据,对基金和指数支持不佳.这两天尝试了 ...

  6. 国内主要量化投资平台

    这里记录一下国内主要的量化投资平台 JoinQuant聚宽量化交易平台 https://www.joinquant.com/ BigQuant - 人工智能量化投资平台 https://bigquan ...

  7. python量化交易策略实例_python量化交易策略入门(一):MACD的威力

    最近刚开始学习量化交易,在聚宽网上看了几篇教程,对操作流程有了大致的了解,接下来打算好好研究一下交易策略. 据大奖章基金的Simons透露,他那个每年收益率20%以上的系统,一点都不费解(compli ...

  8. 股票价格趋势预测与量化投资案例可视化演示系统(附代码)

    摘要 随着全球经济与股市的快速发展,股票投资成为了民众们常用的理财方式之一.近年来,量化投资凭借其优良的纪律性.准确性.时效性和系统性等优势受到越来越多的关注.与西方成熟市场相比,我国量化投资还处于起 ...

  9. 动量效应 matlab,量化投资之动量反转

    那一年,你在我的有效市场里随机游走,不经意间毁灭了我的理性人假设.从此,维持与你相爱的动量效应,成为我人生唯一的投资策略. --送给她 一. 行为金融学 1. 行为金融学的发展 20世纪80年代,股票 ...

  10. Python量化投资

    安装Python开发环境 密码:hhsc Python Pandas Anaconda 勾选 Add Anaconda...... Register Anaconda...... 检查命令行:cond ...

最新文章

  1. [译]详解C++右值引用
  2. js/jq判断鼠标滚轮方向
  3. 今日头条|张一鸣:我遇到的优秀年轻人的5个特质
  4. C++ Primer 5th笔记(chap 16 模板和泛型编程)转发
  5. Java反射之从对象获取值
  6. ORA-07445:[SIGFPE] [Integer divide by zero]内部错误一例
  7. 02-css的选择器
  8. 弥补Web开发缺陷 实战HTML 5中存储API
  9. Python中使用random随机函数与Matplotlib库绘制随机漫步图
  10. Day04_绘制矩形
  11. HM个性化Recommendations--kaggle推荐比赛
  12. 元气骑士机器人的成就皮肤_元气骑士:5把特殊“红武”,想要机器人的皮肤,用它就对了!...
  13. 调试3G模块语音通话
  14. 收集的关于DLL较全的介绍
  15. java编写平行四边形的代码_Java代码编写四边形
  16. 关于阿里云OOS文件上传的一些问题
  17. python快递分拣_快递背后的黑科技,你造吗?
  18. 多线程永动任务设计与实现
  19. 【转】超过4G的U盘格式化你准备用什么文件格式?(FAT32NTFSexFAT)
  20. ubuntu 发行版安装向日葵远程控制软件

热门文章

  1. 探讨如何成为技术团队管理者
  2. WinCE6.0的批量编译
  3. php返回null接收的是空字符串,求大神救命!!php接收到是空的字符串
  4. 设计模式——工厂方法模式和抽象工厂模式
  5. SSIS中代码页(Code Page)问题
  6. 【转】解决wine中文乱码的问题
  7. paramiko-exec.py——利用paramiko远程执行命令
  8. 如何对自己做好正确的人生规划
  9. [转帖]Mootools源码分析-04 -- Array
  10. 图解IIS服务器配置教程(asp\php\mysql)