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

今天是中秋节和教师节,祝大家中秋快乐,教师节快乐!

今天开始一个主题——“从零实现一个量化回测系统”。

暂时不用考虑接入实盘,所以我会把订单、交易所,执行器等很多模拟交易的细节省掉,连事件驱动都省略,直接按bar来做循环。

这样代码看起来更加简洁,直奔核心而去,出了问题定位也相对容易。

一句话,该简化的简化,而且我们会兼容qlib的数据格式(其实等同于pandas的dataframe)。

01 账本account

我们就以自己做投资的视角来看这件回测,假设我们有一个账本叫Account。

Account有:

初始资金init_cash=10万。

维护当前还有多少现金余额:curr_cash。

当前持仓curr_holding = {"茅台": 20000.0} ,注意是 股票代码:市值。

cache_dates=['2010-01-01','2010-01-02'...]就是走过的bar的日期。

cache_porfilio_mv=[100000,,,,]每天的总市值(含现金)

class Account:def __init__(self, init_cash=100000.0):self.init_cash = init_cashself.curr_cash = self.init_cashself.curr_holding = defaultdict(float)  # 当前持仓{symbol:mv}self.cache_dates = []self.cache_portfolio_mv = []

总共这5个变量就够了

Account每天要做的事情:

一、更新持仓 curr_holding的市值,按持仓更新每支股票的市值,这个好理解,市值mv*涨跌幅

二、把总市值和日期cache起来。

# 要更新一次df_bar及市值,再进行交易。
def update_bar(self, date, df_bar):# 所有有持仓的,按收益率更新mvtotal_mv = 0.0# 当前已经持仓中标的,使用收盘后的收益率更新for s, mv in self.curr_holding.items():rate = 0.0# 这里不同市场,比如海外市场,可能不存在的,不存在变化率就是0.0, 即不变if s in df_bar.index:symbol_bar = df_bar.loc[s]rate = symbol_bar['rate']new_mv = mv * (1 + rate)self.curr_holding[s] = new_mvtotal_mv += new_mvself.cache_portfolio_mv.append(total_mv + self.curr_cash)self.cache_dates.append(date)

02 引擎engine

engine除了init_cash之外,需要一个datafeed。

datafeed里可以得到所有股票池的df数据,然后取出排重后的交易日期列表,对列表进行逐个bar的循环:

class Engine:def __init__(self, init_cash, datafeed):self.acc = Account(init_cash=init_cash)# 从feed得到df,并从index取出日期列表self.df = datafeed.get_all_df()self.dates = self.df.index.unique()def run(self):for index, date in enumerate(self.dates):self.step(index, date)def step(self, index, date):df_bar = self.df.loc[date]if type(df_bar) is pd.Series:df_bar = df_bar.to_frame().Tdf_bar.index = df_bar['code']df_bar.sort_index(ascending=True, inplace=True)self.acc.update_bar(date, df_bar)

03 支持交易:

想想,最简单的一个策略叫“买入并持有”,只有一个买入动作。

买入可以按“比例”买,也可以按“市值”买。从真实交易的角度,就是要买多少钱。

比例也可以换算成市值。

def order_buy_mv(self, instrument, mv):logger.debug('买入{},mv:{}'.format(instrument, mv))if mv <= 0.0:logger.warning('mv需要>0')returnif mv > self.curr_cash:logger.warning('资金不够,只能买:{}'.format(self.curr_cash))mv = self.curr_cashself.curr_holding[instrument] += mvself.curr_cash -= mv

要买的时候,需要检查现金够不够,如果不够,有多少就买多少,有一些系统是如果不行,完全不买,这个看策略。

然后更新curr_holding持仓市值,现金减少相应的市值。

卖出的逻辑类似:

def order_sell_mv(self, instrument, mv):logger.debug('卖出{},mv:{}'.format(instrument, mv))if mv <= 0.0:logger.warning('mv需要>0')returnmv_holding = self.curr_holding.get(instrument, 0.0)if mv_holding == 0:logger.warning('当前未持仓,无法卖出')returnelse:if mv_holding < mv:logger.warning('实际持仓:{},不够:{}'.format(mv_holding, mv))mv = mv_holdingself.curr_holding[instrument] -= mvself.curr_cash += mv

