会很感激。
import talib
df的格式为:
Open High Low Close Volume
Date
1993-01-29 43.970001 43.970001 43.750000 43.939999 1003200
1993-02-01 43.970001 44.250000 43.970001 44.250000 480500
1993-02-02 44.220001 44.380001 44.130001 44.340000 201300
以下代码没问题:
def ApplyIndicator(df, data_col, indicator_func,period):
df_copy = df.copy()
col_name = indicator_func.__name__
df_copy[col_name]=df_copy[data_col].apply(lambda x:indicator_func(x,period))
return df_copy
样品:
new_df = ApplyIndicator(df,['Close'],talib.SMA,10)
但是,如果我想要一个可以使用不同列的通用ApplyIndicator,例如talib.STOCH,它需要多于1个参数并需要不同的列:
slowk, slowd = STOCH(input_arrays, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])
对于这种情况,如果假设所有必需列都已在df中,我怎么能在一般talib函数上执行一般的ApplyIndicator函数。
谢谢。
有关这两项功能的更多详情:
SMA(real[, timeperiod=?])
和
STOCH(high, low, close[, fastk_period=?, slowk_period=?, slowk_matype=?, slowd_period=?, slowd_matype=?])
答案 0 :(得分:0)
使用原始ApplyIndicator
,可以这样做:
def slowk(arr, per):
return STOCH(arr, 5, 3, 0, 3, 0, prices=['high', 'low', 'open'])[0]
new_df = ApplyIndicator(df,['Close'], slowk, None)
Lambda在这里工作不会因为它的名字总是"",但是通过一些更聪明的列命名它们也应该没问题。
为了使它更优雅,我们可以使用任意数量的属性:
def ApplyIndicator(df, indicator_func, *args):
col_name = indicator_func.__name__
df[col_name] = df.apply(lambda x:indicator_func(x, *args))
return df
new_df = ApplyIndicator(df[['Close']], talib.SMA, 10)
new_df = ApplyIndicator(df[...], STOCH, 5, 3, 0, 3, 0, ['high', 'low', 'open'])
但事实上,整个功能是如此微不足道,用这样的单个调用替换它可能更容易:
df[['slowk', 'slowd']] = df.apply(
lambda idx, row: STOCH(row, 5, 3, 0, 3, 0, ['high', 'low', 'open']))