文字与代码来源: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实现)相关推荐

  1. 盘点那些高大上的量化择时方法都有哪些?

    量化择时的概念    择时交易是指利用某种方法来判断大势的走势情况,如果判断上涨则买入持有,如果判断下跌则卖出清仓,如果判断震荡则高抛低吸,从而获得超越大盘的收益.量化择时就是使用数量化方法来找出影响 ...

  2. quantrader和matlab不匹配,【Matlab量化投资】支持向量机择时策略

    原标题:[Matlab量化投资]支持向量机择时策略 感谢国泰安与本公众号合作 推出[Matlab量化投资系列] 机器学习 所谓机器学习,其实就是根据样本数据寻找规律,然后再利用这些规律来预测未来的数据 ...

  3. 添加布林带择时策略有多便捷!股票量化分析工具QTYX-V2.4.7

    前言 布林带通道(Bollinger Bands)是非常经典的技术指标,常用于研判市场中长期运动趋势. 比如我们以[350, 2,2] 这组长线参数来绘制恒瑞医药.贵州茅台10年行情走势的布林带通道, ...

  4. python量化交易--择时策略

    1.在banban网爬取所有A股的股票名称和代码. 观察板板网站的股票,将在深圳上市和上海上市的A股信息爬取并保存到本地文件 2.传入股票代码,利用tushare api提取股票的所有历史数据,对股票 ...

  5. 【Python 量化交易】什么是择时策略

    量化金融:什么是择时策略? 什么是市场择时? 市场择时概要 择时成本 损失机会的代价 交易成本的代价 真实例子 什么是市场择时? 市场择时,也可以叫做市场选时,是一种投资或者交易的策略.是一种基于某种 ...

  6. 【量化投资】基金择时策略浅析(3) -实用择时方法

    常见择时方法 本系列第一篇文章中曾介绍过选品和择时的概念,并且提到过这两个其实都是定义比较宽松的概念,任何投资者在任何市场中做的投资决策,无论是依据基本面因素,技术指标,还是量化模型,都可以看作择时. ...

  7. 基于matlab量化投资策略,【Matlab量化投资】支持向量机择时策略

    推出[Matlab量化投资系列] 机器学习 所谓机器学习,其实就是根据样本数据寻找规律,然后再利用这些规律来预测未来的数据(结果). 但是,直到今天,机器学习也没有一种被大家广泛认同的理论框架产生,这 ...

  8. 【量化】基于聚宽实现MACD均线择时策略

    MACD均线择时策略是十分基础的策略,适合咱们这种新手学习,这篇博客就分享一下基于聚宽实现MACD均线择时策略. 代码: 注:需要到聚宽的量化平台去运行. # MACD均线择时策略 ''' 筛选出符合 ...

  9. 可转债量化系列之二:估值择时策略初探

    摘要 转债研究以估值为核心,周期波动受股票和债券的双重驱动 可转债的核心点在于研究其估值水平,其估值周期通常会受到正股和自身波动的多重影响,本文对于转债择时的研究从估值维度展开. (1)对于转债指标, ...

最新文章

  1. netty服务器返回信息关闭,netty4 服务端同步客户端返回的结果
  2. 所谓情商高就是会说话
  3. android mvvm流程图,MVVM框架模式详解
  4. sendBroadcast与sendStickyBroadcast的区别
  5. Struts2与Struts1的区别
  6. php数组重置,php 重置数组索引,兼容多维数组
  7. php 业务管理,PHPOA集团版协同套件:整合集团业务的管理平台
  8. 【前端学习笔记】2015-09-02~~~~ 关于filter()匹配的使用
  9. c语言5的阶乘流程图_求n流程图(求n的阶乘的算法框图)
  10. 《ShowYou数组代码》第38题:对数组元素进行排序
  11. STM32-GPIO的配置和使用
  12. 第三方支付回调地址代理转发
  13. 自定义 View 之雅虎新闻视差动画
  14. VMware 安装WIN10 WIN7
  15. 41. 如何手动触发全量回收垃圾,如何立即触发垃圾回收
  16. CES2018,三星为何将MicroLED应用于电视而非手机?
  17. 助力品牌洞察——消费者情绪行为分析
  18. 【无标题】win7系统支持node14以上的版本
  19. Oracle11G的数据库数据导入导出(由11g上导出导入10g数据库等)
  20. 16家上市车企2018年度中期经营业绩

热门文章

  1. 房卡麻将分析之一键入局
  2. codevs1024一塔湖图(丧心病狂的建图)
  3. 爱奇艺迎史上最大裁员潮:总监说撸就撸,有的部门直接裁一半......
  4. 基于Thinkphp5+phpQuery 网络爬虫抓取数据接口,统一输出接口数据api
  5. 毕业设计 远程智能浇花灌溉系统 - stm32 单片机 嵌入式 物联网
  6. java 侵入性_侵入式列表实现Java?
  7. PIC单片机延时问题
  8. 2.4.2 小型机状态
  9. html 气泡动画效果,css3实现好看的气泡按钮动画特效
  10. SQL题:还款情况分析