卖出的市值必须为正,同时如果未持仓,无法卖出。

如果仓位不够,只卖出当前持有的(也是清仓了)

然后更新curr_holding和curr_cash即可。

04 投资的可行性及意义

要把一件事当成“长期”事业来做,我们要问两个问题,

一是这件事行不行,如果逻辑上走通的概率低,但不值得当长线的事情来做;

二是这件事的意义,能不能给我们带来满足感,人还是讲自我实现的,尤其是当遇到困难的时候。

先说可行性,投资能不能当长线事情做。

也许你会说,有很多人把投资当成事业或者职业啊。比如职业股评师,基金经理,私募基金管理人等等,甚至很多失业的大龄中年都“沦”为职业股民。

但这么说我们心里还是没谱的,毕竟投资是一个概率游戏,西蒙斯花了十年时间才实现盈利,普通人能撑多久呢?

真正让我相信这条路可以当作B计划,因为它可以同时走三条路,一是互联网产品平台模式,比如集思录,理杏仁,乌龟量化等;二是IP模式,如螺丝钉,力哥,甚至做可转债的阿秋;三才是投资本身。

后者与前两者,如同淘金和送水。淘金具备不确定性,但送水具备稳定性。送水的同时自己同时可以研究淘金,一举多得。

三者叠加起来,让投资这条路的方向变得清晰,不用再担心打井有没有水的问题。

另外一个问题,是关于意义。

尽管前途光明,但道路是曲折的。

当道理曲折时,能不能坚持下去,除了内心相信能不能赢的必胜信心之外,还有就是对于这件事的认同

金融有没有意义,做投资如果纯粹是为了赚钱,客观讲这条路并不好走,冒的险并不少。

也许我们会说金融是为了资源跨时空的优化配置,投机有利于市场价格发现,这此理由高大上但不接地气。

西蒙斯从知名数学家进入资本市场,他的信念就是像解决数学难题一样去看待资本市场的“预测”,之于他证明定理无异。都是为了发现这个世界未知的规律,“顺便”实现了财富自由,带给自己更多的精神自由。

这一点给我不少启发。

其实,我们不是刻意做投资,我们是为了认知这个世界,社会,你如何得到相应的反馈,投资和资本市场是一个好的角度。否则你就像出租车司机般,大谈特谈对这个世界的偏见,除了夸夸其谈,并不能带来任何效果。

以投资的视角看待历史,现实,未来,去探索这个世界,“顺便”把投资做好。

这就是一个“系统”,所以,不必以短期投资效果作为衡量标准,而是持续改进我们的认知系统。

小结:

你仔细看看,一个回测引擎的核心其实就干这几件事,你就以你交易账本的视角来看就好,别管什么order, event。

就是买什么,买多少,卖什么,卖多少,每天根据市场涨跌更新一下市值。

只是后续由“量化策略”来决定 买或卖以及仓位的动作。

然后还有一个部分就是回测完成之后,做分析,比如风险收益特性,各种比率以及可视化等等。

后面的篇幅再展开。

投资是为了认知世界,投资可以做为一项长线的事业来积累和经营。

pyalgotrade量化回测框架简单试用

