我正在尝试根据 S&P500 指数(月度数据)构建跟随动量投资组合策略的趋势
我使用考夫曼的分形效率比过滤掉洗盘信号(http://etfhq.com/blog/2011/02/07/kaufmans-efficiency-ratio/)
我成功地编码了,但它非常笨拙,所以我需要建议以获得更好的代码。
战略
- 从雅虎财经获取标准普尔500指数数据
- 计算回溯期 X 的考夫曼效率比 (1 , if close > close(n), 0)
- 平均计算值 2,从 1 到 12 时间段 ---> 每月资产配置比率,1 资产配置比率 = 现金(每年 3%)
我很难平均 1 到 12 的效率比。当然,我知道它可以通过 for 循环简单地实现,而且是非常简单的任务,但我失败了。
我需要更简洁和精致的代码,有人可以帮助我吗?
a['meanfractal']
在下面的代码中困扰我..
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import pandas_datareader.data as web
def price(stock, start):
price = web.DataReader(name=stock, data_source='yahoo', start=start)['Adj Close']
return price.div(price.iat[0]).resample('M').last().to_frame('price')
a = price('SPY','2000-01-01')
def fractal(a,p):
a['direction'] = np.where(a['price'].diff(p)>0,1,0)
a['abs'] = a['price'].diff(p).abs()
a['volatility'] = a.price.diff().abs().rolling(p).sum()
a['fractal'] = a['abs'].values/a['volatility'].values*a['direction'].values
return a['fractal']
def meanfractal(a):
a['meanfractal']= (fractal(a,1).values+fractal(a,2).values+fractal(a,3).values+fractal(a,4).values+fractal(a,5).values+fractal(a,6).values+fractal(a,7).values+fractal(a,8).values+fractal(a,9).values+fractal(a,10).values+fractal(a,11).values+fractal(a,12).values)/12
a['portfolio1'] = (a.price/a.price.shift(1).values*a.meanfractal.shift(1).values+(1-a.meanfractal.shift(1).values)*1.03**(1/12)).cumprod()
a['portfolio2'] = ((a.price/a.price.shift(1).values*a.meanfractal.shift(1).values+1.03**(1/12))/(1+a.meanfractal.shift(1))).cumprod()
a=a.dropna()
a=a.div(a.ix[0])
return a[['price','portfolio1','portfolio2']].plot()
print(a)
plt.show()