PageRenderTime 55ms CodeModel.GetById 29ms RepoModel.GetById 0ms app.codeStats 0ms

/talib/test_abstract.py

https://github.com/mrtigercn/ta-lib
Python | 234 lines | 194 code | 32 blank | 8 comment | 4 complexity | 32669c2ccbf8021492a12e00dbbadad2 MD5 | raw file
  1. import numpy as np
  2. from nose.tools import (
  3. assert_equals,
  4. assert_true,
  5. assert_false,
  6. assert_raises,
  7. )
  8. try:
  9. from collections import OrderedDict
  10. except ImportError: # handle python 2.6 and earlier
  11. from ordereddict import OrderedDict
  12. import talib
  13. from talib import func
  14. from talib import abstract
  15. from talib.test_data import ford_2012, assert_np_arrays_equal, assert_np_arrays_not_equal
  16. def test_pandas():
  17. import pandas
  18. input_df = pandas.DataFrame(ford_2012)
  19. input_dict = dict((k, pandas.Series(v)) for k, v in ford_2012.items())
  20. expected_k, expected_d = func.STOCH(ford_2012['high'], ford_2012['low'], ford_2012['close']) # 5, 3, 0, 3, 0
  21. output = abstract.Function('stoch', input_df).outputs
  22. assert_true(isinstance(output, pandas.DataFrame))
  23. assert_np_arrays_equal(expected_k, output['slowk'])
  24. assert_np_arrays_equal(expected_d, output['slowd'])
  25. output = abstract.Function('stoch', input_dict).outputs
  26. assert_true(isinstance(output, list))
  27. assert_np_arrays_equal(expected_k, output[0])
  28. assert_np_arrays_equal(expected_d, output[1])
  29. expected = func.SMA(ford_2012['close'], 10)
  30. output = abstract.Function('sma', input_df, 10).outputs
  31. assert_true(isinstance(output, pandas.Series))
  32. assert_np_arrays_equal(expected, output)
  33. output = abstract.Function('sma', input_dict, 10).outputs
  34. assert_true(isinstance(output, np.ndarray))
  35. assert_np_arrays_equal(expected, output)
  36. def test_SMA():
  37. expected = func.SMA(ford_2012['close'], 10)
  38. assert_np_arrays_equal(expected, abstract.Function('sma', ford_2012, 10).outputs)
  39. assert_np_arrays_equal(expected, abstract.Function('sma')(ford_2012, 10, price='close'))
  40. assert_np_arrays_equal(expected, abstract.Function('sma')(ford_2012, timeperiod=10))
  41. expected = func.SMA(ford_2012['open'], 10)
  42. assert_np_arrays_equal(expected, abstract.Function('sma', ford_2012, 10, price='open').outputs)
  43. assert_np_arrays_equal(expected, abstract.Function('sma', price='low')(ford_2012, 10, price='open'))
  44. assert_np_arrays_not_equal(expected, abstract.Function('sma', ford_2012, 10, price='open')(timeperiod=20))
  45. assert_np_arrays_not_equal(expected, abstract.Function('sma', ford_2012)(10, price='close'))
  46. assert_np_arrays_not_equal(expected, abstract.Function('sma', 10)(ford_2012, price='high'))
  47. assert_np_arrays_not_equal(expected, abstract.Function('sma', price='low')(ford_2012, 10))
  48. input_arrays = {'foobarbaz': ford_2012['open']}
  49. assert_np_arrays_equal(expected, abstract.SMA(input_arrays, 10, price='foobarbaz'))
  50. def test_STOCH():
  51. # check defaults match
  52. expected_k, expected_d = func.STOCH(ford_2012['high'], ford_2012['low'], ford_2012['close']) # 5, 3, 0, 3, 0
  53. got_k, got_d = abstract.Function('stoch', ford_2012).outputs
  54. assert_np_arrays_equal(expected_k, got_k)
  55. assert_np_arrays_equal(expected_d, got_d)
  56. expected_k, expected_d = func.STOCH(ford_2012['high'], ford_2012['low'], ford_2012['close'])
  57. got_k, got_d = abstract.Function('stoch', ford_2012)(5, 3, 0, 3, 0)
  58. assert_np_arrays_equal(expected_k, got_k)
  59. assert_np_arrays_equal(expected_d, got_d)
  60. expected_k, expected_d = func.STOCH(ford_2012['high'], ford_2012['low'], ford_2012['close'], 15)
  61. got_k, got_d = abstract.Function('stoch', ford_2012)(15, 5, 0, 5, 0)
  62. assert_np_arrays_not_equal(expected_k, got_k)
  63. assert_np_arrays_not_equal(expected_d, got_d)
  64. expected_k, expected_d = func.STOCH(ford_2012['high'], ford_2012['low'], ford_2012['close'], 15, 5, 1, 5, 1)
  65. got_k, got_d = abstract.Function('stoch', ford_2012)(15, 5, 1, 5, 1)
  66. assert_np_arrays_equal(expected_k, got_k)
  67. assert_np_arrays_equal(expected_d, got_d)
  68. def test_doji_candle():
  69. expected = func.CDLDOJI(ford_2012['open'], ford_2012['high'], ford_2012['low'], ford_2012['close'])
  70. got = abstract.Function('CDLDOJI').run(ford_2012)
  71. assert_np_arrays_equal(got, expected)
  72. def test_MAVP():
  73. mavp = abstract.MAVP
  74. assert_raises(Exception, mavp.set_input_arrays, ford_2012)
  75. input_d = {}
  76. input_d['close'] = ford_2012['close']
  77. input_d['periods'] = np.arange(30)
  78. assert_true(mavp.set_input_arrays(input_d))
  79. assert_equals(mavp.input_arrays, input_d)
  80. def test_info():
  81. stochrsi = abstract.Function('STOCHRSI')
  82. stochrsi.input_names = {'price': 'open'}
  83. stochrsi.parameters = {'fastd_matype': talib.MA_Type.EMA}
  84. expected = {
  85. 'display_name': 'Stochastic Relative Strength Index',
  86. 'function_flags': ['Function has an unstable period'],
  87. 'group': 'Momentum Indicators',
  88. 'input_names': OrderedDict([('price', 'open')]),
  89. 'name': 'STOCHRSI',
  90. 'output_flags': OrderedDict([
  91. ('fastk', ['Line']),
  92. ('fastd', ['Line']),
  93. ]),
  94. 'output_names': ['fastk', 'fastd'],
  95. 'parameters': OrderedDict([
  96. ('timeperiod', 14),
  97. ('fastk_period', 5),
  98. ('fastd_period', 3),
  99. ('fastd_matype', 1),
  100. ]),
  101. }
  102. assert_equals(expected, stochrsi.info)
  103. expected = {
  104. 'display_name': 'Bollinger Bands',
  105. 'function_flags': ['Output scale same as input'],
  106. 'group': 'Overlap Studies',
  107. 'input_names': OrderedDict([('price', 'close')]),
  108. 'name': 'BBANDS',
  109. 'output_flags': OrderedDict([
  110. ('upperband', ['Values represent an upper limit']),
  111. ('middleband', ['Line']),
  112. ('lowerband', ['Values represent a lower limit']),
  113. ]),
  114. 'output_names': ['upperband', 'middleband', 'lowerband'],
  115. 'parameters': OrderedDict([
  116. ('timeperiod', 5),
  117. ('nbdevup', 2),
  118. ('nbdevdn', 2),
  119. ('matype', 0),
  120. ]),
  121. }
  122. assert_equals(expected, abstract.Function('BBANDS').info)
  123. def test_input_names():
  124. expected = OrderedDict([('price', 'close')])
  125. assert_equals(expected, abstract.Function('MAMA').input_names)
  126. # test setting input_names
  127. obv = abstract.Function('OBV')
  128. expected = OrderedDict([
  129. ('price', 'open'),
  130. ('prices', ['volume']),
  131. ])
  132. obv.input_names = expected
  133. assert_equals(obv.input_names, expected)
  134. obv.input_names = {
  135. 'price': 'open',
  136. 'prices': ['volume'],
  137. }
  138. assert_equals(obv.input_names, expected)
  139. def test_input_arrays():
  140. mama = abstract.Function('MAMA')
  141. # test default setting
  142. expected = {
  143. 'open': None,
  144. 'high': None,
  145. 'low': None,
  146. 'close': None,
  147. 'volume': None,
  148. }
  149. assert_equals(expected, mama.get_input_arrays())
  150. # test setting/getting input_arrays
  151. assert_true(mama.set_input_arrays(ford_2012))
  152. assert_equals(mama.get_input_arrays(), ford_2012)
  153. assert_raises(Exception,
  154. mama.set_input_arrays, {'hello': 'fail', 'world': 'bye'})
  155. # test only required keys are needed
  156. willr = abstract.Function('WILLR')
  157. reqd = willr.input_names['prices']
  158. input_d = dict([(key, ford_2012[key]) for key in reqd])
  159. assert_true(willr.set_input_arrays(input_d))
  160. assert_equals(willr.input_arrays, input_d)
  161. # test extraneous keys are ignored
  162. input_d['extra_stuffs'] = 'you should never see me'
  163. input_d['date'] = np.random.rand(100)
  164. assert_true(willr.set_input_arrays(input_d))
  165. # test missing keys get detected
  166. input_d['open'] = ford_2012['open']
  167. input_d.pop('close')
  168. assert_raises(Exception, willr.set_input_arrays, input_d)
  169. # test changing input_names on the Function
  170. willr.input_names = {'prices': ['high', 'low', 'open']}
  171. assert_true(willr.set_input_arrays(input_d))
  172. def test_parameters():
  173. stoch = abstract.Function('STOCH')
  174. expected = OrderedDict([
  175. ('fastk_period', 5),
  176. ('slowk_period', 3),
  177. ('slowk_matype', 0),
  178. ('slowd_period', 3),
  179. ('slowd_matype', 0),
  180. ])
  181. assert_equals(expected, stoch.parameters)
  182. stoch.parameters = {'fastk_period': 10}
  183. expected['fastk_period'] = 10
  184. assert_equals(expected, stoch.parameters)
  185. stoch.parameters = {'slowk_period': 8, 'slowd_period': 5}
  186. expected['slowk_period'] = 8
  187. expected['slowd_period'] = 5
  188. assert_equals(expected, stoch.parameters)
  189. stoch.parameters = {'slowd_matype': talib.MA_Type.T3}
  190. expected['slowd_matype'] = 8
  191. assert_equals(expected, stoch.parameters)
  192. stoch.parameters = {
  193. 'slowk_matype': talib.MA_Type.WMA,
  194. 'slowd_matype': talib.MA_Type.EMA,
  195. }
  196. expected['slowk_matype'] = 2
  197. expected['slowd_matype'] = 1
  198. assert_equals(expected, stoch.parameters)
  199. def test_lookback():
  200. assert_equals(abstract.Function('SMA', 10).lookback, 9)
  201. stochrsi = abstract.Function('stochrsi', 20, 5, 3)
  202. assert_equals(stochrsi.lookback, 26)