大熊猫动量组合(趋势跟踪)量化模拟

时间:2016-10-13 06:57:07

标签: python pandas quantitative-finance momentum

我正在尝试构建基于S& P500指数的趋势跟踪动量投资组合策略(momthly数据) 我用Kaufmann的分形效率比来滤除洗盘信号 (http://etfhq.com/blog/2011/02/07/kaufmans-efficiency-ratio/) 我成功编写了代码,但它非常笨拙,所以我需要更好的代码建议。 战略 从雅虎财经获取S& P 500指数的数据 在回顾期X计算Kaufmann效率比(1,如果接近> close(n),0) 平均值计算值为2,从1到12时间段--->每月资产配置比率,1资产配置比率=现金(每年3%) 我在平均1到12的效率比方面遇到了困难。当然我知道它可以简单地通过for循环实现,这是非常容易的任务,但我失败了。 我需要更简洁和精致的代码,任何人都可以帮助我吗? 一个[' meanfractal']在下面的代码中困扰我。 谢谢 将pandas导入为pd 将matplotlib.pyplot导入为plt 导入numpy为np 将pandas_datareader.data导入为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 =价格(' SPY',' 2000-01-01') def fractal(a,p):     a [']'] = np.where(['价格']。差异(p)> 0,1,0)     a [' abs'] = a ['价格']。diff(p).abs()     a [' volatility'] = a.price.diff()。abs()。rolling(p).sum()     a ['分形'] = a [' abs']。值/ a ['波动率']。值* a ['方向' ] .values     返回['分形'] def meanfractal(a):     a [' meanfractal'] =(分形(a,1).values +分形(a,2).values + fractal(a,3).values + fractal(a,4).values + fractal (一,5).values +分形(一,6).values +分形(一,7).values +分形(一,8).values +分形(一,9).values +分形(一,10) .values +分形(一,11).values +分形(A,12).values)/ 12     a [' portfolio1'] =(a.price / a.price.shift(1).values * a.meanfractal.shift(1).values +(1-a.meanfractal.shift(1)。值)* 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.dropna()     一个= a.div(a.ix [0])     返回[['价格',' portfolio1',' portfolio2']]。plot() 打印(一) plt.show()

1 个答案:

答案 0 :(得分:2)

您可以通过在p中存储与DF相对应的值来进一步简化,而不是分别计算每个系列,如下所示:

def fractal(a, p):
    df = pd.DataFrame()
    for count in range(1,p+1):
        a['direction'] = np.where(a['price'].diff(count)>0,1,0)
        a['abs'] = a['price'].diff(count).abs()
        a['volatility'] = a.price.diff().abs().rolling(count).sum()
        a['fractal'] = a['abs']/a['volatility']*a['direction']
        df = pd.concat([df, a['fractal']], axis=1)
    return df

然后,您可以将重复操作分配给变量,从而减少重新计算时间。

def meanfractal(a, l=12):
    a['meanfractal']= pd.DataFrame(fractal(a, l)).sum(1,skipna=False)/l
    mean_shift = a['meanfractal'].shift(1)
    price_shift = a['price'].shift(1)
    factor = 1.03**(1/l)
    a['portfolio1'] = (a['price']/price_shift*mean_shift+(1-mean_shift)*factor).cumprod()
    a['portfolio2'] = ((a['price']/price_shift*mean_shift+factor)/(1+mean_shift)).cumprod()
    a.dropna(inplace=True)
    a = a.div(a.ix[0])
    return a[['price','portfolio1','portfolio2']].plot() 

获得的结果:

meanfractal(a)

Image

注意:如果速度不是主要问题,您可以通过pandas中的内置方法执行操作,而不是将它们转换为相应的numpy数组值。