量化择时策略入门与实操-笔记(同花顺金融量化实验室python实现)
文字与代码来源:2022年第三届“大湾区杯”粤港澳金融数学建模竞赛在线讲座-6_哔哩哔哩_bilibili
目录
指数估值择时策略
指数轮动择时策略
基于风险平价模型的仓位管理策略
现代资产配置理论(MPT)
基于风险平价模型的仓位管理策略解读
指数估值择时策略
采用指数所有成分股的市盈率指标计算得出,用于衡量指数整体的估值水平,在牛市中,指数估值往往能达到80%及以上,而在熊市中指数估值可能低于20%及以下。投资者通过观察指数估值来判定当前市场估值状况,在低估时买入,高估时卖出,完成长周期指数择时。
• 关键词:估值水平,低估,高估
1. 计算方法
当前指数市盈率 = 当前所有指数成份股市盈率的中位数
近五年指数市盈率最大值 = 取近五年中指数市盈率的极大值
近五年指数市盈率最小值 = 取近五年中指数市盈率的极小值
指数估值 = (当前指数市盈率-近五年指数市盈率最小值)/(近五年指数市盈率最大值-近五年指数市盈率最小值)
2. 择时逻辑
看多:当指数估值(5年)从20%下方涨回20%上方时,市场从下跌阶段反转成上涨阶段,市场热度增加,做多指数
看空:当指数估值(5年)从80%上方跌回80%下方时,市场从上涨阶段反转成下跌阶段,市场回归理性,做空指数
3. 代码
import pandas as pd
import numpy as np
# 初始化函数,全局只运行一次
def init(context):# 设置要操作的指数context.security = '000300.SH'# 设置基准收益:沪深300指数set_benchmark(context.security)# 每周第一个交易日运行run_weekly(trade,1)# 估值的年限context.year = 5# 估值序列储存context.pelist = []
## 开盘时运行函数
def trade(context, bar_dict):# 获取时间date = get_last_datetime().strftime('%Y-%m-%d')# 获取估值pe_rate = get_index_valuation(context,date,context.security)# 加入序列context.pelist.append(pe_rate)# 判定估值信号if len(context.pelist)>1 and context.pelist[-2]<20 and context.pelist[-1]>=20:# 全仓order_target_percent(context.security,1)# 打印print('买入指数{}:当前估值百分位{}'.format(context.security,pe_rate))elif len(context.pelist)>1 and context.pelist[-2]>80 and context.pelist[-1]<=80:# 空仓order_target(context.security,0)# 打印print('卖出指数{}:当前估值百分位{}'.format(context.security,pe_rate))
# 创建函数:获取指数估值水平
def get_index_valuation(context,date,index_code):'''输出:市盈率'''# 创建dataframedatadf = pd.DataFrame(columns = ['PE'])# 创建月初交易日列表monthdatelist = []# 获取日期datelist = get_trade_days(None,date,context.year*250).strftime('%Y%m%d')# 循环时间序列for t in range(1,len(datelist)):# 判断月度if datelist[t-1][4:6]!=datelist[t][4:6]:# 添加新月度日期monthdatelist.append(datelist[t])# 循环月度日期for date in monthdatelist[-context.year*12:]:# 调用指数估值指标计算函数datadf.loc[date] = get_index_PB_PE_PB1(date,index_code)# 最大值 values_max = datadf.max()# 最小值values_min = datadf.min()# 当前值values_now = datadf.ix[-1]# 百分位T = (values_now - values_min)/(values_max - values_min)# 输出return round(T.PE,4)*100
# 创建函数:指数估值指标计算
def get_index_PB_PE_PB1(date,indexcode):'''函数使用注释:输入:日期,指数代码算法:中位数输出:指数市盈率'''# 获取成份股stocks = get_index_stocks(indexcode,date)# 获取市盈率数据q = query(factor.symbol,factor.pe_ttm).filter(factor.symbol.in_(stocks),factor.date == date)# 获取数据df = get_factors(q)# 计算中位数PE_index = df.median().factor_pe_ttmreturn [PE_index]
指数轮动择时策略
1. 基本逻辑(动量效应)
强者越强:涨幅最大的指数,投资者参与热度高,不断吸引新的资金进入,推动指数持续上涨
弱者越弱:出现跌幅的指数,投资者愈发认为市场表现较弱并撤出资金,导致指数进一步下跌
2. 交易逻辑
每个月第一个交易日,计算所有指数ETF近20个交易日的涨幅,并排序得出涨幅最大的指数及涨幅值
做多:如果涨幅最大的指数ETF,涨幅值大于0,则做多指数,买入该ETF
做空:如果涨幅最大的指数ETF,其涨幅值小于等于0,则看空指数,保持空仓
风控:监控持仓ETF,每天计算近20个交易日的涨幅,如果涨幅值小于等于0,则卖出。
3. 代码
import pandas as pd
#初始化函数
def init(context): # 按月交易第一个交易日run_monthly(trade,date_rule=1)# 输入需要交易的ETFcontext.security = ['159901.OF', # 深证100ETF'510050.OF', # 上证50ETF'159915.OF', # 创业板ETF'510300.OF', # 沪深300ETF'510500.OF', # 中证500ETF'510180.OF', # 上证180ETF'159902.OF', # 中小板100ETF'159905.OF', # 深红利ETF]# 指数强度系数(天)context.N = 20
#交易函数
def trade(context,bar_dict):# 获取指数行情数据price = history(context.security,['close'],context.N,'1d',True,'pre',is_panel=1)# 获取收盘价df = price['close']# 计算强弱indexreturn = df.iloc[-1]/df.iloc[0]-1# 排序indexreturn = indexreturn.sort_values()print(indexreturn)# 选取最强指数及强弱值index_T = indexreturn.iloc[-1]index = list(indexreturn.index)[-1]# 获取当前持仓holdindex = list(context.portfolio.stock_account.positions.keys())for stock in holdindex:# 清仓order_target(stock, 0)if index_T>0:# 买入order_target_percent(index,1)# 打印print('最强指数{},强弱度{},买入'.format(index,round(index_T,4)))
#设置风控
def handle_bar(context,bar_dict):# 获取指数行情数据price = history(context.security,['close'],context.N,'1d',True,'pre',is_panel=1)# 获取收盘价df = price['close']# 计算强弱indexreturn = df.iloc[-1]/df.iloc[0]-1# 排序indexreturn = indexreturn.sort_values()# 选取最强指数及强弱值index_T = indexreturn.iloc[-1]index = list(indexreturn.index)[-1]# 获取当前持仓holdindex = list(context.portfolio.stock_account.positions.keys())# 择时判定if index_T<=0:for index in holdindex:# 清仓order_target(index, 0)# 打印print('最强指数强弱度{},清仓'.format(index_T))
基于风险平价模型的仓位管理策略
现代资产配置理论(MPT)
1. 均值-方差模型
现代资产配置理论(MPT)将资金合理分配在多种资产上,在控制风险的前提下最大化预期收益率。
1952年,马科维茨Markowitz提出“均值-方差”模型,用均值刻画资产预期收益率,用方差刻画资产潜在风险;分析各资产的均值-方差,找到有效前沿,所有在有效前沿上的点即为最优投资组合。投资者给定组合预期收益率,可以找到最低风险的组合;投资者给定组合的风险水平,可以找到收益最大的组合。
2. 风险平价模型
现实生活中,股票和期货市场的风险显著高于债券和货币市场,且资产未来的收益率很难预估,因此均值-方差模型的实际效果远达不到预期效果。
2005年,磐安资产管理公司的钱恩平博士首次提出著名的风险平价策略,不预测资产未来收益率,追求资产本身的风险权重平衡。风险平价策略让每项资产在组合中的风险贡献相等,实现资产风险分散化。
基于风险平价模型的仓位管理策略解读
1. 基本逻辑
当股票市场持续上涨时,股票资产的风险降低,需要提高股票资产仓位,降低国债仓位,以保证资产间风险相同。
当股票市场出现断崖式下跌时,股票资产的风险提升,需要降低股票资产仓位,增加国债仓位,以保证资产间风险相同。
2. 交易逻辑
每月第一个交易日,采用风险平价模型,以每项资产在组合中的风险贡献相等原则,重新计算所有指数ETF的持仓权重:
加仓:新持仓权重大于原持仓权重的ETF,加仓至新持仓权重仓位。
减仓:新持仓权重小于原持仓权重的ETF,减仓至新持仓权重仓位
3. 代码
import pandas as pd
import numpy as np
import scipy.optimize as sco
# 初始化函数,全局只运行一次
def init(context):# 设置基准收益set_benchmark('000001.SH')# 配置资产列表context.assetlist = ['513100.OF', # 纳斯达克ETF'159919.OF', # 沪深300'510180.OF', # 上证180ETF'159905.OF', # 深红利ETF'159915.OF', # 创业板ETF'518880.OF', # 黄金ETF'159928.OF', # 消费ETF'512010.OF', # 医药ETF'510230.OF', # 金融ETF]# 每月第一个交易日运行run_monthly(assetfun,date_rule=1)
## 开盘时运行函数
def assetfun(context, bar_dict):# 获取资产收益assetdata = history(context.assetlist,['close'],250,'1d',skip_paused=True,fq='pre',is_panel=True)['close']# 获取资产收益率ret_data = np.log(assetdata/assetdata.shift(1)).dropna()# 计算资产权重assetweight = portfolio_optimize(ret_data)# 输出资产权重print(assetweight)# 循环调整权重for s in context.assetlist:# 调制至目标仓位order_target_percent(s,assetweight[s])
# 风险评价主函数
def portfolio_optimize(ret_mat,cov_shrink=True,method='risk_parity'):#time horizonT=len(ret_mat)t=int(T/4)#expect returnexp_ret=ret_mat.mean()*252#covarianceif cov_shrink==False:cov_mat=ret_mat.cov()*252#shrink covariance to 4 time periodif cov_shrink==True:cov_mat=252*(ret_mat.iloc[:t].cov()*(1/10)+ret_mat.iloc[t+1:2*t].cov()*(2/10)+ret_mat.iloc[2*t+1:3*t].cov()*(3/10)+ret_mat.iloc[3*t:].cov()*(4/10))#set input datak=len(ret_mat.columns)weights=np.array(k*[1/k])#set functiondef risk_parity(weights):risk_vector=np.dot(weights,cov_mat)marginal_risk=weights*risk_vector/np.sqrt(np.dot(weights.T,np.dot(cov_mat,weights)))TRC=[np.sum((i-marginal_risk)**2) for i in marginal_risk]return np.sum(TRC)#set constraintsbnds=tuple((0,1) for x in range(k))cons = ({'type':'eq', 'fun': lambda x: sum(x) - 1})if method=='risk_parity':result = sco.minimize(risk_parity,weights,bounds=bnds,constraints=cons,method='SLSQP')optimal_weights=pd.Series(index=cov_mat.index,data=result['x'])return optimal_weights
量化择时策略入门与实操-笔记(同花顺金融量化实验室python实现)相关推荐
- 盘点那些高大上的量化择时方法都有哪些?
量化择时的概念 择时交易是指利用某种方法来判断大势的走势情况,如果判断上涨则买入持有,如果判断下跌则卖出清仓,如果判断震荡则高抛低吸,从而获得超越大盘的收益.量化择时就是使用数量化方法来找出影响 ...
- quantrader和matlab不匹配,【Matlab量化投资】支持向量机择时策略
原标题:[Matlab量化投资]支持向量机择时策略 感谢国泰安与本公众号合作 推出[Matlab量化投资系列] 机器学习 所谓机器学习,其实就是根据样本数据寻找规律,然后再利用这些规律来预测未来的数据 ...
- 添加布林带择时策略有多便捷!股票量化分析工具QTYX-V2.4.7
前言 布林带通道(Bollinger Bands)是非常经典的技术指标,常用于研判市场中长期运动趋势. 比如我们以[350, 2,2] 这组长线参数来绘制恒瑞医药.贵州茅台10年行情走势的布林带通道, ...
- python量化交易--择时策略
1.在banban网爬取所有A股的股票名称和代码. 观察板板网站的股票,将在深圳上市和上海上市的A股信息爬取并保存到本地文件 2.传入股票代码,利用tushare api提取股票的所有历史数据,对股票 ...
- 【Python 量化交易】什么是择时策略
量化金融:什么是择时策略? 什么是市场择时? 市场择时概要 择时成本 损失机会的代价 交易成本的代价 真实例子 什么是市场择时? 市场择时,也可以叫做市场选时,是一种投资或者交易的策略.是一种基于某种 ...
- 【量化投资】基金择时策略浅析(3) -实用择时方法
常见择时方法 本系列第一篇文章中曾介绍过选品和择时的概念,并且提到过这两个其实都是定义比较宽松的概念,任何投资者在任何市场中做的投资决策,无论是依据基本面因素,技术指标,还是量化模型,都可以看作择时. ...
- 基于matlab量化投资策略,【Matlab量化投资】支持向量机择时策略
推出[Matlab量化投资系列] 机器学习 所谓机器学习,其实就是根据样本数据寻找规律,然后再利用这些规律来预测未来的数据(结果). 但是,直到今天,机器学习也没有一种被大家广泛认同的理论框架产生,这 ...
- 【量化】基于聚宽实现MACD均线择时策略
MACD均线择时策略是十分基础的策略,适合咱们这种新手学习,这篇博客就分享一下基于聚宽实现MACD均线择时策略. 代码: 注:需要到聚宽的量化平台去运行. # MACD均线择时策略 ''' 筛选出符合 ...
- 可转债量化系列之二:估值择时策略初探
摘要 转债研究以估值为核心,周期波动受股票和债券的双重驱动 可转债的核心点在于研究其估值水平,其估值周期通常会受到正股和自身波动的多重影响,本文对于转债择时的研究从估值维度展开. (1)对于转债指标, ...
最新文章
- netty服务器返回信息关闭,netty4 服务端同步客户端返回的结果
- 所谓情商高就是会说话
- android mvvm流程图,MVVM框架模式详解
- sendBroadcast与sendStickyBroadcast的区别
- Struts2与Struts1的区别
- php数组重置,php 重置数组索引,兼容多维数组
- php 业务管理,PHPOA集团版协同套件:整合集团业务的管理平台
- 【前端学习笔记】2015-09-02~~~~ 关于filter()匹配的使用
- c语言5的阶乘流程图_求n流程图(求n的阶乘的算法框图)
- 《ShowYou数组代码》第38题:对数组元素进行排序
- STM32-GPIO的配置和使用
- 第三方支付回调地址代理转发
- 自定义 View 之雅虎新闻视差动画
- VMware 安装WIN10 WIN7
- 41. 如何手动触发全量回收垃圾,如何立即触发垃圾回收
- CES2018,三星为何将MicroLED应用于电视而非手机?
- 助力品牌洞察——消费者情绪行为分析
- 【无标题】win7系统支持node14以上的版本
- Oracle11G的数据库数据导入导出(由11g上导出导入10g数据库等)
- 16家上市车企2018年度中期经营业绩
热门文章
- 房卡麻将分析之一键入局
- codevs1024一塔湖图(丧心病狂的建图)
- 爱奇艺迎史上最大裁员潮:总监说撸就撸,有的部门直接裁一半......
- 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api
- 毕业设计 远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
- java 侵入性_侵入式列表实现Java?
- PIC单片机延时问题
- 2.4.2 小型机状态
- html 气泡动画效果,css3实现好看的气泡按钮动画特效
- SQL题:还款情况分析