예제 #1
0
    def __init__(self,strategy,feed, instrument,**kwargs):
        '''

        :param strategy:
        :param feed:
        :param instrument:
        :param fast_period:
        :param slow_period:
        :param kwargs:
            fast_period
            slow_period
        '''
        self.set_member('fast_period',5,kwargs)
        self.set_member('slow_period', 20,kwargs)
        fast_period = self.fast_period
        slow_period = self.slow_period
        super(kd_signal, self).__init__(strategy, feed, instrument)
        self.fast_ma= ma.SMA(feed[instrument].getCloseDataSeries(), fast_period)
        self.fast_period = fast_period

        self.slow_ma = ma.SMA(feed[instrument].getCloseDataSeries(), slow_period)
        self.slow_period = slow_period
        self.fast__trend = TrendRatio(self.prices, fast_period)
        self.slow__trend = TrendRatio(self.prices, slow_period)
        self.kd = stoch.StochasticOscillator(feed[instrument],slow_period,fast_period,False,None)

        self.plot_init(True)
        self.start_check = False
예제 #2
0
    def __init__(self,feed,instruments,ind_dt,ts):
        strategy.BacktestingStrategy.__init__(self,feed,cash_or_brk=200)

        self.__position  = [] 
        self.__intrapost = dict()

        self.__instruments = instruments
        self.__ts          = ts
        self.__ydate       = '' 

        self.lastday = dict()
        self.df      = pd.read_csv(ind_dt,dtype={'code':np.str})
        self.tdays   = np.array(self.df['Date'].unique())
        
        self.__prices = feed.getDataSeries(self.__instruments)
        self.__KDJ = stoch.StochasticOscillator(self.__prices,9)

        rsiPeriod = 6
        self.__priceDS = feed[self.__instruments].getPriceDataSeries()
        self.__rsi = rsi.RSI(self.__priceDS, rsiPeriod)

        self.__PK = None
        self.__PD = None
        self.__fakeShares = 0

        self.__prevJ = None
        self.__buydays = set() 
        
        self.getBroker().setMaxHoldingDays(2)
예제 #3
0
    def testZeroDivision(self):
        highPrices = [1, 1, 1]
        lowPrices = [1, 1, 1]
        closePrices = [1, 1, 1]

        barDS = bards.BarDataSeries()
        stochFilter = stoch.StochasticOscillator(barDS, 2, 2)
        self.__fillBarDataSeries(barDS, closePrices, highPrices, lowPrices)
        self.assertEqual(stochFilter[-1], 0)
예제 #4
0
    def testStockChartsStoch(self):
        # Test data from
        # http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:stochastic_oscillato
        highPrices = [
            127.0090, 127.6159, 126.5911, 127.3472, 128.1730, 128.4317,
            127.3671, 126.4220, 126.8995, 126.8498, 125.6460, 125.7156,
            127.1582, 127.7154, 127.6855, 128.2228, 128.2725, 128.0934,
            128.2725, 127.7353, 128.7700, 129.2873, 130.0633, 129.1182,
            129.2873, 128.4715, 128.0934, 128.6506, 129.1381, 128.6406
        ]
        lowPrices = [
            125.3574, 126.1633, 124.9296, 126.0937, 126.8199, 126.4817,
            126.0340, 124.8301, 126.3921, 125.7156, 124.5615, 124.5715,
            125.0689, 126.8597, 126.6309, 126.8001, 126.7105, 126.8001,
            126.1335, 125.9245, 126.9891, 127.8148, 128.4715, 128.0641,
            127.6059, 127.5960, 126.9990, 126.8995, 127.4865, 127.3970
        ]
        closePrices = lowPrices[:
                                13]  # To keep initial close prince between low/high
        closePrices.extend([
            127.2876, 127.1781, 128.0138, 127.1085, 127.7253, 127.0587,
            127.3273, 128.7103, 127.8745, 128.5809, 128.6008, 127.9342,
            128.1133, 127.5960, 127.5960, 128.6904, 128.2725
        ])
        kValues = [
            None, None, None, None, None, None, None, None, None, None, None,
            None, None, 70.4382, 67.6089, 89.2021, 65.8106, 81.7477, 64.5238,
            74.5298, 98.5814, 70.1045, 73.0561, 73.4178, 61.2313, 60.9563,
            40.3861, 40.3861, 66.8285, 56.7314
        ]
        dValues = [
            None, None, None, None, None, None, None, None, None, None, None,
            None, None, None, None, 75.7497, 74.2072, 78.9201, 70.6940,
            73.6004, 79.2117, 81.0719, 80.5807, 72.1928, 69.2351, 65.2018,
            54.1912, 47.2428, 49.2003, 54.6487
        ]

        barDS = bards.BarDataSeries(INSTRUMENT)
        stochFilter = stoch.StochasticOscillator(barDS, 14)
        self.__fillBarDataSeries(barDS, closePrices, highPrices, lowPrices)

        for i in range(len(kValues)):
            self.assertTrue(values_equal(stochFilter[i], kValues[i]))
            self.assertTrue(values_equal(stochFilter.getD()[i], dValues[i]))

        self.assertEqual(len(stochFilter.getDateTimes()), len(closePrices))
        for i in range(len(stochFilter)):
            self.assertNotEqual(stochFilter.getDateTimes()[i], None)
