刷题系列 - 序列化和反序列化一个二叉树
序列化和反序列化一个二叉树,是很开放的一题,就是给出一个二叉树,用序列化方法生成一个字符串;然后用反序列化方法把这个字符串生成原来二叉树。这个在编程时候各个类型一般都有序列化的,用于存储。这里面要用到python中list转化字符串方法 ','.join(list), 和字符串转换为list的方法string.split(',')。其实可以用之前刷题的几个题目来组合
刷题系列 - 在给出二叉树中两个点,求出其最小共同父节点
继续刷题,感觉刷题还有乐趣的,搞得都不想去研究量化策略了。如果以前读书时候有这样刷题网站,简单而方便思考实现,估计我的计算机分数会好很多。题目是在给出二叉树中两个点,求出其最小共同父节点(LCA Lowest Common Ancestor),如下图很好理解,比如5和1的共同父节点是3;6和7的最小共同父节点是5;而5和4的最小共同父节点是5本身。 考虑了一下,其实思路很简答,首先用前序
刷题系列 - 在二叉树中,为每个节点关联其右相邻节点
继续刷题,题目如下图如果用C描述的话,就是一个二叉树节点定义包括右节点指针,左节点指针,和右相连指针;给出一个二叉树,维护其右相邻指针,如果是最右边节点,则指针为空。struct Node { int val; Node *left; Node *right; Node *next;}思路其实很简单,这个可以按层分析二叉树,首先把当前层节点按照从左到
刷题系列 - 给出前序和中序遍历队列,构造对应二叉树
既然中序和后序队列构成二叉树写了,就把前序和中序一做吧。原理其实也很简单,前序队列第一个点就是根节点,再中序队列里面这个根节点可以分出左右两个树的两个中序队列,然后可以按照左右树的节点数量,再前序节点里面分出对应两组前序队列;然后反复递归即可。# Definition for a binary tree node. # cla
刷题系列 - 中序和后序遍历队列,构造对应二叉树;
假期继续刷题,也没有别的什么事情可以干。 这个题是给出中序和后序遍历队列,构造对应二叉树;题目很简单,如下图,给出两个遍历队列,构成二叉树,这里假定没有重复点。 想了好几天,真是惭愧,因为一直想一次遍历就完成构造,最后发现不行;然后就硬搞出一个多重循环的遍历方法,虽然可行,但是提交后提示耗时超过限制。最后还是用递归实现的。 其实原理很简单,对于后续遍历队列
刷题系类 - Python判断二叉树是否存在一条路径满足和值要求
继续刷题,判断二叉树是否存在一条路径满足和值要求。这个名称描述很复杂,其实很简单。如下图,判断是否有一个从根节点到叶子节点路径,和值为8, 就是1 -> 2-> 5。这个用递归来做很简单,就是判断输入节点的值和输入值是否一样,如果是而且当前节点为叶子节点,返回True,如果当前节点为空,返回False; 如果都不是,则递归到输入节点子节点,并且输入值为sum减去当前节点。这里使用or
刷题系列 - Python判断是否镜像对称二叉树
继续刷题,判断是否镜像对称二叉树。镜像对称二叉树,顾名思义,以根节点为轴,左右节点和节点内容互为镜像;如下图所示。这里要避免和完全二叉树混淆。这个我还是考虑了一段时间,递归和迭代都可以实现。递归的,如果一个节点值作为输入很难实现,所以新建一个新方法recurse,输入左右两个节点,返回bool值。思路很简单,如果输入两个节点都是空,可能是单个跟节点,返回True;如果一个有,另一个为空,返回Fal
刷题系列 - Python用递归实现求二叉树深度
继续刷题, Python用递归实现求二叉树深度。其实就是求二叉树层级,比如一个单点就是一层,一个单点加左右两个叶子节点就是两层。其实二叉树问题用递归来求是比较快的。这个也是介绍的默认递归方法,就是如有子节点,递归,直到没有子节点为止。# Definition for a binary tree node. # cla
刷题系列 - Python实现二叉树按层级遍历
继续刷题,刷题果然会上瘾。Python实现二叉树按层级遍历,看起来有点复杂。如下图,如果一个二叉树有多层,则从上到下,每层按从左到右遍历。每层放在一个队列,整体返回一个多组队列的队列。看起来复杂,其实实现反而很简单;不用栈,就用一个节点队列放当前层级节点,遍历当前层级节点,读取值放入一个读取队列,读取当前节点的子节点放入另一个队列;当当前队列节点遍历完成后,使用下一层节点对用,相当于进入下一层,遍
刷题系列 - Python用非递归实现二叉树后续遍历
顺便把Python用非递归实现二叉树后续遍历也写了。其实前序中序和后续都是针对父节点说的。比如下面这个最简单二叉树。前序就是ABC,父节点A在前中序就是BAC,父节点A在中间后序就是BCA,父节点A在最后无论多复杂二叉树,基本都是同样遍历流程。后续遍历可以说是最简单的,从左开始遍历并放入栈,读取没有下级节点的节点值,然后把该节点推出栈,并删除和上级节点关联;然后替换栈中最上的点,并去遍历右边子节点
刷题系列 - Python用非递归实现二叉树中序遍历
刷题没事会上瘾,继续做了非递归中序遍历。中序遍历其实和就是先找到最左边节点,然后是其上级节点,再到上级节点的右边节点。比如下面的中序遍历结果就是 DBEAFC非递归实现逻辑,我想的这个比较笨。就是用一个队列做栈,先按照左边遍历压入栈中;当到左边叶子节点时候,读取并删除关联;推出栈回到上一级节点,如果上级节点没有右节点,则读取继续删除;如果有,则遍历右节点;为了防止右边遍历返回时候再次读取父节点;要
刷题系列 - Python用非递归实现二叉树前序遍历
刷刷题换换下脑子。然后去一个刷题网站,从入门开始,没想到python写多了,数据结构都忘了,第一个二叉树前序遍历就想了好久才写出来。这里记录下,也算记录。二叉树前序遍历(Binary Tree Preorder Traversal), 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树。如下图所示,前序遍历结果:ABDECF考虑了下,要创建两个队列,一个放遍历结果,一个做类似栈作用,把路过节点放
2019 量化交易策略实盘总结和一些展望
2019算是完整的跑完一年量化交易,18年是实盘开始,蒙着眼大胆瞎搞,19年小心翼翼,花了不少时间做了些理论研究。这里推荐石川,刀疤连和量子动物园这几个微信公众号,相对于18年大胆交易为主,但是不知道所以然,今年倒是对于CTA的跟随趋势交易有了理论的了解。今年收益中体还是盈利,但是并不过,不过总体逐渐走好,也给了我继续做量化动力。今年实盘的主要交易策略都是跟随趋势交易,主要都是下面三个,中间断断续
一个思路,利用T检验去寻找量化交易CTA趋势
经过一段时间学习和实践,感觉对于期货择时交易,跟随趋势基本上可以被认为是不二途径。那么对于CTA交易策略来说,及早发现趋势是非常重要。寻找趋势的方法很多,经典的比如均线快慢线交叉,布林带还有其他各种时序动量指标,这里推荐看看公众号刀疤连的一边大作‘和趋势做纯纯的朋友’。在实践中,发现经常陷入一个两难局面,一方面是希望即时发现趋势,这样不可避免就是的判定阈值变得敏感;往往就是敏感的指标被市场白噪声和
简单介绍下量化分析的常用库TA-lib
做python量化交易,尤其是做趋势跟踪的或者是K线指标分析跟踪的,TA-lib库基本都多多少少用到,搜索时候往往搜出来“塔利班”,所以玩笑塔利班库。尤其对于从传统K线技术分析转计算机量化的同好,基本上算是必备。第一,安装, 可以通过pip install ta-lib 进行安装,如果安装不了或者编译报错,可以直接在下载whl,然后pip install whl路径名 来安装https://www
在VNPY中策略中,使用分钟线合成日K线
在论坛里面看到不少关于分钟合成日线的讨论,也试着实现了。这里是针对vnpy2.0的,1.92其实基本也差不多。这里把合成的日线HLOC信息放在pandas.DataFrame里面,因为日线分析的话,对运算时间要求不是特别高,DataFrame足矣合成过程放在on_bar方法里面,对每个传入的分钟进行日线合并处理;这里用了trading == False进行判断,就是只在策略初始化过程对于历史数据进
针对量化交易的机器学习中,交易策略倾向于空仓的问题
之前做过利用机器学习做交易策略,最近也在看强化学习的。发现大多时候学习后策略都是倾向于空仓,完全不交易。当时还自嘲计算机有大智慧,空仓不玩是最好的策略。最近强化学习时候,才发现这个和回报值有关reward。如果不给空仓负回报的话,策略会在可能损失的主动交易,或者没有损失的空仓交易中,选择空仓作为自己的策略。所以,必须要引入基准利率,每天按照及基准策略计算本金损失,是的计算机避免长期空仓。可以用你的
使用cProfile针对回测进行性能分析,和结合说下提速思路
昨天再研究lru_cache缓存读取回测优化时候,使用了性能分析工具cProfile,发现还是非常强力的分析工具,这里做个简单介绍。并结合说下一些策略提速思路。关于cProfile使用这个文章写的很详细,https://www.cnblogs.com/btchenguang/archive/2012/02/03/2337112.html 。 这里我简单接受下。安装不用安装,python一
给vnTrader 1.92版本加入lru_cache缓存读取提速优化回测
VnTrader 2.0版本有不少提速措施,其中lru_cache是提高回测速度一个利器,让我用1.92为主的我很是羡慕。看说这个是python 3.5.2提供的功能,也就没多想。最近才发现其实有第三方在也支持python 2.7的版本,比如 functools32。还有一个用 C 语言实现的,更快的,同时兼容 Python2 和 Python3 的第三方模块 fastcache 能够实现同样的功
利用Jupyter Notekook做初步分析,包括给行情画图,加入分析曲线,和买卖点
最近一段时间都是Jupyter Notebook做策略的最初版本设计,就是行情导入画图一类。之前做个dataframe做分析容易,这个算是简化版本。新建一个DataAnalyzer 类,这个简单很多,支持从csv和mongodb导入行情数据,和从1分钟k线整合不同分钟k线下面是导入1分钟螺纹钢数据,整合为5分钟K线from pymongo import MongoCl