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