持续行动1期 42/100,“AI技术应用于量化投资研资”之可转债投资。
今天继续“从零实现一个量化回测系统”系列。
前篇把骨架搭建起来了,现在要实现量化之核心要策略。
策略就是根据输入的市场数据,设定的规则发出买或卖的指令。
01 积木式写策略
我的策略写法与传统不太一样,传统上来就是给一个on_bar函数,自己写策略吧,如同我们在pyalgotrade里看到的例子那样。
我把常用的策略变成策略块,然后只需要组合起来,就可以实现一个策略。
比如“买入并持有”,我们拆解成三个子策略,这些子策略是可以复用的:
一、只在第一天运行一次
class RunOnce: def __init__(self): super(RunOnce, self).__init__() self.done = False # 返回True表示后续的策略都不执行了,相当于是一个开关 def __call__(self, context): done = self.done self.done = True return done
二、股票池里所有的股票
当天的bar的index,写到context['selected']里
class SelectAll: def __init__(self): pass def __call__(self, context): df_bar = context['bar'] context['selected'] = list(df_bar.index) return False
三、等权买入
等权分配是比较常见的策略,从上一步得到的“selected”列表,来生成权重weights=[code: 比例]。
class WeightEqually: def __init__(self): pass def __call__(self, context): selected = context["selected"] n = len(selected) if n > 0: context['weights'] = {code: 1 / n for code in selected} else: context['weights'] = {} return False
我们engine的step函数需要加上算子的执行:
def step(self, index, date): df_bar = self.df.loc[date] if type(df_bar) is pd.Series: df_bar = df_bar.to_frame().T df_bar.index = df_bar['code'] df_bar.sort_index(ascending=True, inplace=True) self.acc.update_bar(date, df_bar) #收盘后,再执行交易(近似模拟) context = { 'bar': df_bar } for algo in self.algo_list: done = algo(context) if done: break
如此,我们把三个算子整合起来,就实现了“买入并持有”的策略:
e = Engine(init_cash=100000, datafeed=feed) e.run(algo_list=[RunOnce(), SelectAll(), WeightEqually()])
积木式的好处多多,可以复用,可以积累。
明天可以把买卖交易落地到Account里,并且可以对回测的风险、收益策略进行分析,并且可视化呈现出来。
关于投资的思考
投资也是门派林立,正统的如价值投资派,有点像武林中的名门正牌,基金经理多与少都号称自己的是价值投资。价值投资的心法是公司价值为锚,在价格低于其内在价值里买入,并在价格高估时卖出。另外一派是技术面派,所有信息都反应在价格里了,所以,只管看价格趋势,高估还可以更高,只要市场疯狂;低估还可以更低,恐慌情绪一旦形成。
其实都有道理,这是周期的不同阶段。
价格围绕价值如钟摆,群体的不理性把这个过程放大。技术派赌的是往右摆的过程,指望有高点退场;而基本面牌买在左边,越低越买,然后在市场回归时卖出。
量化派则吸收前两者心法中一切可以量化的信息。
量化派更接近科学,可以积累可以传承,可以优化,可以迭代。
最近文章:
飞狐,科技公司CTO,用AI技术做量化投资;以投资视角观历史,解时事;专注个人成长与财富自由。