更新 my_chan.py

```

# coding=utf-8

import pandas as pd

import numpy as np

import datetime

# 处理k线成缠论k线,临时函数

def parse2ChanKTMP(k_data, k_values, in_chan = False):

baohan_columns = ['enddate'] + list(k_data.keys()) if not in_chan else list(k_data.keys())

# print baohan_columns

dfbao = pd.DataFrame(np.zeros(len(k_data.index)*len(baohan_columns)).reshape(len(k_data.index),len(baohan_columns)), index = k_data.index,columns=baohan_columns)\

if not in_chan else k_data

# print dfbao

# stdt = k_data.index[0]

# dfbao.set_value(stdt, baohan_columns, [stdt] + list(k_data.values[0]))

# 比较上一个包含的时间点

dt_bf = 0

#n-2的时间点

dt_bf_n2 = 0

def set_baohan_value(dt, value):

dfbao.set_value(dt, baohan_columns, value)

return dt

def get_baohan_value(dt, highV):

# n-2 到 n-1 是否是上涨

flag_ = dfbao['high'][dt_bf_n2]

return (min(k_data['high'][dt], dfbao['high'][dt_bf]), \

min(k_data['low'][dt], dfbao['low'][dt_bf]) ) if not flag_ else \

( max(k_data['high'][dt], dfbao['high'][dt_bf]), \

max(k_data['low'][dt], dfbao['low'][dt_bf]))

def set_chan_bao(dt):

return set_baohan_value(dt, [dt, k_data['high'][dt], k_data['low'][dt], k_data['high'][dt], k_data['low'][dt], k_data['volume'][dt], k_data['money'][dt]])

for i, dt in enumerate(k_data.index):

if i==0:

dt_bf_n2 = dt_bf

dt_bf = set_chan_bao(dt) if not in_chan else dt

continue

if in_chan and (k_data['enddate'][dt]==0 or i==0): continue

# 非包含情况

if (k_data['high'][dt]>dfbao['high'][dt_bf] and k_data['low'][dt]>dfbao['low'][dt_bf])\

or (k_data['high'][dt]

if in_chan:

dt_bf_n2 = dt_bf

dt_bf = dt

continue

dt_bf_n2 = dt_bf

dt_bf = set_chan_bao(dt)

continue

# 包含情况

enddate = dt if not in_chan else dfbao['enddate'][dt]

high_, low_ = get_baohan_value(dt, k_data['high'][dt])

dt_bf_n2 = dt_bf

dt_bf = set_baohan_value(dt_bf, \

[enddate, high_, low_, \

high_, low_, \

k_data['volume'][dt]+dfbao['volume'][dt_bf], \

k_data['money'][dt]+dfbao['money'][dt_bf]])

if in_chan:

dfbao.set_value(dt, ['enddate'], 0)

dfbao = dfbao[dfbao['enddate']!=0]

return dfbao

# 处理k线成缠论k线

def parse2ChanK(k_data, k_values):

chanK = parse2ChanKTMP(k_data, k_values)

while True:

chanK1 = parse2ChanKTMP(chanK, chanK.values, True)

if(len(chanK.index)==len(chanK1.index)):

break

chanK = chanK1

return chanK

# chanK = parse2ChanK(k_data, k_values)

# print chanK

# 找顶底分型的idx

# 如果 连续顶顶,或底底: 顶:high最大的顶, 低:low最小的低

# 顶:1 低:-1

def parse2ChanFen(chanK):

fenTypes = [] # 分型类型数组 1,-1构成

fenIdx = [] # 分型对应缠论k的下标

# 添加分型数据

# 过滤连续同分型

def appendFen(ft, fidx):

if len(fenIdx)==0:

fenTypes.append(ft)

fenIdx.append(fidx)

return

fenType_bf = fenTypes[len(fenTypes)-1]

if fenType_bf == ft:

fenType_bf, fenIdx_bf = fenTypes.pop(), fenIdx.pop()

fidx = fenIdx_bf if (ft==1 and chanK['high'][fenIdx_bf]>chanK['high'][fidx])\

or (ft==-1 and chanK['low'][fenIdx_bf]

fenTypes.append(ft)

fenIdx.append(fidx)

for i, dt in enumerate(chanK.index):

if i==0 or i==len(chanK.index)-1:continue

# 顶分型

if chanK['high'][i+1]chanK['high'][i-1]:

appendFen(1, i)

# 底分型

if chanK['low'][i+1]>chanK['low'][i]

appendFen(-1, i)

return fenTypes, fenIdx

# fenTypes, fenIdx = parse2ChanFen(chanK)

# print fenTypes, fenIdx

# 分型构成笔

# 构成笔条件,1、顶低分型间隔了n个chanK线, 2、中间不会出现比第一个分型结构更高(顶)或更低(底)的分型,否则线段破坏,连接上一笔

def parse2ChanBi(fenTypes, fenIdx, chanK):

biIdx = [] # 笔对应的缠论k线 idx

frsBiType = 0 # 起始笔的走势,biIdx 奇数下标就是相反走势 1、向上,-1向下

least_khl_num = 3 # 分笔间隔的最小 chanK 数量 中间排除顶低的chanK

toConBfIdx = 0 # 连接到上一笔末尾的 分型idx

# 判断笔破坏

def judgeBiBreak(idxb, idxa):

fenType = fenTypes[idxb]

fenType1 = -fenType

# print '分型破坏前', fenType, fenIdx[idxb], fenIdx[idxa]

_break = False

_breaki_k = 0

_breakj_k = 0

#if judgeBreak(fenType, fenIdx[idxb], fenIdx[idxa]):

# if idxa+1==len(fenIdx): _break, _breakj_k = True, idxa-1

# else: _break, _breaki_k = True, idxa+1

#return _break, _breaki_k, _breakj_k

# 不用判断分型间的破坏

for k in range(idxb, idxa)[2::2]:

# 当前i分型破坏

if judgeBreak(fenType, fenIdx[idxb], fenIdx[k]):

_break, _breaki_k = True, k

break

for k in range(idxb, idxa)[1::2]:

# 末尾j分型破坏

if judgeBreak(fenType1, fenIdx[idxa], fenIdx[k]):

_break, _breakj_k = True, k

break

return _break, _breaki_k, _breakj_k

# 分型破坏

def judgeBreak(fenType, bf, af):

return (fenType==-1 and chanK['low'][af]

or (fenType==1 and chanK['high'][af]>chanK['high'][bf])

def reAssignBi(biIdx, breakBi, breakBj, i, j):

toConBfIdx = i+1 if len(biIdx)==0 else breakBi

if breakBi>0 and len(biIdx)>0:

fb_ = biIdx.pop()

# print '首分型破坏, 旧分型:%d, 新的分型:%d'%(fb_,fenIdx[breakBi])

biIdx.append(fenIdx[breakBi])

if len(biIdx)>1 and 0

fa_=biIdx.pop()

fb_=biIdx.pop()

# print '尾分型破坏并连接上一点, 移除分型:%d,旧分型:%d, 新的分型:%d'%(fa_, fb_,fenIdx[breakBj])

biIdx.append(fenIdx[breakBj])

toConBfIdx = breakBj

return toConBfIdx, -1 # -1:break 1:continue 0:不执行

if breakBj>0:

# breakBj = breakBj1 if breakBj==-1 or judgeBreak(fenTypes[i-1], fenIdx[breakBj], fenIdx[breakBj1]) else breakBj

if j+2>=len(fenIdx) and len(biIdx)>1 and\

judgeBreak(fenTypes[i-1], biIdx[len(biIdx)-2], fenIdx[breakBj]):

fa_=biIdx.pop()

fb_=biIdx.pop()

# print '尾分型破坏并连接上一点, 移除分型:%d,旧分型:%d, 新的分型:%d'%(fa_, fb_,fenIdx[breakBj])

biIdx.append(fenIdx[breakBj])

toConBfIdx = breakBj

return toConBfIdx, -1 # -1:break 1:continue 0:不执行

return toConBfIdx, 1 # -1:break 1:continue 0:不执行

return toConBfIdx, 0 # -1:break 1:continue 0:不执行

for i, kidx in enumerate(fenIdx):

# print '生成的笔', biIdx

# print toConBfIdx, 'the i is ', i

if i

# 后面没有符合条件的笔

if len(biIdx)>1 and toConBfIdx==0:break

toConBfIdx = 0

for j in range(len(fenIdx))[i+1::2]:

# print '差是', fenIdx[j]-kidx

if (fenIdx[j]-kidx)>least_khl_num:

# print 'append', i, j, fenIdx[i], fenIdx[j]

# breakType True 同分型, False 末尾分型

flag, breakBi, breakBj = judgeBiBreak(i, j)

# print flag, breakBi

if flag:

toConBfIdx, _bcn = reAssignBi(biIdx, breakBi, breakBj, i, j)

if _bcn==-1:break

if _bcn==1:continue

if len(biIdx)==0:

biIdx.append(kidx)

frsBiType = -fenTypes[i]

biIdx.append(fenIdx[j])

toConBfIdx, _bcn = reAssignBi(biIdx, breakBi, breakBj, i, j)

if _bcn==-1 or _bcn==1:

biIdx = []

toConBfIdx = i+1

break

toConBfIdx = j

break

biIdx.append(fenIdx[j])

# print biIdx

toConBfIdx = j

# print toConBfIdx

break

return biIdx, frsBiType

#最终线段生成

#1、遍历相对高低点,判断线段破坏,

# 破坏以后,如果总长度是0,i可以后移,否则重构之前的线段

# 重构规则,找破坏点相对高点/低点,如果存在线段高点/低点>/

#2、形成线段中间至少有两点j-i>2

def parse2ChanXD(frsBiType,biIdx,chanK):

lenBiIdx = len(biIdx)

xdIdx = []

xfenTypes = []

if lenBiIdx==0 : return xdIdx,xfenTypes

afIdx = 0

#重构线段

def refactorXd(txIdx, nxIdx, chanK):

xdIdxn = xdIdx

xfenTypesn = xfenTypes

if len(xdIdxn)==0 or txIdx==-1 or nxIdx==-1: return 0,xdIdxn,xfenTypesn

for m in range(-len(xdIdxn)+1, 1)[1::2]:

k = -m

#满足逆向不破坏

# print '开始逆向破坏:逆向分型,逆向点,线段点', xfenTypesn[k], nxIdx, xdIdxn[k]

if (xfenTypesn[k]==-1 and chanK['low'][xdIdxn[k]]

or (xfenTypesn[k]==1 and chanK['high'][xdIdxn[k]]>chanK['high'][nxIdx]):

for n in range(-len(xdIdxn)+1, m):

xfenTypesn.pop()

xdIdxn.pop()

xdIdxn.append(txIdx)

xfenTypesn.append(-xfenTypesn[len(xfenTypes)-1])

return biIdx.index(txIdx), xdIdxn, xfenTypesn

xdIdxn = []

xfenTypesn = []

# print '逆向破坏', nxIdx, xdIdxn, xfenTypesn

return biIdx.index(nxIdx), xdIdxn, xfenTypesn

# 判断线段破坏

def judgeBreak(fenType, afPrice, idx, chanK):

return (fenType==-1 and afPrice

or (fenType==1 and afPrice>chanK['high'][idx])

for i, idx in enumerate(biIdx):

if afIdx < 0 :break # 线段破坏以后没有合适线段

fenType = 1 if (frsBiType==1 and i%2==1) or (frsBiType==-1 and i%2==0) \

else -1

# print '开始判断%d,分型类型%d'%(idx, fenType)

#符合要求的连段

if i

#找同向相对高低点

afPrice = 0 if fenType==-1 else 10000

tongxiang_price_ = 10000 - afPrice

nixiang_idx, tongxiang_idx = -1, -1

i_continued = False

for j in range(i+1, lenBiIdx)[0::2]:

#同向相对高低点

if (fenType==-1 and tongxiang_price_>chanK['low'][biIdx[j-1]]) \

or (fenType==1 and tongxiang_price_

tongxiang_price_ = chanK['high'][biIdx[j-1]] if fenType==1 else chanK['low'][biIdx[j-1]]

tongxiang_idx = biIdx[j-1]

#线段破坏

# print '线段破坏前', idx, tongxiang_idx

#同向破坏

if judgeBreak(fenType, tongxiang_price_, idx, chanK) and idx!=tongxiang_idx:

# print '同向已经破坏'

afIdx, xdIdx, xfenTypes = refactorXd(tongxiang_idx, nixiang_idx, chanK)

i_continued = True

break

# print '符合要求前', biIdx[i], biIdx[j], afPrice, chanK['high'][biIdx[j]], chanK['low'][biIdx[j]],fenType

if (fenType==-1 and chanK['high'][biIdx[j]]>afPrice) or (fenType==1 and chanK['low'][biIdx[j]]

afPrice = chanK['high'][biIdx[j]] if fenType==-1 else chanK['low'][biIdx[j]]

nixiang_idx = biIdx[j]

#线段不符合要求

# print '符合要求的i,j', biIdx[i], biIdx[j]

if j-i<=2:continue

#逆向破坏

# if judgeBreak(-fenType, nixiang_idx, idx, chanK) and idx!=nixiang_idx:

# # print '逆向已经破坏'

# afIdx, xdIdx, xfenTypes = refactorXd(tongxiang_idx, nixiang_idx, chanK)

# break

if len(xdIdx)==0:

# print '线段长度为0破坏', fenType, idx, judgeBreak(fenType, tongxiang_price_, idx, chanK)

if judgeBreak(fenType, tongxiang_price_, idx, chanK):

i_continued = True

break

xfenTypes.append(fenType)

xdIdx.append(idx)

xdIdx.append(biIdx[j])

xfenTypes.append(-fenType)

else:

#不用同向线段连接

# fenTypeb = xfenTypes[len(xfenTypes)-1]

# xdIdxb = xdIdx.pop()

# if fenTypeb == -fenType:

# xdIdx.append(biIdx[j])

# else:

# xdIdx.append(xdIdxb)

# xfenTypes.append(-fenTypeb)

# xdIdx.append(biIdx[j])

xfenTypes.append(-xfenTypes[len(xfenTypes)-1])

xdIdx.append(biIdx[j])

afIdx = j

i_continued = True

break

else:continue

if not i_continued and len(xdIdx)>0 :

#都不符合要求时,最后重构最小线段

last_idx = xdIdx.pop()

last_type = xfenTypes[len(xfenTypes)-1]

for j in range(biIdx.index(last_idx), len(biIdx))[2::2]:

if judgeBreak(last_type, chanK['low'][biIdx[j]] if last_type==-1 else chanK['high'][biIdx[j]], last_idx, chanK):

last_idx = biIdx[j]

xdIdx.append(last_idx)

break

return xdIdx,xfenTypes

# biIdx, frsBiType = parse2ChanBi(fenTypes, fenIdx, chanK)

# print biIdx,frsBiType

#简单线段形成,主要用于判断是否是大级别的笔

#区间找高低点,判断是否符合 高低点中包含>2个笔点就阔以

def parse2Xianduan(biIdx, chanK):

xdIdx = []

if len(biIdx)==0: return xdIdx, 0

def appendXd(lowIdx, highIdx, xdType):

if len(xdIdx)==0:

if xdType == 1:

xdIdx.append(lowIdx)

else:

xdIdx.append(highIdx)

if (xdType == 1 and len(xdIdx)%2==1) or (xdType == -1 and len(xdIdx)%2==0):

xdIdx.append(highIdx)

else:

xdIdx.append(lowIdx)

def genXianduan(biIdx, chanK, xdType=0):

highMax, lowMin = 0, 10000

highIdx, lowIdx = -1,-1

lenXd = len(xdIdx)

for idx in biIdx:

if chanK['high'][idx]>highMax:

highMax = chanK['high'][idx]

highIdx = idx

if chanK['low'][idx]

lowMin = chanK['low'][idx]

lowIdx = idx

# 构成简易线段

# print biIdx, xdIdx, lowIdx, highIdx

xdDiff = biIdx.index(lowIdx)-biIdx.index(highIdx)

if abs(xdDiff)>2:

if lenXd==0:

xdType = 1 if xdDiff<0 else -1

appendXd(lowIdx, highIdx, xdType)

# print lowIdx, highIdx, xdIdx

genXianduan(biIdx[biIdx.index(xdIdx[len(xdIdx)-1]):], chanK, xdType)

return xdType

xdType = genXianduan(biIdx, chanK)

return xdIdx,xdType

# 笔形成最后一段未完成段判断是否是次级别的走势形成笔

def con2Cxianduan(stock, k_data, chanK, frsBiType, biIdx, end_date, cur_ji = 1):

max_k_num = 4

if cur_ji>=4 or len(biIdx)==0: return biIdx

idx = biIdx[len(biIdx)-1]

k_data_dts = list(k_data.index)

st_data = chanK['enddate'][idx]

if st_data not in k_data_dts: return biIdx

# 重构次级别线段的点到本级别的chanK中

def refactorXd(biIdx, xdIdxc, chanK, chanKc, cur_ji):

new_biIdx = []

biIdxB = biIdx[len(biIdx)-1] if len(biIdx)>0 else 0

for xdIdxcn in xdIdxc:

for chanKidx in range(len(chanK.index))[biIdxB:]:

if judge_day_bao(chanK, chanKidx, chanKc, xdIdxcn, cur_ji):

new_biIdx.append(chanKidx)

break

return new_biIdx

# 判断次级别日期是否被包含

def judge_day_bao(chanK, chanKidx, chanKc, xdIdxcn, cur_ji):

_end_date = chanK['enddate'][chanKidx]+datetime.timedelta(hours=15) if cur_ji==1 else chanK['enddate'][chanKidx]

_start_date = chanK.index[chanKidx] if chanKidx==0\

else chanK['enddate'][chanKidx-1]+datetime.timedelta(minutes=1)

return _start_date<=chanKc.index[xdIdxcn]<=_end_date

# cur_ji = 1 #当前级别

#符合k线根数大于4根 1日级别, 2 30分钟, 3 5分钟, 4 一分钟

if len(k_data_dts) - k_data_dts.index(st_data)>4:

frequency = '30m' if cur_ji+1==2 else '5m' if cur_ji+1==3 else '1m'

k_data_c = get_price(stock, st_data, end_date, frequency=frequency)

chanKc = parse2ChanK(k_data_c, k_data_c.values)

fenTypesc, fenIdxc = parse2ChanFen(chanKc)

if len(fenTypesc)==0: return biIdx

biIdxc, frsBiTypec = parse2ChanBi(fenTypesc, fenIdxc, chanKc)

if len(biIdxc)==0: return biIdx

xdIdxc, xdTypec = parse2Xianduan(biIdxc, chanKc)

biIdxc = con2Cxianduan(stock, k_data_c, chanKc, frsBiTypec, biIdxc, end_date, cur_ji+1)

if len(xdIdxc)==0: return biIdx

# 连接线段位为上级别的bi

lastBiType = frsBiType if len(biIdx)%2==0 else -frsBiType

if len(biIdx)==0:

return refactorXd(biIdx, xdIdxc, chanK, chanKc, cur_ji)

lastbi = biIdx.pop()

firstbic = xdIdxc.pop(0)

# 同向连接

if lastBiType == xdTypec:

biIdx = biIdx + refactorXd(biIdx, xdIdxc, chanK, chanKc, cur_ji)

# 逆向连接

else:

# print '开始逆向连接'

_mid = [lastbi] if (lastBiType == -1 and chanK['low'][lastbi]<=chanKc['low'][firstbic])\

or (lastBiType == 1 and chanK['high'][lastbi]>=chanKc['high'][firstbic]) else\

[chanKidx for chanKidx in range(len(chanK.index))[biIdx[len(biIdx)-1]:]\

if judge_day_bao(chanK, chanKidx, chanKc, firstbic, cur_ji)]

biIdx = biIdx + [_mid[0]] + refactorXd(biIdx, xdIdxc, chanK, chanKc, cur_ji)

return biIdx

```

