python – 根据列表中的字符串调用函数

Terms: 
talib: Technical Analysis Library (stock market indicators, charts etc)
CDL: Candle or Candlestick

简短版本:我想基于字符串’some_function’运行my_lib.some_function()

在quantopian.com上,为了简洁起见,我想在循环中调用以CDL开头的所有60个talib函数,如talib.CDL2CROWS().首先将函数名称作为字符串,然后通过与字符串匹配的名称运行函数.

那些CDL函数都采用相同的输入,一段时间内的开放,高,低和收盘价格列表,这里的测试只使用长度为1的列表来简化.

import talib, re
import numpy as np

# Make a list of talib's function names that start with 'CDL'
cdls = re.findall('(CDL\w*)', ' '.join(dir(talib)))
# cdls[:3], the first three like ['CDL2CROWS', 'CDL3BLACKCROWS', 'CDL3INSIDE']

for cdl in cdls:
    codeobj = compile(cdl + '(np.array([3]),np.array([4]),np.array([5]),np.array([6]))', 'talib', 'exec')
    exec(codeobj)
    break
# Output:  NameError: name 'CDL2CROWS' is not defined

尝试第二个:

import talib, re
import numpy as np

cdls = re.findall('(CDL\w*)', ' '.join(dir(talib)))

for cdl in cdls:
    codeobj = compile('talib.' + cdl + '(np.array([3]),np.array([4]),np.array([5]),np.array([6]))', '', 'exec')
    exec(codeobj)
    break
# Output:  AssertionError: open is not double

我没有在网上找到这个错误.

相关的,我在那里问的问题:https://www.quantopian.com/posts/talib-indicators(111次观看,还没有回复)

对于任何对烛台感兴趣的人:http://thepatternsite.com/TwoCrows.html

更新

在Anzel的聊天帮助之后,这可能有用,可能浮动在列表中是关键.

import talib, re
import numpy as np
cdls = re.findall('(CDL\w*)', ' '.join(dir(talib)))
# O, H, L, C = Open, High, Low, Close
O = [ 167.07, 170.8, 178.9, 184.48, 179.1401, 183.56, 186.7, 187.52, 189.0, 193.96 ]
H = [ 167.45, 180.47, 185.83, 185.48, 184.96, 186.3, 189.68, 191.28, 194.5, 194.23 ]
L = [ 164.2, 169.08, 178.56, 177.11, 177.65, 180.5, 185.611, 186.43, 188.0, 188.37 ]
C = [ 166.26, 177.8701, 183.4, 181.039, 182.43, 185.3, 188.61, 190.86, 193.39, 192.99 ]
for cdl in cdls: # the string that becomes the function name
    toExec = getattr(talib, cdl)
    out    = toExec(np.array(O), np.array(H), np.array(L), np.array(C))
    print str(out) + ' ' + cdl

选择如何为字符串转换函数添加参数:

toExec = getattr(talib, cdl)(args)
toExec()

要么

toExec = getattr(talib, cdl)
toExec(args)

最佳答案 如果你想根据字符串’some_function’运行my_lib.some_function(),请使用getattr,如下所示:

some_function = 'your_string'
toExec = getattr(my_lib, some_function)

# to call the function
toExec()

# an example using math
>>> some_function = 'sin'
>>> toExec = getattr(math, some_function)

>>> toExec
<function math.sin>
>>> toExec(90)
0.8939966636005579

更新您的代码以便运行

for cdl in cdls:
    toExec = getattr(talib, cdl)

# turns out you need to pass narray as the params
toExec(np.narray(yourlist),np.narray(yourlist),np.narray(yourlist),np.narray(yourlist))

我还建议您需要查看您的列表,因为它是当前的1维,而您需要n维数组.

点赞