pandas向量化回测策略开发

发布于:2022-11-28 ⋅ 阅读:(224) ⋅ 点赞:(0)

原创文章第69篇,专注“个人成长与财富自由、世界运作的逻辑, AI量化投资”。

身体健康真心非常重要,大约从七月份开始,间歇性腹胀,去医院开了两次药,有缓解,但没有根治,原因不明。

饮食习惯都调过来了,喝了快两个月的粥,体重倒是轻巧了不少。

华为高管当跑后还聚餐,结果人没了。

想想一个非常好的朋友,心梗离开都快三年了。

健康真的是基础,否则一切归零。

专注AI赋能量化投资。

专注与坚持其实反而是捷径,路会越走越轻松。

01 pandas 的一些高级应用

cut与qcut,对连续型序列进行分组切分,就成离散型的。

这个的应用场景是把“回归”问题,变成“分类”问题,这在机器学习中比较重要。比如收益率,是一个连续型变量,如果要用“分类”模型来解决,需要把收益率序列进行分组。

cut是把根据值来划分,比如20岁以下叫少年,60岁以上叫老人等。

qcut是按分位点来等,比如前10%,中间20%,后70%等。

在实际应用中,我们按分位点来等分会比较多。比如0,0.2,0.4,0.6,0.8,1, 这样把收益率进行5等分。

import numpy as np
import pandas as pd
ages = np.array([1,5,10,40,36,12,58,62,77,89,100,18,20,25,30,32]) #年龄数据
cut_ages = pd.cut(ages, [0,5,20,30,50,100], labels=[u"婴儿",u"青年",u"中年",u"壮年",u"老年"])
print(cut_ages)

data = pd.Series([0,8,1,5,3,7,2,6,10,4,9])
pd.qcut(data,[0,0.2,0.3,1],labels=['small number','middle number','large number'])

rolling滑动窗口,在量化回测中比较重要。

rolling取指定窗口的数据,min_periods决定最少需要几个数据及以上才进行计算。

rolling().max()和rolling().min()在“海龟策略”里就有实际应用。

import pandas as pd
amount = pd.Series([100, 90, 110, 150, 110, 130, 80, 90, 100, 150])
print(amount.rolling(3).sum())
print(amount.rolling(3,min_periods=1).sum())
print(amount.rolling(3).mean())
print(amount.rolling(3,min_periods=1).mean())
print("=============max===================")
print(amount.rolling(3).max())
print(amount.rolling(3,min_periods=1).max())

print("=============min===================")
print(amount.rolling(3).min())
print(amount.rolling(3,min_periods=1).min())

expanding取“有史”以来的所有的数据。

比如我们要计算“最高权益曲线”。

df['max_equity'] = df['equity'].expanding().max()

#1元波动图
df['equity'] = (df['rate'] +1).cumprod()
#max_equity 为有史以来的最大值序列
df['max_equity'] = df['equity'].expanding().max()
mdd = round((df['equity'] / df['equity'].expanding(min_periods=1).max()).min() - 1, 3)
print(mdd)
df[['equity','max_equity']].plot()

最大回撤率就很方便计算出来了。

mdd = round((df['equity'] / df['equity'].expanding(min_periods=1).max()).min() - 1, 3)
print(mdd)

结果为-72.3%。

   02 pandas回测双均线策略

策略特别简单:

两条均线,一条快线(短周期),一条慢线(长周期)。

“金叉时”做多;“死叉时”做空。

df['fast_sma'] = df['close'].rolling(50).mean()
df['slow_sma'] = df['close'].rolling(200).mean()
df['diff_sma'] = df['fast_sma'] - df['slow_sma']

计算交易信号,快线大于慢线时开多仓,反之开空仓。

df['signal'] = np.where(df['diff_sma']>0,1,0)
df['signal'] = np.where(df['diff_sma']<0,-1,df['signal'])

df["returns"] = np.log(df["close"] / df["close"].shift(1))
df["strategy"] = df["signal"].shift(1) * df["returns"]
df[[“returns”, “strategy”]].cumsum().plot()

03 用pandas回测海龟策略

海龟策略本质上是“唐奇安通道突破”策略。

原则:掌握优势,管理风险,坚定不移,简单明了。截断风险,让利润奔跑。

海龟交易法则可以认为是一个完整的交易系统,具备一个完整的交易系统所应该有的所有成分,包括市场、入市、头寸规模、止损/止盈、退出、买卖策略等:

唐奇安通道指标(Donchian channel)突破:

买入条件:当日收盘价突破N1天上限;

卖出条件:当日收盘价向下突破N2天下限。

df['n1_high'] = df['close'].rolling(42).max().shift(1)
df['n2_low'] = df['close'].rolling(21).min().shift(1)
df[['close','n1_high','n2_low']].plot()

#计算交易信号
df['signal'] = np.where(df['n1_high']>df['close'],1,0)
df['signal'] = np.where(df['close']<df['n2_low'],-1,df['signal'])

如上仅为“向量化”回测示意。

并没有加“止盈损”的操作。

本文含有隐藏内容,请 开通VIP 后查看