分享

Python量化交易:利用Tushare数据之二——神奇九转指标策略

 追梦文库 2022-01-12

一、什么是神奇九转指标

神奇九转是一套判断股票高低点的择时策略,属于中短线(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

下跌九转买入结构

1.2 上涨九转卖出结构

上涨九转卖出结构:满足两个条件:第一:连续出现九根K线的收盘价都比各自前面的第四根K线的收盘价高。第二:8或9的当日最高价格大于6或7的当日最高价格。

文章图片2

上涨九转卖出结构

二、通过Tushare获取神奇九转所需数据

2.1 stock_basic股票基础数据接口

  • 接口描述

获取股票基础信息数据,包括股票代码、名称、上市日期、退市日期等。

  • 输入参数
文章图片3
  • 输出参数
文章图片4
  • 接口示例
pro = ts.pro_api()#查询当前所有正常上市交易的股票列表data = pro.stock_basic(exchange = '', list_status = 'L', fields = 'ts_code, symbol, name, area, industry, list_date')
  • 数据样例
ts_code symbol name area industry list_date0 000001.SZ 000001 平安银行 深圳 银行 199104031 000002.SZ 000002 万科A 深圳 全国地产 199101292 000004.SZ 000004 国农科技 深圳 生物制药 199101143 000005.SZ 000005 世纪星源 深圳 房产服务 199012104 000006.SZ 000006 深振业A 深圳 区域地产 199204275 000007.SZ 000007 全新好 深圳 酒店餐饮 199204136 000008.SZ 000008 神州高铁 北京 运输设备 199205077 000009.SZ 000009 中国宝安 深圳 综合类 199106258 000010.SZ 000010 美丽生态 深圳 建筑施工 199510279 000011.SZ 000011 深物业A 深圳 区域地产 1992033010000012.SZ000012南玻A深圳玻璃19920228

2.2 daily股票日线行情数据接口

  • 接口描述

获取股票日线行情数据。

数据说明:交易日每天15点~16点之间。本接口是未复权行情,停牌期间不提供数据。

调取说明:基础积分每分钟内最多调取500次,每次5000条数据,相当于23年历史。

  • 输入参数
文章图片5
  • 输出参数
文章图片6
  • 接口示例
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')
  • 数据样例
ts_code trade_date open high low close pre_close change pct_chg vol amount0 000001.SZ 20180718 8.75 8.85 8.69 8.70 8.72 -0.02 -0.23 525152.77 460697.3771 000001.SZ 20180717 8.74 8.75 8.66 8.72 8.73 -0.01 -0.11 375356.33 326396.9942 000001.SZ 20180716 8.85 8.90 8.69 8.73 8.88 -0.15 -1.69 689845.58 603427.7133 000001.SZ 20180713 8.92 8.94 8.82 8.88 8.88 0.00 0.00 603378.21 535401.1754 000001.SZ 20180712 8.60 8.97 8.58 8.88 8.64 0.24 2.78 1140492.31 1008658.8285 000001.SZ 20180711 8.76 8.83 8.68 8.78 8.98 -0.20 -2.23 851296.70 744765.8246 000001.SZ 20180710 9.02 9.02 8.89 8.98 9.03 -0.05 -0.55 896862.02 803038.9657 000001.SZ 20180709 8.69 9.03 8.68 9.03 8.66 0.37 4.27 1409954.60 1255007.6098 000001.SZ 20180706 8.61 8.78 8.45 8.66 8.60 0.06 0.70 988282.69 852071.5269 000001.SZ 20180705 8.62 8.73 8.55 8.60 8.61 -0.01 -0.12 835768.77 722169.579

三、神奇九转指标策略选股的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 实现结果数据样例

文章图片7

符合九转买入结构股票

文章图片8

符合九转卖出结构股票

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多