예제 #5
0
 def __init__(self, feed, instrument, arg_set, kdj_fast=3, kdj_slow=9, macd_fast=12, macd_slow=26):
     broker_commission = broker.backtesting.TradePercentage(0.0004)
     brokers = broker.backtesting.Broker(1000000, feed, broker_commission)
     super(Macd_Kdj, self).__init__(feed, brokers)
     self.__instrument = instrument
     self.__feed = feed
     # self.setUseAdjustedValues(True)
     self.__position = None
     self.initState = False
     self.code = feed.getKeys()[0]
     self.priceDS = feed[instrument].getPriceDataSeries()
     self.arg_set = arg_set
     self.kdj_k = stoch.StochasticOscillator(feed[instrument], period=kdj_fast, dSMAPeriod=kdj_slow)
     self.kdj_d = self.kdj_k.getD()
     self.diff = macd.MACD(self.priceDS, fastEMA=macd_fast, slowEMA=macd_slow, signalEMA=9)
     self.dea = self.diff.getSignal()
     self.macd = self.diff.getHistogram()
예제 #6
0
    def testShortPeriod(self):
        highPrices = [3, 3, 3]
        lowPrices = [1, 1, 1]
        closePrices = [2, 2, 3]

        stochFilter = stoch.StochasticOscillator(
            self.__buildBarDataSeries(closePrices, highPrices, lowPrices), 2,
            2)
        self.assertTrue(values_equal(stochFilter.getValueAbsolute(0), None))
        self.assertTrue(values_equal(stochFilter.getValueAbsolute(1), 50))
        self.assertTrue(values_equal(stochFilter.getValueAbsolute(2), 100))

        self.assertTrue(
            values_equal(stochFilter.getD().getValueAbsolute(0), None))
        self.assertTrue(
            values_equal(stochFilter.getD().getValueAbsolute(1), None))
        self.assertTrue(
            values_equal(stochFilter.getD().getValueAbsolute(2), 75))
예제 #7
0
    def testShortPeriod(self):
        highPrices = [3, 3, 3]
        lowPrices = [1, 1, 1]
        closePrices = [2, 2, 3]

        barDS = bards.BarDataSeries()
        stochFilter = stoch.StochasticOscillator(barDS, 2, 2)
        self.__fillBarDataSeries(barDS, closePrices, highPrices, lowPrices)

        self.assertTrue(values_equal(stochFilter[0], None))
        self.assertTrue(values_equal(stochFilter[1], 50))
        self.assertTrue(values_equal(stochFilter[2], 100))

        self.assertTrue(values_equal(stochFilter.getD()[0], None))
        self.assertTrue(values_equal(stochFilter.getD()[1], None))
        self.assertTrue(values_equal(stochFilter.getD()[2], 75))

        self.assertEqual(len(stochFilter.getDateTimes()), len(closePrices))
        for i in range(len(stochFilter)):
            self.assertNotEqual(stochFilter.getDateTimes()[i], None)
