| 74 | |
| 75 | |
| 76 | class RSI(IndicatorBase): |
| 77 | @create_attributes |
| 78 | def __init__(self, tracker, prices, n=14, name="RSI", fillcolor='b'): |
| 79 | super(RSI, self).__init__(tracker, name) |
| 80 | self.value = self._relative_strength(prices, n) |
| 81 | ## @todo 一种绘图风格 |
| 82 | # 固定的y范围 |
| 83 | self.stick_yrange([0, 100]) |
| 84 | |
| 85 | def _relative_strength(self, prices, n=14): |
| 86 | deltas = np.diff(prices) |
| 87 | seed = deltas[:n+1] |
| 88 | up = seed[seed>=0].sum()/n |
| 89 | down = -seed[seed<0].sum()/n |
| 90 | rs = up/down |
| 91 | rsi = np.zeros_like(prices) |
| 92 | rsi[:n] = 100. - 100./(1.+rs) |
| 93 | |
| 94 | for i in range(n, len(prices)): |
| 95 | delta = deltas[i-1] # cause the diff is 1 shorter |
| 96 | if delta>0: |
| 97 | upval = delta |
| 98 | downval = 0. |
| 99 | else: |
| 100 | upval = 0. |
| 101 | downval = -delta |
| 102 | |
| 103 | up = (up*(n-1) + upval)/n |
| 104 | down = (down*(n-1) + downval)/n |
| 105 | |
| 106 | rs = up/down |
| 107 | rsi[i] = 100. - 100./(1.+rs) |
| 108 | return rsi |
| 109 | |
| 110 | def plot(self, widget): |
| 111 | textsize = 9 |
| 112 | widget.plot(self.value, color=self.fillcolor, lw=2) |
| 113 | widget.axhline(70, color=self.fillcolor, linestyle='-') |
| 114 | widget.axhline(30, color=self.fillcolor, linestyle='-') |
| 115 | widget.fill_between(self.value, 70, where=(self.value>=70), |
| 116 | facecolor=self.fillcolor, edgecolor=self.fillcolor) |
| 117 | widget.fill_between(self.value, 30, where=(self.value<=30), |
| 118 | facecolor=self.fillcolor, edgecolor=self.fillcolor) |
| 119 | widget.text(0.6, 0.9, '>70 = overbought', va='top', transform=widget.transAxes, fontsize=textsize, color = 'k') |
| 120 | widget.text(0.6, 0.1, '<30 = oversold', transform=widget.transAxes, fontsize=textsize, color = 'k') |
| 121 | widget.set_ylim(0, 100) |
| 122 | widget.set_yticks([30,70]) |
| 123 | widget.text(0.025, 0.95, 'rsi (14)', va='top', transform=widget.transAxes, fontsize=textsize) |
| 124 | |
| 125 | |
| 126 | class MACD(IndicatorBase): |