2017-09-03

python量化缠论买卖点_缠论K线图-笔-线段自动生成(17.6.22持续更新....)(迭代处理最后一段笔)让你更清晰看清买卖点...相关推荐

  1. Python量化投资——mplfinance实现全功能动态交互式K线图(蜡烛图)【源码+详解】

    用python实现全功能动态交互式K线图 手把手用`python`一步步实现动态交互式K线图 ` mplfinance`的基本K线图 目标 实现自定义风格和颜色 图表尺寸调整.相关信息的显示 添加完整 ...

  2. 基于python的股票数据的读取及可视化(K线图)

    文章目录 1.读取数据 2.绘制股票走势图 3.绘制K线图 1.读取数据 TuShare是一个免费.开源的python财经数据接口包.主要实现对股票等金融数据从数据采集.清洗加工 到 数据存储的过程, ...

  3. Python画图实战之画K线图【附带自动下载股票数据】

    关于Python画图的基本知识可以先查看下面这篇文章Python画图(直方图.多张子图.二维图形.三维图形以及图中图)https://blog.csdn.net/weixin_41896770/art ...

  4. 《Python数据可视化之Matplotlib与Pyecharts》之K线图

    10.5.1  K线图及其参数配置 K线图又称蜡烛图,股市及期货市场中的K线图的画法包含四个数据,即开盘价.最高价.最低价.收盘价,所有的k线都是围绕这四个指标展开,反映股票的状况.如果把每日的K线图 ...

  5. dax和m的区别_动态股票K线图----从M语言到DAX表达式

    偶然见别人画的股票K线图,不禁见猎心喜,也来模仿一番.原图是不能动的,一动MACD移动平滑趋势线就没有了.这是微软excel的一个缺陷. 所以我想了一个办法弥补这个缺陷.由于手头没有数据,开始实施网抓 ...

  6. 【转】Python之获取每日涨停板股票数据并绘制K线图!

    利用tushare财经数据接口获取股市进行数据分析.并可视化的案例 1.导入所需要的库 import os import pandas as pd import tushare as ts impor ...

  7. 上证指数30年k线图_上证指数历史k线图_k线图24种经典图解

    上证指数季度k线图 400x296 - 90KB - JPEG 戴若顾比:上证指数寻找新的支撑_股市及时雨 550x341 - 25KB - JPEG 上证综指周K线图 300x232 - 16KB ...

  8. Python之获取每日涨停板股票数据并绘制K线图!

    利用tushare财经数据接口获取股市进行数据分析.并可视化的案例 1.导入所需要的库 import os import pandas as pd import tushare as ts impor ...

  9. Python学习笔记:利用mplfinance的plot绘制K线图

    文章目录 一.从mpl-finance转到mplfinance 1.安装mpl-finance模块 2.导入mpl_finance模块出现警告 3.安装mplfinance模块 4.安装pandas. ...