예제 #8
0
    def testStockChartsStoch_Bounded(self):
        # Test data from
        # http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators:stochastic_oscillato
        highPrices = [
            127.0090, 127.6159, 126.5911, 127.3472, 128.1730, 128.4317,
            127.3671, 126.4220, 126.8995, 126.8498, 125.6460, 125.7156,
            127.1582, 127.7154, 127.6855, 128.2228, 128.2725, 128.0934,
            128.2725, 127.7353, 128.7700, 129.2873, 130.0633, 129.1182,
            129.2873, 128.4715, 128.0934, 128.6506, 129.1381, 128.6406
        ]
        lowPrices = [
            125.3574, 126.1633, 124.9296, 126.0937, 126.8199, 126.4817,
            126.0340, 124.8301, 126.3921, 125.7156, 124.5615, 124.5715,
            125.0689, 126.8597, 126.6309, 126.8001, 126.7105, 126.8001,
            126.1335, 125.9245, 126.9891, 127.8148, 128.4715, 128.0641,
            127.6059, 127.5960, 126.9990, 126.8995, 127.4865, 127.3970
        ]
        closePrices = lowPrices[:
                                13]  # To keep initial close prince between low/high
        closePrices.extend([
            127.2876, 127.1781, 128.0138, 127.1085, 127.7253, 127.0587,
            127.3273, 128.7103, 127.8745, 128.5809, 128.6008, 127.9342,
            128.1133, 127.5960, 127.5960, 128.6904, 128.2725
        ])
        kValues = [40.3861, 66.8285, 56.7314]
        dValues = [47.2428, 49.2003, 54.6487]

        barDS = bards.BarDataSeries(INSTRUMENT)
        stochFilter = stoch.StochasticOscillator(barDS, 14, maxLen=3)
        self.__fillBarDataSeries(barDS, closePrices, highPrices, lowPrices)

        self.assertEqual(len(stochFilter), 3)
        self.assertEqual(len(stochFilter[:]), 3)
        self.assertEqual(len(stochFilter.getDateTimes()), 3)
        self.assertEqual(len(stochFilter.getD()), 3)
        self.assertEqual(len(stochFilter.getD().getDateTimes()), 3)

        for i in xrange(3):
            self.assertEqual(round(stochFilter[i], 4), kValues[i])
            self.assertEqual(round(stochFilter.getD()[i], 4), dValues[i])
예제 #9
0
 def __init__(self, feed, instrument, bBandsPeriod):
     super(MyStrategy, self).__init__(feed)
     self.__instrument = instrument
     # 使用调整后的数据
     if feed.barsHaveAdjClose():
         self.setUseAdjustedValues(True)
     # 持有仓位
     self.__holdPosition = 0.0
     # 空闲仓位
     self.__emptyPosition = 10.0
     # 单元持仓金额
     self.__unit = self.getBroker().getCash(False) / 10
     # 统计收盘价
     self.__priceDS = feed[instrument].getPriceDataSeries()
     # 计算macd指标
     self.__macd = macd.MACD(self.__priceDS, 12, 26, 9)
     # 计算KD指标
     self.__stoch = stoch.StochasticOscillator(feed[instrument], 9, 3)
     # 计算rsi指标
     self.__rsi7 = rsi.RSI(self.__priceDS, 7)
     self.__rsi14 = rsi.RSI(self.__priceDS, 14)
     # 计算布林线
     self.__bbands = bollinger.BollingerBands(self.__priceDS, bBandsPeriod,
                                              2)