PageRenderTime 27ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/ultrafinance/pyTaLib/__init__.py

http://ultra-finance.googlecode.com/
Python | 359 lines | 296 code | 29 blank | 34 comment | 29 complexity | f85867b6264cb170bebcc47be811141a MD5 | raw file
  1. '''
  2. Created on April 15, 2012
  3. @author: Bruno Franca
  4. '''
  5. from pandas import *
  6. from math import *
  7. #Moving Average
  8. def MA(df, n):
  9. MA = Series(rolling_mean(df['Close'], n), name = 'MA_' + str(n))
  10. df = df.join(MA)
  11. return df
  12. #Exponential Moving Average
  13. def EMA(df, n):
  14. EMA = Series(ewma(df['Close'], span = n, min_periods = n - 1), name = 'EMA_' + str(n))
  15. df = df.join(EMA)
  16. return df
  17. #Momentum
  18. def MOM(df, n):
  19. M = Series(df['Close'].diff(n), name = 'Momentum_' + str(n))
  20. df = df.join(M)
  21. return df
  22. #Rate of Change
  23. def ROC(df, n):
  24. M = df['Close'].diff(n - 1)
  25. N = df['Close'].shift(n - 1)
  26. ROC = Series(M / N, name = 'ROC_' + str(n))
  27. df = df.join(ROC)
  28. return df
  29. #Average True Range
  30. def ATR(df, n):
  31. i = 0
  32. TR_l = [0]
  33. while i < df.index[-1]:
  34. TR = max(df.get_value(i + 1, 'High'), df.get_value(i, 'Close')) - min(df.get_value(i + 1, 'Low'), df.get_value(i, 'Close'))
  35. TR_l.append(TR)
  36. i = i + 1
  37. TR_s = Series(TR_l)
  38. ATR = Series(ewma(TR_s, span = n, min_periods = n), name = 'ATR_' + str(n))
  39. df = df.join(ATR)
  40. return df
  41. #Bollinger Bands
  42. def BBANDS(df, n):
  43. MA = Series(rolling_mean(df['Close'], n))
  44. MSD = Series(rolling_std(df['Close'], n))
  45. b1 = 4 * MSD / MA
  46. B1 = Series(b1, name = 'BollingerB_' + str(n))
  47. df = df.join(B1)
  48. b2 = (df['Close'] - MA + 2 * MSD) / (4 * MSD)
  49. B2 = Series(b2, name = 'Bollinger%b_' + str(n))
  50. df = df.join(B2)
  51. return df
  52. #Pivot Points, Supports and Resistances
  53. def PPSR(df):
  54. PP = Series((df['High'] + df['Low'] + df['Close']) / 3)
  55. R1 = Series(2 * PP - df['Low'])
  56. S1 = Series(2 * PP - df['High'])
  57. R2 = Series(PP + df['High'] - df['Low'])
  58. S2 = Series(PP - df['High'] + df['Low'])
  59. R3 = Series(df['High'] + 2 * (PP - df['Low']))
  60. S3 = Series(df['Low'] - 2 * (df['High'] - PP))
  61. psr = {'PP':PP, 'R1':R1, 'S1':S1, 'R2':R2, 'S2':S2, 'R3':R3, 'S3':S3}
  62. PSR = DataFrame(psr)
  63. df = df.join(PSR)
  64. return df
  65. #Stochastic oscillator %K
  66. def STOK(df):
  67. SOk = Series((df['Close'] - df['Low']) / (df['High'] - df['Low']), name = 'SO%k')
  68. df = df.join(SOk)
  69. return df
  70. #Stochastic oscillator %D
  71. def STO(df, n):
  72. SOk = Series((df['Close'] - df['Low']) / (df['High'] - df['Low']), name = 'SO%k')
  73. SOd = Series(ewma(SOk, span = n, min_periods = n - 1), name = 'SO%d_' + str(n))
  74. df = df.join(SOd)
  75. return df
  76. #Trix
  77. def TRIX(df, n):
  78. EX1 = ewma(df['Close'], span = n, min_periods = n - 1)
  79. EX2 = ewma(EX1, span = n, min_periods = n - 1)
  80. EX3 = ewma(EX2, span = n, min_periods = n - 1)
  81. i = 0
  82. ROC_l = [0]
  83. while i + 1 <= df.index[-1]:
  84. ROC = (EX3[i + 1] - EX3[i]) / EX3[i]
  85. ROC_l.append(ROC)
  86. i = i + 1
  87. Trix = Series(ROC_l, name = 'Trix_' + str(n))
  88. df = df.join(Trix)
  89. return df
  90. #Average Directional Movement Index
  91. def ADX(df, n, n_ADX):
  92. i = 0
  93. UpI = []
  94. DoI = []
  95. while i + 1 <= df.index[-1]:
  96. UpMove = df.get_value(i + 1, 'High') - df.get_value(i, 'High')
  97. DoMove = df.get_value(i, 'Low') - df.get_value(i + 1, 'Low')
  98. if UpMove > DoMove and UpMove > 0:
  99. UpD = UpMove
  100. else: UpD = 0
  101. UpI.append(UpD)
  102. if DoMove > UpMove and DoMove > 0:
  103. DoD = DoMove
  104. else: DoD = 0
  105. DoI.append(DoD)
  106. i = i + 1
  107. i = 0
  108. TR_l = [0]
  109. while i < df.index[-1]:
  110. TR = max(df.get_value(i + 1, 'High'), df.get_value(i, 'Close')) - min(df.get_value(i + 1, 'Low'), df.get_value(i, 'Close'))
  111. TR_l.append(TR)
  112. i = i + 1
  113. TR_s = Series(TR_l)
  114. ATR = Series(ewma(TR_s, span = n, min_periods = n))
  115. UpI = Series(UpI)
  116. DoI = Series(DoI)
  117. PosDI = Series(ewma(UpI, span = n, min_periods = n - 1) / ATR)
  118. NegDI = Series(ewma(DoI, span = n, min_periods = n - 1) / ATR)
  119. ADX = Series(ewma(abs(PosDI - NegDI) / (PosDI + NegDI), span = n_ADX, min_periods = n_ADX - 1), name = 'ADX_' + str(n) + '_' + str(n_ADX))
  120. df = df.join(ADX)
  121. return df
  122. #MACD, MACD Signal and MACD difference
  123. def MACD(df, n_fast, n_slow):
  124. EMAfast = Series(ewma(df['Close'], span = n_fast, min_periods = n_slow - 1))
  125. EMAslow = Series(ewma(df['Close'], span = n_slow, min_periods = n_slow - 1))
  126. MACD = Series(EMAfast - EMAslow, name = 'MACD_' + str(n_fast) + '_' + str(n_slow))
  127. MACDsign = Series(ewma(MACD, span = 9, min_periods = 8), name = 'MACDsign_' + str(n_fast) + '_' + str(n_slow))
  128. MACDdiff = Series(MACD - MACDsign, name = 'MACDdiff_' + str(n_fast) + '_' + str(n_slow))
  129. df = df.join(MACD)
  130. df = df.join(MACDsign)
  131. df = df.join(MACDdiff)
  132. return df
  133. #Mass Index
  134. def MassI(df):
  135. Range = df['High'] - df['Low']
  136. EX1 = ewma(Range, span = 9, min_periods = 8)
  137. EX2 = ewma(EX1, span = 9, min_periods = 8)
  138. Mass = EX1 / EX2
  139. MassI = Series(rolling_sum(Mass, 25), name = 'Mass Index')
  140. df = df.join(MassI)
  141. return df
  142. #Vortex Indicator
  143. def Vortex(df, n):
  144. i = 0
  145. TR = [0]
  146. while i < df.index[-1]:
  147. Range = max(df.get_value(i + 1, 'High'), df.get_value(i, 'Close')) - min(df.get_value(i + 1, 'Low'), df.get_value(i, 'Close'))
  148. TR.append(Range)
  149. i = i + 1
  150. i = 0
  151. VM = [0]
  152. while i < df.index[-1]:
  153. Range = abs(df.get_value(i + 1, 'High') - df.get_value(i, 'Low')) - abs(df.get_value(i + 1, 'Low') - df.get_value(i, 'High'))
  154. VM.append(Range)
  155. i = i + 1
  156. VI = Series(rolling_sum(Series(VM), n) / rolling_sum(Series(TR), n), name = 'Vortex_' + str(n))
  157. df = df.join(VI)
  158. return df
  159. #KST Oscillator
  160. def KST(df, r1, r2, r3, r4, n1, n2, n3, n4):
  161. M = df['Close'].diff(r1 - 1)
  162. N = df['Close'].shift(r1 - 1)
  163. ROC1 = M / N
  164. M = df['Close'].diff(r2 - 1)
  165. N = df['Close'].shift(r2 - 1)
  166. ROC2 = M / N
  167. M = df['Close'].diff(r3 - 1)
  168. N = df['Close'].shift(r3 - 1)
  169. ROC3 = M / N
  170. M = df['Close'].diff(r4 - 1)
  171. N = df['Close'].shift(r4 - 1)
  172. ROC4 = M / N
  173. KST = Series(rolling_sum(ROC1, n1) + rolling_sum(ROC2, n2) * 2 + rolling_sum(ROC3, n3) * 3 + rolling_sum(ROC4, n4) * 4, name = 'KST_' + str(r1) + '_' + str(r2) + '_' + str(r3) + '_' + str(r4) + '_' + str(n1) + '_' + str(n2) + '_' + str(n3) + '_' + str(n4))
  174. df = df.join(KST)
  175. return df
  176. #Relative Strength Index
  177. def RSI(df, n):
  178. i = 0
  179. UpI = [0]
  180. DoI = [0]
  181. while i + 1 <= df.index[-1]:
  182. UpMove = df.get_value(i + 1, 'High') - df.get_value(i, 'High')
  183. DoMove = df.get_value(i, 'Low') - df.get_value(i + 1, 'Low')
  184. if UpMove > DoMove and UpMove > 0:
  185. UpD = UpMove
  186. else: UpD = 0
  187. UpI.append(UpD)
  188. if DoMove > UpMove and DoMove > 0:
  189. DoD = DoMove
  190. else: DoD = 0
  191. DoI.append(DoD)
  192. i = i + 1
  193. UpI = Series(UpI)
  194. DoI = Series(DoI)
  195. PosDI = Series(ewma(UpI, span = n, min_periods = n - 1))
  196. NegDI = Series(ewma(DoI, span = n, min_periods = n - 1))
  197. RSI = Series(PosDI / (PosDI + NegDI), name = 'RSI_' + str(n))
  198. df = df.join(RSI)
  199. return df
  200. #True Strength Index
  201. def TSI(df, r, s):
  202. M = Series(df['Close'].diff(1))
  203. aM = abs(M)
  204. EMA1 = Series(ewma(M, span = r, min_periods = r - 1))
  205. aEMA1 = Series(ewma(aM, span = r, min_periods = r - 1))
  206. EMA2 = Series(ewma(EMA1, span = s, min_periods = s - 1))
  207. aEMA2 = Series(ewma(aEMA1, span = s, min_periods = s - 1))
  208. TSI = Series(EMA2 / aEMA2, name = 'TSI_' + str(r) + '_' + str(s))
  209. df = df.join(TSI)
  210. return df
  211. #Accumulation/Distribution
  212. def ACCDIST(df, n):
  213. ad = (2 * df['Close'] - df['High'] - df['Low']) / (df['High'] - df['Low']) * df['Volume']
  214. M = ad.diff(n - 1)
  215. N = ad.shift(n - 1)
  216. ROC = M / N
  217. AD = Series(ROC, name = 'Acc/Dist_ROC_' + str(n))
  218. df = df.join(AD)
  219. return df
  220. #Chaikin Oscillator
  221. def Chaikin(df):
  222. ad = (2 * df['Close'] - df['High'] - df['Low']) / (df['High'] - df['Low']) * df['Volume']
  223. Chaikin = Series(ewma(ad, span = 3, min_periods = 2) - ewma(ad, span = 10, min_periods = 9), name = 'Chaikin')
  224. df = df.join(Chaikin)
  225. return df
  226. #Money Flow Index and Ratio
  227. def MFI(df, n):
  228. PP = (df['High'] + df['Low'] + df['Close']) / 3
  229. i = 0
  230. PosMF = [0]
  231. while i < df.index[-1]:
  232. if PP[i + 1] > PP[i]:
  233. PosMF.append(PP[i + 1] * df.get_value(i + 1, 'Volume'))
  234. else:
  235. PosMF.append(0)
  236. i = i + 1
  237. PosMF = Series(PosMF)
  238. TotMF = PP * df['Volume']
  239. MFR = Series(PosMF / TotMF)
  240. MFI = Series(rolling_mean(MFR, n), name = 'MFI_' + str(n))
  241. df = df.join(MFI)
  242. return df
  243. #On-balance Volume
  244. def OBV(df, n):
  245. i = 0
  246. OBV = [0]
  247. while i < df.index[-1]:
  248. if df.get_value(i + 1, 'Close') - df.get_value(i, 'Close') > 0:
  249. OBV.append(df.get_value(i + 1, 'Volume'))
  250. if df.get_value(i + 1, 'Close') - df.get_value(i, 'Close') == 0:
  251. OBV.append(0)
  252. if df.get_value(i + 1, 'Close') - df.get_value(i, 'Close') < 0:
  253. OBV.append(-df.get_value(i + 1, 'Volume'))
  254. i = i + 1
  255. OBV = Series(OBV)
  256. OBV_ma = Series(rolling_mean(OBV, n), name = 'OBV_' + str(n))
  257. df = df.join(OBV_ma)
  258. return df
  259. #Force Index
  260. def FORCE(df, n):
  261. F = Series(df['Close'].diff(n) * df['Volume'].diff(n), name = 'Force_' + str(n))
  262. df = df.join(F)
  263. return df
  264. #Ease of Movement
  265. def EOM(df, n):
  266. EoM = (df['High'].diff(1) + df['Low'].diff(1)) * (df['High'] - df['Low']) / (2 * df['Volume'])
  267. Eom_ma = Series(rolling_mean(EoM, n), name = 'EoM_' + str(n))
  268. df = df.join(Eom_ma)
  269. return df
  270. #Commodity Channel Index
  271. def CCI(df, n):
  272. PP = (df['High'] + df['Low'] + df['Close']) / 3
  273. CCI = Series((PP - rolling_mean(PP, n)) / rolling_std(PP, n), name = 'CCI_' + str(n))
  274. df = df.join(CCI)
  275. return df
  276. #Coppock Curve
  277. def COPP(df, n):
  278. M = df['Close'].diff(int(n * 11 / 10) - 1)
  279. N = df['Close'].shift(int(n * 11 / 10) - 1)
  280. ROC1 = M / N
  281. M = df['Close'].diff(int(n * 14 / 10) - 1)
  282. N = df['Close'].shift(int(n * 14 / 10) - 1)
  283. ROC2 = M / N
  284. Copp = Series(ewma(ROC1 + ROC2, span = n, min_periods = n), name = 'Copp_' + str(n))
  285. df = df.join(Copp)
  286. return df
  287. #Keltner Channel
  288. def KELCH(df, n):
  289. KelChM = Series(rolling_mean((df['High'] + df['Low'] + df['Close']) / 3, n), name = 'KelChM_' + str(n))
  290. KelChU = Series(rolling_mean((4 * df['High'] - 2 * df['Low'] + df['Close']) / 3, n), name = 'KelChU_' + str(n))
  291. KelChD = Series(rolling_mean((-2 * df['High'] + 4 * df['Low'] + df['Close']) / 3, n), name = 'KelChD_' + str(n))
  292. df = df.join(KelChM)
  293. df = df.join(KelChU)
  294. df = df.join(KelChD)
  295. return df
  296. #Ultimate Oscillator
  297. def ULTOSC(df):
  298. i = 0
  299. TR_l = [0]
  300. BP_l = [0]
  301. while i < df.index[-1]:
  302. TR = max(df.get_value(i + 1, 'High'), df.get_value(i, 'Close')) - min(df.get_value(i + 1, 'Low'), df.get_value(i, 'Close'))
  303. TR_l.append(TR)
  304. BP = df.get_value(i + 1, 'Close') - min(df.get_value(i + 1, 'Low'), df.get_value(i, 'Close'))
  305. BP_l.append(BP)
  306. i = i + 1
  307. UltO = Series((4 * rolling_sum(Series(BP_l), 7) / rolling_sum(Series(TR_l), 7)) + (2 * rolling_sum(Series(BP_l), 14) / rolling_sum(Series(TR_l), 14)) + (rolling_sum(Series(BP_l), 28) / rolling_sum(Series(TR_l), 28)), name = 'Ultimate_Osc')
  308. df = df.join(UltO)
  309. return df
  310. #Donchian Channel
  311. def DONCH(df, n):
  312. i = 0
  313. DC_l = []
  314. while i < n - 1:
  315. DC_l.append(0)
  316. i = i + 1
  317. i = 0
  318. while i + n - 1 < df.index[-1]:
  319. DC = max(df['High'].ix[i:i + n - 1]) - min(df['Low'].ix[i:i + n - 1])
  320. DC_l.append(DC)
  321. i = i + 1
  322. DonCh = Series(DC_l, name = 'Donchian_' + str(n))
  323. DonCh = DonCh.shift(n - 1)
  324. df = df.join(DonCh)
  325. return df
  326. #Standard Deviation
  327. def STDDEV(df, n):
  328. df = df.join(Series(rolling_std(df['Close'], n), name = 'STD_' + str(n)))
  329. return df