首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >大熊猫动量组合(趋势跟踪)定量模拟

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

Stack Overflow用户
提问于 2016-10-13 06:57:07
回答 1查看 4.2K关注 0票数 2

我试图构建基于S&P 500指数(矩数据)的趋势跟随动量投资组合策略。

我用Kaufmann的分形效率比滤除了http://etfhq.com/blog/2011/02/07/kaufmans-efficiency-ratio/信号。

我成功地编写了代码,但它非常笨拙,所以我需要更好的代码建议。

策略

  1. 从雅虎金融公司获得标普500指数数据
  2. 在回溯周期X (1,如果关闭>关闭(N),0)上计算Kaufmann的效率比
  3. 平均计算值为2,从1至12个时间段->月资产分配比率,1-资产分配比率=现金(每年3%)

我有一个困难,平均1: 12的效率比。当然,我知道它可以简单地由for循环实现,这是非常容易的任务,但我失败了。

我需要更简洁和精炼的代码,有人能帮我吗?

a['meanfractal']在下面的代码中困扰着我。

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-13 09:17:55

您可以进一步简化,方法是将与p对应的值存储在DF中,而不是为每个系列单独计算,如下所示:

代码语言:javascript
复制
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

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

代码语言:javascript
复制
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() 

由此得到的地块:

代码语言:javascript
复制
meanfractal(a)

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40014258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档