持续行动1期 43/100,“AI技术应用于量化投资研资”之可转债投资。

投资的心法大同小异,都是以合适的价格买入好的东西。

由于所处的周期位置不同,判断的标准产生了差异罢了。

为何我们先从转债入手,因为转债与股票相比,多了债性,估值更容易,风险相对更低。若是操作得当,收益并不比股票差,而且转债背后仍然是上市公司分析,是股票。

所以,对于基本面的分析逻辑是类似的,后面可以平滑切换到股票投资。

转债投资里最经典的“双低”策略,大部分的策略都是它的变种,心法是一样的。

前面的文章讲到“积木式”的策略搭建,做到了自动选股和权重分配。

今天我们要把这些信息落实到模拟交易里。

01 执行“按权重调仓”交易

前面我们实现了order_by_mv, order_sell_mv这两个方法,是买入某支股票mv,或者卖出某支股票mv。

在投资组合管理中,更通用的操作是按总市值的仓位比例来分配的。

比如股债平稳策略,股票70%,债券30%,无论你当前市值是多少,都在这个比例来操作,我们并不关心具体市值是多少。

另外这个方法同样适用于“动态再平稳”,就是定时执行这个操作,把仓位恢复到一个即定的比例。

在实际操盘过程中,这里涉及到先卖再买(当然存在卖不了或者滑点的情况),出于简化的考虑,我们可以先忽略——投资讲“模糊的正确”

把当前持仓市值计算出来:

# 持仓市值,不包括cash
def _calc_total_holding_mv(self):total_mv = 0.0for s, mv in self.curr_holding.items():total_mv += mvreturn total_mv

执行按比例调仓:

# weights的格式 {'symbol1':0.2, 'symbol2':0.7} weights加和需要0<= x <=1,若小于1,则剩余部分按cash算。
def adjust_weights(self, date, weights):# 计算当前的总市值total_mv = self._calc_total_holding_mv()total_mv += self.curr_cashold_pos = self.curr_holding.copy()self.curr_holding.clear()# 分配新权重for s, w in weights.items():self.curr_holding[s] = total_mv * wself.curr_cash = total_mv - self._calc_total_holding_mv()logger.info('发起权重调仓,日期:{}, 旧仓位:{},新仓位:{}'.format(date, old_pos, self.curr_holding))

在引擎处直接调用即可:

e = Engine(init_cash=100000, datafeed=feed)
e.run(algo_list=[RunOnce(), SelectAll(), WeightEqually(), AdjustWeights()])
logger.info('回测完成!')
logger.info(e.acc.cache_portfolio_mv[-1])

茅台就算不复权,从02年买入并持有,也是50多倍呀!

02 使用qlib数据库

我们需要对可转债全市场数据做回测,所以一个高性能的数据库是必要的。