持续行动,做成一件件小事

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

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

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

    持续行动1期 43/100,"AI技术应用于量化投资研资"之可转债投资. 投资的心法大同小异,都是以合适的价格买入好的东西. 由于所处的周期位置不同,判断的标准产生了差异罢了. 为 ...

  2. matlab alpha策略,如何用Matlab建立策略回测系统?

    一,准备工具 matlab,windmatlab量化接口,Internet网络连接. wind量化接口可以从 大奖章网站-->开放接口-->个人版  处下载,根据提示进行操作,十几分钟内就 ...

  3. 手把手教你用Python搭建自己的量化回测框架【均值回归策略】

    1 引言 大部分量化策略都可以归类为均值回归与动量策略.事实上,只有当股票价格是均值回归或趋势的,交易策略才能盈利.否则,价格是随机游走的,交易将无利可图.均值回归是金融学的一个重要概念,指股票价格无 ...

  4. python外汇交易回测系统_易经量化交易系统之回测系统1

    我们在这里向大家介绍如何从零开始,实现一个适合于A股市场的回测系统.在这里我们以A股日K线数据为例,实际上可以比较方便的扩展为分级的数据源. Tick数据类 我们首先定义一个Tick数据的基类,这个类 ...

  5. python外汇交易回测系统_StarQuant - 综合量化交易回测系统/平台

    Welcome to StarQuant StarQuant(中文名:易数交易系统)是一个轻量的.面向个人( 普通)用户的综合量化交易回测系统,目前主要用于期货期权程序化交易(CTP接口,在实盘测试中 ...

  6. 目前市面上量化交易软件、平台、框架的特点, 重点推荐VNPY底层仿真回测系统

    随着这几年量化交易在国内的快速发展,各种API接口.量化平台.量化交易框架匆匆推出,呈现出一片百花齐放,欣欣向荣的景象,但是由于目前国内还处于私募基金发展的初期,大部分平台也都匆匆上马,既有自己的特点 ...

  7. 基于强化学习的期权量化交易回测系统1

    概述 量化交易平台很重要的一个环节就是回测系统,可以通过对历史行情的回放,验证量化交易策略的性能表现.量化交易强化学习环境,则是向Agent提供一个交互的环境,Agent(即量化策略)根据市场环境(强 ...

  8. 开源分布式量化交易系统——回测系统(一)

    回测系统 基础概念 在开始编写策略系统之前,需要了解一些基础概念,搞明白什么是回测系统?怎么进行回测?如何进行回测分析?并且在回测中需要注意的一些要素,真正的做到有效的策略回测. 根据回测的精度可分为 ...

  9. 基于强化学习的期权量化交易回测系统5

    我们现在已经可以在主循环中获取行情数据,并且传给了Agent类.接下来Agent类会调用策略类,由于决定采取的行动.在策略类做决策时,需要参考用户仓位Position信息,还有就是权利金.保证金.手续 ...

最新文章

  1. 关于信噪比的确切含义——Eb/No和SNR的区别
  2. 简单汇编----输入密码判断正否
  3. 安装搜狗输入法之后 Linux Mint 19.1 字体发虚解决方案
  4. 算法高级(38)-短网址(short URL)系统如何实现?
  5. jquery js 兄弟父元素的获取
  6. Docker-07:Docker网络管理
  7. 《打开量化交易的黑箱》读书笔记
  8. 【华谋咨询】企业5s管理做大做强的四大措施
  9. Word怎么转Excel表格
  10. 安装VMware15.5+安装win10虚拟机操作系统
  11. CString和LPVOID的转换(线程参数传递)
  12. 360影视php采集接口,苹果CMS后台联盟采集API接口数据
  13. SpringBoot 发送邮件功能(包含网易、QQ、Gmail邮箱)
  14. 双机热备系统的方案与软件浅析
  15. three.js 制作机房(上)
  16. 计算机主机风扇怎么庄,机箱风扇怎么装
  17. 天堂图片网的星空图片保存到电脑上方法步骤
  18. C++面试题目及面试经验
  19. 私有文件服务器系统,GitHub - xty438307820/NetDisk-Private: 基于Linux的私有文件服务器(网盘)...
  20. WiFi中AP和STA建立连接(Association)的过程

热门文章

  1. 【解决思路】Spring Boot:Error creating bean with name ‘xxxDao‘
  2. 【软件质量保障笔记】软件质量保障
  3. 减轻学生过重课业负担的规定
  4. 编译原理 最新版 (龙书) 简介and sources
  5. 更改linux文件/目录的权限、拥有者及用户组
  6. 知识那么多,作为一个IT人我们该怎样有效的学习?
  7. java中怎么计算一个方法执行时,耗费多少毫秒
  8. MySQL中Invalid default value错误解决方法
  9. DSSD: Deconvolutional Single Shot Detector
  10. Android历史版本