使用 talib、python 和 pandas 的滚动每周技术指标。
Rolling Weekly Technical Indicator using talib, python and pandas.
******** 更新了问题,更好的代码示例,现在用列表理解来做 **********
我正在尝试使用 pandas 和 talib 获取每周滚动技术指标。
"weekly rolling" 我的意思是,如果今天是星期四,那么今天的 ADX 每周值将仅使用本星期四、上星期四等来计算。之前每周 ADX 系列中的 ADX 仅使用星期三等计算。所以现在,一天过去了,我们站在星期五,应该只使用星期五来计算每周 ADX。
最后,ADX 系列就是所有这些 ADX 附加在一个系列中。
目前我使用列表理解生成 5 个列表,这些列表位于 "adxs_list" 内,每个列表是一周中的一天。
因此,例如 adxs_list[0] 显示仅在星期一计算的 talib.ADX 值,adxs_list[1] 显示仅在星期二计算的 talib.ADX 值,依此类推。
现在我在尝试将这些列表放回原始数据框中时遇到了困难。
试图将它们混合在一起,然后将它们添加到 DataFrame 但无法弄清楚...
所以问题是,我怎样才能将这些计算加入到原始数据帧中,以了解 df 的索引?
import pandas as pd
import numpy as np
import talib
df = pd.DataFrame(np.random.randn(1000,4),
index=pd.date_range(pd.datetime(2000,3,30), freq='B', periods=1000),
columns =['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW'] )
lista4 = ['W-MON','W-TUE','W-WED','W-THU','W-FRI']
adxs_list = [([talib.ADX(df['PX_HIGH'].resample(w).values,
df['PX_LOW'].resample(w).values, df['PX_LAST'].resample(w).values
, timeperiod=3)]) for w in lista4]
正在尝试使用:
adxs_frame = reduce(pd.DataFrame.combine_first,adxs_list)
并得到这个错误:
TypeError: 未绑定方法 combine_first() 必须使用 DataFrame 实例作为第一个参数调用(改为获取列表实例)
最后,我想我明白了。必须转置然后重新分配原始索引。不确定这是否是最快的方法,但它是这样的:
import pandas as pd
import numpy as np
import talib
df = pd.DataFrame(np.random.randn(100,4),
index=pd.date_range(pd.datetime(2000,3,30), freq='B', periods=100),
columns =['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW'] )
lista3 = ['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW']
lista4 = ['W-MON','W-TUE','W-WED','W-THU','W-FRI']
i0=[]
i1=[]
i2=[]
i3=[]
i4=[]
adxs_list = [([talib.ADX(df['PX_HIGH'].resample(w).values,
df['PX_LOW'].resample(w).values, df['PX_LAST'].resample(w).values
, timeperiod=3)]) for w in lista4]
# transposing the arrays and assigning them the original index of that week day
for u,v in [(u,v) for u,v in zip(range(5),lista4)]:
r = "i{0} = pd.DataFrame(adxs_list[{0}]).transpose().set_index(df.PX_OPEN.resample('{1}').index)".format(u,v)
exec r
# combining all the new dataframes into a single dataframe (respecting their indexes)
y0 = [i0, i1, i2, i3, i4]
i_frame = reduce(pd.DataFrame.combine_first, y0)
# merging this new dataframe into the original df
df = df.merge(i_frame, left_index=True, right_index=True)
# for some strange reason new column is named 0, so renaming it
names = df.columns.values
names[-1] = 'ADX_w'
df.columns = names
******** 更新了问题,更好的代码示例,现在用列表理解来做 **********
我正在尝试使用 pandas 和 talib 获取每周滚动技术指标。
"weekly rolling" 我的意思是,如果今天是星期四,那么今天的 ADX 每周值将仅使用本星期四、上星期四等来计算。之前每周 ADX 系列中的 ADX 仅使用星期三等计算。所以现在,一天过去了,我们站在星期五,应该只使用星期五来计算每周 ADX。 最后,ADX 系列就是所有这些 ADX 附加在一个系列中。
目前我使用列表理解生成 5 个列表,这些列表位于 "adxs_list" 内,每个列表是一周中的一天。 因此,例如 adxs_list[0] 显示仅在星期一计算的 talib.ADX 值,adxs_list[1] 显示仅在星期二计算的 talib.ADX 值,依此类推。
现在我在尝试将这些列表放回原始数据框中时遇到了困难。 试图将它们混合在一起,然后将它们添加到 DataFrame 但无法弄清楚...
所以问题是,我怎样才能将这些计算加入到原始数据帧中,以了解 df 的索引?
import pandas as pd
import numpy as np
import talib
df = pd.DataFrame(np.random.randn(1000,4),
index=pd.date_range(pd.datetime(2000,3,30), freq='B', periods=1000),
columns =['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW'] )
lista4 = ['W-MON','W-TUE','W-WED','W-THU','W-FRI']
adxs_list = [([talib.ADX(df['PX_HIGH'].resample(w).values,
df['PX_LOW'].resample(w).values, df['PX_LAST'].resample(w).values
, timeperiod=3)]) for w in lista4]
正在尝试使用:
adxs_frame = reduce(pd.DataFrame.combine_first,adxs_list)
并得到这个错误:
TypeError: 未绑定方法 combine_first() 必须使用 DataFrame 实例作为第一个参数调用(改为获取列表实例)
最后,我想我明白了。必须转置然后重新分配原始索引。不确定这是否是最快的方法,但它是这样的:
import pandas as pd
import numpy as np
import talib
df = pd.DataFrame(np.random.randn(100,4),
index=pd.date_range(pd.datetime(2000,3,30), freq='B', periods=100),
columns =['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW'] )
lista3 = ['PX_OPEN', 'PX_LAST', 'PX_HIGH', 'PX_LOW']
lista4 = ['W-MON','W-TUE','W-WED','W-THU','W-FRI']
i0=[]
i1=[]
i2=[]
i3=[]
i4=[]
adxs_list = [([talib.ADX(df['PX_HIGH'].resample(w).values,
df['PX_LOW'].resample(w).values, df['PX_LAST'].resample(w).values
, timeperiod=3)]) for w in lista4]
# transposing the arrays and assigning them the original index of that week day
for u,v in [(u,v) for u,v in zip(range(5),lista4)]:
r = "i{0} = pd.DataFrame(adxs_list[{0}]).transpose().set_index(df.PX_OPEN.resample('{1}').index)".format(u,v)
exec r
# combining all the new dataframes into a single dataframe (respecting their indexes)
y0 = [i0, i1, i2, i3, i4]
i_frame = reduce(pd.DataFrame.combine_first, y0)
# merging this new dataframe into the original df
df = df.merge(i_frame, left_index=True, right_index=True)
# for some strange reason new column is named 0, so renaming it
names = df.columns.values
names[-1] = 'ADX_w'
df.columns = names