import qlib
from qlib.constant import REG_CN
from qlib.data import D
from qlib.data.dataset.loader import QlibDataLoaderclass QlibDataFeed:def __init__(self):self.all_df = Nonedef add_data(self, data_dir):qlib.init(provider_uri=data_dir, region=REG_CN)def get_all_df(self, start_date='2010-01-01'):if self.all_df:return self.all_dffields = ['$close','$close/Ref($close,1)-1','$close+ ($close/(100/$chg_price*$stk_close)-1)*100']names = ['close','rate', 'double_low']data_loader_config = {"feature": (fields, names),# "label": (labels, label_names)}data_loader = QlibDataLoader(config=data_loader_config)instruments = D.instruments(market='all')df = data_loader.load(instruments=instruments, start_time=start_date)df = df['feature']df.reset_index(level=1, inplace=True)df.rename(columns={'instrument':'code'}, inplace=True)self.all_df = dfreturn self.all_df

从2010年开始所有转债的日频交易数据,以及它们的“双低值”一次计算出来,一共30万+条数据:

03 SelectTopK算子

由于我们是每天执行一次,所以不需要加时间算子。

策略上需要把“买入并持有”的SelectAll改成SelectTopK即可,也就是选择“双低值”最小的前K个。

我们的策略是不是很通用?

Qlib框架有TopK的策略,我们可以借用过来,封装成我们自己的“算子”。

class SelectTopK:def __init__(self, K=10, order_by='pred_score', ascending=False):self.K = Kself.order_by = order_byself.ascending = ascendingdef __call__(self, context):logger.debug(self.__class__.__name__)df_bar = context['bar']# 前面还可以加规则,所以先看有没有选股过程selectedif 'selected' in context.keys():if len(context['selected']) == 0:# print('SelectTopK遇空仓,直接跳过')# 若前面计算过selected,是空仓,那不需要排序,继续下一轮,但不退出——有可能要清仓操作。return Falseto_select = []for s in context['selected']:if s in df_bar.index:to_select.append(s)#规则选股后,在子集里排序df_bar = df_bar.loc[to_select]df_bar.sort_values(by=self.order_by, ascending=self.ascending, inplace=True)  # 倒序symbols = df_bar.index[:self.K]logger.debug('选股结果:{}'.format(symbols))context['selected'] = symbols

这里暂未考虑,已经持仓的就不动的,只调仓新增的和卖出的,这个下一步实现。

算子使用非常简单:

e = Engine(init_cash=100000, datafeed=feed)
# e.run(algo_list=[RunOnce(),SelectAll(), WeightEqually(), AdjustWeights()])
e.run(algo_list=[SelectTopK(ascending=True, K=5, order_by='double_low'), WeightEqually(), AdjustWeights()])

相比“买入并持有”到“双低"策略我们仅改动一行代码

一个基础的版本,没有仔细筛选转债背后公司的质量,也没有判断回售期之类的,作为一个benchmark,十年8倍!

年化17.5%,不过最大回撤有点大,达到45.9%,所以这里还有较大的优化空间,今天主要是检验回测系统。

从零开始实现一个量化回测系统(一)

从零开始实现一个量化回测系统(二)

关于投资的思考

无论要不要以此为职业、事业,如同写作技能一样,每个人应该掌握一点投资知识。

投资能力其实反映了对世界的认知

除去必要的金融知识,比如你要交易转债,你肯定得知道转债的交易规则,以及背后的定价逻辑——这些基础知识都是可以很快学会的。

投资的天花板,有点像比特币之于李笑来。

他不是职业投资人,他讲投资也只讲定投。但他的认知结构和”常识“,在他初次见到BTC的时候,敏感的认为这是个机会,并抓住这个时间窗口。

飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。

年化17.5%,十年8倍的“双低”转债策略:从零实现量化回测系统之三相关推荐

  1. 量化投资回测教学之掌握矢量化回测

    量化投资回测教学之掌握矢量化回测 1. 什么是回测? 回测用于模拟交易策略的过去表现. 回测的核心概念是通过回溯时间来模拟给定的交易策略,并像过去一样执行交易.产生的利润通常通过一些指标(例如最大回撤 ...

  2. 《壹百度—百度十年千倍的29条法则》

    <壹百度-百度十年千倍的29条法则>中的29条法则 1.人一定要做自己喜欢并擅长的事 内心的喜好是推动事业进步的最大动力,它能帮你克服困难,坚持到底:而如果你喜欢的事情有很多,要挑选自己最 ...

  3. 《壹百度—百度十年千倍的29条法则》,互联网营销

    <壹百度-百度十年千倍的29条法则>中的29条法则 1.人一定要做自己喜欢并擅长的事 内心的喜好是推动事业进步的最大动力,它能帮你克服困难,坚持到底:而如果你喜欢的事情有很多,要挑选自己最 ...

  4. 转:壹百度-百度十年千倍的29条法则

    推荐:壹百度-百度十年千倍的29条法则 家里不远处有纸老虎,是一个不错的读书好去处,之前去过几次,每次都发现好多人去那不是买书,而是去那看书的.环境不错,里面有很多做的长板凳提供给我们 坐下来慢慢阅读 ...

  5. Docker最全教程之MySQL容器化 (二十四)

    Docker最全教程之MySQL容器化 (二十四) 原文:Docker最全教程之MySQL容器化 (二十四) 前言 MySQL是目前最流行的开源的关系型数据库,MySQL的容器化之前有朋友投稿并且写过 ...

  6. 一年十倍的期货操盘策略(四):无形套利模式

    <一年十倍的期货操盘策略(3):分时技巧>主要内容简介:在期货交易中,大多数投资者没有正确的理念和稳定的赢利模式,混乱无序.漫无章法的操作思维模式,注定了投资结果的偶然性--赚得是稀里糊涂 ...

  7. 读书笔记 - 《壹百度 十年千倍的29条法则》

    本文更新版本已挪至  http://www.zhoujingen.cn/blog/1897.html -------------------  家里不远处有纸老虎,是一个不错的读书好去处,之前去过几次 ...

  8. 壹百度-百度十年千倍的29条法则

    家里不远处有纸老虎,是一个不错的读书好去处,之前去过几次,每次都发现好多人去那不是买书,而是去那看书的.环境不错,里面有很多做的长板凳提供给我们坐下来慢慢阅读,愿意的话还可以带着笔记本去.我现在周末只 ...

  9. 偏离策略年化收益回测出来了,高达372%

    大家好,我是启四,长期分享套利机会. 长话短说,经过艰苦的努力,我终于把偏离策略的收益回测出来了,结果是让人惊喜的! 时间取 2021-06-25 到 2021-11-23, 取偏离策略的前 5 进行 ...

最新文章

  1. Azure手把手系列 1:微软中国公有云概述
  2. ASP.Net请求处理机制初步探索之旅 - Part 5 ASP.Net MVC请求处理流程
  3. MySQL与Oracle主键冲突解决方式
  4. java设计模式观察者模式_java设计模式--观察者模式
  5. 【Linux】shell命令总结
  6. Python:日期和时间类型学习
  7. cvpr常用资源整理
  8. 【数据结构】图文详解Treap平衡树
  9. 顺通车间扫码出入库管理系统仓库扫码软件
  10. 新版FMEA软件结构树图 免费申请试用(FMEAHunter)
  11. 【MATLAB】从文件读取:xlsread、load
  12. 积木报表-报表常用操作
  13. 生动实践现代农业-国稻种芯-泸州江阳:谋定产村深度融合
  14. 在Sdx中使用xfOpenCV
  15. [Django项目案例]搭建用户与商品后台管理系统
  16. Python将txt数据写入excel【分列】
  17. C4D阿诺德Arnold渲染器:C4DtoA mac版(支持c4d r23)
  18. java获取当前日期,前一天,前N天,去年同期等日期
  19. 通过码云来学习Git的进阶技能(文末附福利!)
  20. HKC神盾显示器MG27Q - Nano IPS显示器的好选择

热门文章

  1. JZOJ 6276.树【扫描线】【线段树】
  2. 读书笔记:Bi-Directional Cascade Network for Perceptual Edge Detection
  3. SparkSql 控制输出文件数量且大小均匀(distribute by rand())
  4. 云服务器BBC销售渠道,云服务器bbc
  5. CUDA 学习(CUDA实战 第四章)
  6. word文档打不开显示内容有问题要怎么解决?
  7. FATE —— 二.4.2 Criteo上的联邦经典CTR模型训练
  8. 如何打开SQL server的MDF/LDF文件并修改数据
  9. SparkSteaming实时接收网络端口数据和hdfs做Wordcount
  10. 机器学习-华为mindspore入门-波士顿房价回归