最新文章

  1. 自监督学习(Self-Supervised Learning)多篇论文解读(上)
  2. VMware三种上网模型
  3. 串口调试神器之Docklight
  4. 数据挖掘导论读书笔记2
  5. opencv4.2.0 视频去抖动算法代码
  6. 关键字搜索 c语言,c语言-以关键字搜索程序
  7. AWD-LSTM为什么这么棒? 1
  8. c++ 三次多项式拟合_线性回归进阶版,多项式线性回归讲解与实现(附完整代码)...
  9. HDU1248 寒冰王座 【数学题】or【全然背包】
  10. CSS animation 与 transition 有何区别?
  11. 警惕分页中的checkbox
  12. java jdk安装 win10,Win10安装多个jdk,共存环境配置,自由切换
  13. 微信支付一面(C++后台)
  14. 解决OpenOffic不能启动的问题
  15. 【EXLIBRIS】随笔记 004
  16. 在ios上运行安卓计算机软件,安卓竟然也能运行iOS,苹果怒了!
  17. 史上最全的NB-IoT知识,每个通信人都应该了解的
  18. 腾讯大王卡 蚂蚁宝卡 区别 哪个好
  19. android传感器介绍
  20. 用于Python中的进程和系统监视的跨平台库psutil

热门文章

  1. 矩阵分解——8.2 乔里斯基(Cholesky)分解
  2. 斯坦福大学-自然语言处理入门 笔记 第十五课 词汇化(Lexicalization)的PCFGs
  3. 服务器安全狗占用cpu,服务器安全狗之悬浮窗口功能介绍
  4. 【源码】基于模型的阶梯式车架设计仿真
  5. 自动化代码生成器 v1.1
  6. 微信小程序开放「分享到朋友圈」功能
  7. uboot-----borad.c .
  8. 细思极恐——R语言forestplot包画meta分析群体药动学常用森林图
  9. 数字图像处理之高斯滤波加速优化
  10. html中如何获取鼠标的坐标,CSS3 在CSS中通过获取鼠标座标变量