一、什么是神奇九转指标神奇九转是一套判断股票高低点的择时策略,属于中短线(2-3周10-15个交易日)技术指标。神奇九转指标思想来源于技术分析领域著名大师汤姆·迪马克的TD序列,即股价上涨或(下跌)过程中连续9日收盘价高于(或低于)前4天的收盘价,其后走势很可能发生转向。所有对转向的判断是定量且不变的。其核心功能为发现当前股价走势的拐点,提高抄底、逃顶的成功率。TD序列主要包括TD阻力线、TD结构、TD计数三大部分,而神奇九转只是对于TD结构的应用。通过同花顺大数据进行回测显示,神奇九转指标基于个股逃顶和抄底的成功率为68.6%,基于指数逃顶和抄底的成功率为75.6%。 注意:神奇九转指标策略作为市场上稀有的择时策略选股指标(不同于MACD、KDJ、W&R、筹码指标等滞后性很强),大概率能够捕捉到个股得低位或者高位得转折点。但有一点需要注意:该指标只适合于指数和个股的震荡市、弱牛市以及弱熊市;不适合于大牛市或大熊市! 1.1 神奇九转指标逻辑股价上涨或(下跌)过程中连续9日收盘价高于(或低于)前4天的收盘价即满足神奇九转指标逻辑。股价在上涨或(下跌)过程中连续9日达到触发条件会生成数列1、2、3....7、8、9,数列会依次标注在当日K线上方(下方)。只有当股价连续第六天达到触发条件时,数列才开始进行显示,依次显示1、2、3、4、5、6,当第七天依然达到触发条件时则显示7,如第七日未达到触发条件则前面6天的序号消失。第八日同第七日的显示逻辑一样。当第九天依然达到触发条件时,便形成了一个九转结构。而当第九日未达到触发条件时则前面8日的序号消失,九转结构不成立。股价上涨过程中形成的九转结构称之为上涨九转卖出结构,而股价下跌过程中形成的九转结构则称之为下跌九转买入结构。 1.2 下跌九转买入结构下跌九转买入结构:满足两个条件:第一:连续出现九根K线的收盘价都比各自前面的第四根K线的收盘价低。第二:8或9的当日最低价格小于6或7的当日最低价格。 下跌九转买入结构 1.2 上涨九转卖出结构上涨九转卖出结构:满足两个条件:第一:连续出现九根K线的收盘价都比各自前面的第四根K线的收盘价高。第二:8或9的当日最高价格大于6或7的当日最高价格。 上涨九转卖出结构 二、通过Tushare获取神奇九转所需数据2.1 stock_basic股票基础数据接口
获取股票基础信息数据,包括股票代码、名称、上市日期、退市日期等。
pro = ts.pro_api()#查询当前所有正常上市交易的股票列表data = pro.stock_basic(exchange = '', list_status = 'L', fields = 'ts_code, symbol, name, area, industry, list_date')
2.2 daily股票日线行情数据接口
获取股票日线行情数据。 数据说明:交易日每天15点~16点之间。本接口是未复权行情,停牌期间不提供数据。 调取说明:基础积分每分钟内最多调取500次,每次5000条数据,相当于23年历史。
pro = ts.pro_api()df = pro.daily(ts_code = '000001.SZ', start_date = '20180701', end_date = '20180718')#多个股票df = pro.daily(ts_code = '000001.SZ, 600000.SH', start_date = '20180701', end_date = '20180718')#通过日期取历史某一天的全部历史df = pro.daily(trade_date='20180810')
三、神奇九转指标策略选股的Python实现3.1 代码说明从Tushare获取的股票基础数据存放在Mysql数据中。从数据库中找出所有非ST股票,然后循环检查每一只股票当前日期是否符合神奇九转指标策略(包括卖出和买入),符合策略的股票数据显示在表格中。 注:因篇幅原因,以下代码为主要实现逻辑,非全部代码。如需请联系。 3.2 主要代码def get_nine_turn_index(self):lstBuy = []lstSell = []dfBuy = self.get_data_from_file(IDX_BUY)dfSell = self.get_data_from_file(IDX_SELL)if dfBuy.empty or dfSell.empty:stData = cmnDB().get_all_stock_basic_data(noST=True)idx = 0iTop = 15total = len(stData)start = time.perf_counter()for itm in stData:st = self.get_stock_json_data(itm)stCode = itm[0]data = cmnDB().get_nine_turn_data(stCode, lmt=iTop)data = data.iloc[:iTop]oClose = data.close.valuesif self.get_is_nine_turn_buy_stock(oClose):st['idx_type'] = IDX_BUYlstBuy.append(st)elif self.get_is_nine_turn_sell_stock(oClose):st['idx_type'] = IDX_SELLlstSell.append(st)idx += 1cmn.show_progress_bar(idx, total, start, oBar=oGauge)# 生成csv文件self.make_nine_turn_file(lstBuy, IDX_BUY)self.make_nine_turn_file(lstSell, IDX_SELL)# 转换为DataFramedfBuy = pd.DataFrame(lstBuy)dfSell = pd.DataFrame(lstSell)df = dfBuy.append(dfSell, ignore_index=True)self.show_data_in_grid(df)''' ==================================================*** Name: get_is_nine_turn_buy_stock*** Desc: check the stock meet the magic nine turn index of buy*** Param: oClose - close value records of stock*** Return: Boolean: True / False'''def get_is_nine_turn_buy_stock(self, oClose):rtn = FalseiCount = 0for idx in range(len(oClose) - 5):if oClose[idx] < oClose[idx+4]:iCount += 1if iCount == 8:rtn = Truebreakelse:breakreturn rtn''' ==================================================*** Name: get_is_nine_turn_sell_stock*** Desc: check the stock meet the magic nine turn index of sell*** Param: oClose - close value records of stock*** Return: Boolean: True / False'''def get_is_nine_turn_sell_stock(self, oClose):rtn = FalseiCount = 0for idx in range(len(oClose) - 5):if oClose[idx] > oClose[idx+4]:iCount += 1if iCount == 8:rtn = Truebreakelse:breakreturn rtn 3.3 实现结果数据样例符合九转买入结构股票 符合九转卖出结构股票 |
|