原创文章第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'])
如上仅为“向量化”回测示意。
并没有加“止盈损”的操作。