Ⅰ python量化教程:不得不學的K線圖「代碼復制可用」
不管是對量化分析師還是普通的投資者來說,K線圖(蠟燭圖)都是一種很經典、很重要的工具。在K線圖中,它會繪制每天的最高價、最低價、開盤價和收盤價,這對於我們理解股票的趨勢以及每天的多空對比很有幫助。
一般來說,我們會從各大券商平台獲取K線圖,但是這種情況下獲得的K線圖往往不能靈活調整,也不能適應復雜多變的生產需求。因此我們有必要學習一下如何使用Python繪制K線圖。
需要說明的是,這里mpl_finance是原來的matplotlib.finance,但是現在獨立出來了(而且好像沒什麼人維護更新了),我們將會使用它提供的方法來繪制K線圖;tushare是用來在線獲取股票數據的庫;matplotlib.ticker中有個FuncFormatter()方法可以幫助我們調整坐標軸;matplotlib.pylab.date2num可以幫助我們將日期數據進行必要的轉化。
我們以上證綜指18年9月份以來的行情為例。
我們先使用mpl_finance繪制一下,看看是否一切正常。
可以看到,所有的節假日包括周末,在這里都會顯示為空白,這對於我們圖形的連續性非常不友好,因此我們要解決掉他們。
可以看到,空白問題完美解決,這里我們解釋一下。由於matplotlib會將日期數據理解為 連續數據 ,而連續數據之間的間距是有意義的,所以非交易日即使沒有數據,在坐標軸上還是會體現出來。連續多少個非交易日,在坐標軸上就對應了多少個小格子,但這些小格子上方並沒有相應的蠟燭圖。
明白了它的原理,我們就可以對症下葯了。我們可以給橫坐標(日期)傳入連續的、固定間距的數據,先保證K線圖的繪制是連續的;然後生成一個保存有正確日期數據的列表,接下來,我們根據坐標軸上的數據去取對應的正確的日期,並替換為坐標軸上的標簽即可。
上邊format_date函數就是這個作用。由於前邊我們給dates列生成了從0開始的序列連續數據,因此我們可以直接把它當作索引,從真正的日期列表裡去取對應的數據。在這里我們要使用matplotlib.ticker.FuncFormattter()方法,它允許我們指定一個格式化坐標軸標簽的函數,在這個函數里,我們需要接受坐標軸的值以及位置,並返回自定義的標簽。
你學會了嗎?
當然,一個完整的K線圖到這里並沒有結束,後邊我們會考慮加入均線、成交量等元素,感興趣的同學歡迎關注哦!
Ⅱ 如何用python做k線形態識別
K線形態識別是比較難的一個點,難在思路上,代碼都是其次。分享一下我的思路吧,通過api獲取了行情信息之後(一般都是pandas.DataFrame格式,基本上都包含ohlc和volume),那麼假如我需要識別十字星,那麼用df['open']==df['close']把其布爾值賦值給a, 然後df['high']>df['open']>df['low']賦值給b。然後
for i in range(len(df)):
df['outcome']=np.where(a+b==1, 1, 0)
df[df['outcome']==1]
這樣就能把所有的十字星給選出來了。
Ⅲ python可視化神器——pyecharts庫
無意中從今日頭條中看到的一篇文章,可以生成簡單的圖表。據說一些大數據開發們也是經常用類似的圖表庫,畢竟有現成的,改造下就行,誰會去自己造輪子呢。
pyecharts是什麼?
pyecharts 是一個用於生成 Echarts 圖表的類庫。Echarts 是網路開源的一個數據可視化 JS 庫。用 Echarts 生成的圖可視化效果非常棒, pyecharts 是為了與 Python 進行對接,方便在 Python 中直接使用數據生成圖 。使用pyecharts可以生成獨立的網頁,也可以在flask、django中集成使用。
安裝很簡單:pip install pyecharts
如需使用 Jupyter Notebook 來展示圖表,只需要調用自身實例即可,同時兼容 Python2 和 Python3 的 Jupyter Notebook 環境。所有圖表均可正常顯示,與瀏覽器一致的交互體驗,簡直不要太強大。
參考自pyecharts官方文檔: http://pyecharts.org
首先開始來繪制你的第一個圖表
使用 Jupyter Notebook 來展示圖表,只需要調用自身實例即可
add() 主要方法,用於添加圖表的數據和設置各種配置項
render() 默認將會在根目錄下生成一個 render.html 的文件,文件用瀏覽器打開。
使用主題
自 0.5.2+ 起,pyecharts 支持更換主體色系
使用 pyecharts-snapshot 插件
如果想直接將圖片保存為 png, pdf, gif 格式的文件,可以使用 pyecharts-snapshot。使用該插件請確保你的系統上已經安裝了 Nodejs 環境。
安裝 phantomjs $ npm install -g phantomjs-prebuilt
安裝 pyecharts-snapshot $ pip install pyecharts-snapshot
調用 render 方法 bar.render(path='snapshot.png') 文件結尾可以為 svg/jpeg/png/pdf/gif。請注意,svg 文件需要你在初始化 bar 的時候設置 renderer='svg'。
圖形繪制過程
基本上所有的圖表類型都是這樣繪制的:
chart_name = Type() 初始化具體類型圖表。
add() 添加數據及配置項。
render() 生成本地文件(html/svg/jpeg/png/pdf/gif)。
add() 數據一般為兩個列表(長度一致)。如果你的數據是字典或者是帶元組的字典。可利用 cast() 方法轉換。
多次顯示圖表
從 v0.4.0+ 開始,pyecharts 重構了渲染的內部邏輯,改善效率。推薦使用以下方式顯示多個圖表。如果使是 Numpy 或者 Pandas,可以參考這個示例
當然你也可以採用更加酷炫的方式,使用 Jupyter Notebook 來展示圖表,matplotlib 有的,pyecharts 也會有的
Note: 從 v0.1.9.2 版本開始,廢棄 render_notebook() 方法,現已採用更加 pythonic 的做法。直接調用本身實例就可以了。
比如這樣
還有這樣
如果使用的是自定義類,直接調用自定義類示例即可
圖表配置
圖形初始化
通用配置項
xyAxis:平面直角坐標系中的 x、y 軸。(Line、Bar、Scatter、EffectScatter、Kline)
dataZoom:dataZoom 組件 用於區域縮放,從而能自由關注細節的數據信息,或者概覽數據整體,或者去除離群點的影響。(Line、Bar、Scatter、EffectScatter、Kline、Boxplot)
legend:圖例組件。圖例組件展現了不同系列的標記(symbol),顏色和名字。可以通過點擊圖例控制哪些系列不顯示。
label:圖形上的文本標簽,可用於說明圖形的一些數據信息,比如值,名稱等。
lineStyle:帶線圖形的線的風格選項(Line、Polar、Radar、Graph、Parallel)
grid3D:3D笛卡爾坐標系組配置項,適用於 3D 圖形。(Bar3D, Line3D, Scatter3D)
axis3D:3D 笛卡爾坐標系 X,Y,Z 軸配置項,適用於 3D 圖形。(Bar3D, Line3D, Scatter3D)
visualMap:是視覺映射組件,用於進行『視覺編碼』,也就是將數據映射到視覺元素(視覺通道)
markLine&markPoint:圖形標記組件,用於標記指定的特殊數據,有標記線和標記點兩種。(Bar、Line、Kline)
tooltip:提示框組件,用於移動或點擊滑鼠時彈出數據內容
toolbox:右側實用工具箱
圖表詳細
Bar(柱狀圖/條形圖)
Bar3D(3D 柱狀圖)
Boxplot(箱形圖)
EffectScatter(帶有漣漪特效動畫的散點圖)
Funnel(漏斗圖)
Gauge(儀表盤)
Geo(地理坐標系)
GeoLines(地理坐標系線圖)
Graph(關系圖)
HeatMap(熱力圖)
Kline/Candlestick(K線圖)
Line(折線/面積圖)
Line3D(3D 折線圖)
Liquid(水球圖)
Map(地圖)
Parallel(平行坐標系)
Pie(餅圖)
Polar(極坐標系)
Radar(雷達圖)
Sankey(桑基圖)
Scatter(散點圖)
Scatter3D(3D 散點圖)
ThemeRiver(主題河流圖)
TreeMap(矩形樹圖)
WordCloud(詞雲圖)
用戶自定義
Grid 類:並行顯示多張圖
Overlap 類:結合不同類型圖表疊加畫在同張圖上
Page 類:同一網頁按順序展示多圖
Timeline 類:提供時間線輪播多張圖
統一風格
註:pyecharts v0.3.2以後,pyecharts 將不再自帶地圖 js 文件。如用戶需要用到地圖圖表,可自行安裝對應的地圖文件包。
地圖文件被分成了三個 Python 包,分別為:
全球國家地圖:
echarts-countries-pypkg
中國省級地圖:
echarts-china-provinces-pypkg
中國市級地圖:
echarts-china-cities-pypkg
直接使用python的pip安裝
但是這里大家一定要注意,安裝完地圖包以後一定要重啟jupyter notebook,不然是無法顯示地圖的。
顯示如下:
總得來說,這是一個非常強大的可視化庫,既可以集成在flask、Django開發中,也可以在做數據分析的時候單獨使用,實在是居家旅行的必備神器啊
Ⅳ 怎麼用Python畫5分鍾K線圖
現在幾乎所有的大網站都在主要的欄目 做了防爬行的處理。 象這樣的還算是簡單的。 大不了你分析一下JS。 如果不想分析JS。就麻煩 些。 你安裝一個pyqt,裡面有一個qtbrowser, 你可以驅動這個瀏覽器去爬行。要幾百行代碼才能搞定。怎麼用Python畫5分鍾K線圖
Ⅳ 求教使用python繪制K線圖
使用matplotlib模塊,相關API請查看網頁鏈接
只要你是個圖,它就能給你畫出來。
希望可以幫到你
Ⅵ python用matplotlib畫K線
#-*-coding:utf-8-*-
importnumpyasnp
importpandasaspd
importmatplotlib.pyplotasplt
frommatplotlib.datesimportDateFormatter,WeekdayLocator,DayLocator,MONDAY
frommatplotlib.financeimportquotes_historical_yahoo_ohlc,candlestick_ohlc
#從雅虎財經獲取歷史行情
date1=(2017,1,1)
date2=(2017,4,30)
quotes=quotes_historical_yahoo_ohlc('600000.ss',date1,date2)
iflen(quotes)==0:
raiseSystemExit
#創建一個子圖
fig,ax=plt.subplots()
fig.subplots_adjust(bottom=0.2)
#設置主要刻度和顯示格式
mondays=WeekdayLocator(MONDAY)
mondaysFormatter=DateFormatter('%Y-%m-%d')
ax.xaxis.set_major_locator(mondays)
ax.xaxis.set_major_formatter(mondaysFormatter)
#設置次要刻度和顯示格式
alldays=DayLocator()
alldaysFormatter=DateFormatter('%d')
ax.xaxis.set_minor_locator(alldays)
#ax.xaxis.set_minor_formatter(alldaysFormatter)
#設置x軸為日期
ax.xaxis_date()
ax.autoscale_view()
#X軸刻度文字傾斜45度
plt.setp(plt.gca().get_xticklabels(),rotation=45,horizontalalignment='right')
candlestick_ohlc(ax,quotes,width=0.6,colorup='r',colordown='g')
ax.grid(True)
plt.title('600000')
plt.show()
Ⅶ 已知股票數據,如何用Python繪制k線日對應數據
我沒遇到過 只是自己寫過
有點經驗
先確定時間片
然後再把tick插入就行了
Ⅷ python 如何畫出KD數
簡單的KNN演算法在為每個數據點預測類別時都需要遍歷整個訓練數據集來求解距離,這樣的做法在訓練數據集特別大的時候並不高效,一種改進的方法就是使用kd樹來存儲訓練數據集,這樣可以使KNN分類器更高效。
KD樹的主要思想跟二叉樹類似,我們先來回憶一下二叉樹的結構,二叉樹中每個節點可以看成是一個數,當前節點總是比左子樹中每個節點大,比右子樹中每個節點小。而KD樹中每個節點是一個向量(也可能是多個向量),和二叉樹總是按照數的大小劃分不同的是,KD樹每層需要選定向量中的某一維,然後根據這一維按左小右大的方式劃分數據。在構建KD樹時,關鍵需要解決2個問題:(1)選擇向量的哪一維進行劃分(2)如何劃分數據。第一個問題簡單的解決方法可以是選擇隨機選擇某一維或按順序選擇,但是更好的方法應該是在數據比較分散的那一維進行劃分(分散的程度可以根據方差來衡量)。好的劃分方法可以使構建的樹比較平衡,可以每次選擇中位數來進行劃分,這樣問題2也得到了解決。下面是建立KD樹的Python代碼:
def build_tree(data, dim, depth):
"""
建立KD樹
Parameters
----------
data:numpy.array
需要建樹的數據集
dim:int
數據集特徵的維數
depth:int
當前樹的深度
Returns
-------
tree_node:tree_node namedtuple
樹的跟節點
"""
size = data.shape[0]
if size == 0:
return None
# 確定本層劃分參照的特徵
split_dim = depth % dim
mid = size / 2
# 按照參照的特徵劃分數據集
r_indx = np.argpartition(data[:, split_dim], mid)
data = data[r_indx, :]
left = data[0: mid]
right = data[mid + 1: size]
mid_data = data[mid]
# 分別遞歸建立左右子樹
left = build_tree(left, dim, depth + 1)
right = build_tree(right, dim, depth + 1)
# 返回樹的根節點
return Tree_Node(left=left,
right=right,
data=mid_data,
split_dim=split_dim)
對於一個新來的數據點x,我們需要查找KD樹中距離它最近的節點。KD樹的查找演算法還是和二叉樹查找的演算法類似,但是因為KD樹每次是按照某一特定的維來劃分,所以當從跟節點沿著邊查找到葉節點時候並不能保證當前的葉節點就離x最近,我們還需要回溯並在每個父節點上判斷另一個未查找的子樹是否有可能存在離x更近的點(如何確定的方法我們可以思考二維的時候,以x為原點,當前最小的距離為半徑畫園,看是否與劃分的直線相交,相交則另一個子樹中可能存在更近的點),如果存在就進入子樹查找。
當我們需要查找K個距離x最近的節點時,我們只需要維護一個長度為K的優先隊列保持當前距離x最近的K個點。在回溯時,每次都使用第K短距離來判斷另一個子節點中是否存在更近的節點即可。下面是具體實現的python代碼:
def search_n(cur_node, data, queue, k):
"""
查找K近鄰,最後queue中的k各值就是k近鄰
Parameters
----------
cur_node:tree_node namedtuple
當前樹的跟節點
data:numpy.array
數據
queue:Queue.PriorityQueue
記錄當前k個近鄰,距離大的先輸出
k:int
查找的近鄰個數
"""
# 當前節點為空,直接返回上層節點
if cur_node is None:
return None
if type(data) is not np.array:
data = np.asarray(data)
cur_data = cur_node.data
# 得到左右子節點
left = cur_node.left
right = cur_node.right
# 計算當前節點與數據點的距離
distance = np.sum((data - cur_data) ** 2) ** .5
cur_split_dim = cur_node.split_dim
flag = False # 標記在回溯時是否需要進入另一個子樹查找
# 根據參照的特徵來判斷是先進入左子樹還是右子樹
if data[cur_split_dim] > cur_data[cur_split_dim]:
tmp = right
right = left
left = tmp
# 進入子樹查找
search_n(left, data, queue, k)
# 下面是回溯過程
# 當隊列中沒有k個近鄰時,直接將當前節點入隊,並進入另一個子樹開始查找
if len(queue) < k:
neg_distance = -1 * distance
heapq.heappush(queue, (neg_distance, cur_node))
flag = True
else:
# 得到當前距離數據點第K遠的節點
top_neg_distance, top_node = heapq.heappop(queue)
# 如果當前節點與數據點的距離更小,則更新隊列(當前節點入隊,原第k遠的節點出隊)
if - 1 * top_neg_distance > distance:
top_neg_distance, top_node = -1 * distance, cur_node
heapq.heappush(queue, (top_neg_distance, top_node))
# 判斷另一個子樹內是否可能存在跟數據點的距離比當前第K遠的距離更小的節點
top_neg_distance, top_node = heapq.heappop(queue)
if abs(data[cur_split_dim] - cur_data[cur_split_dim]) < -1 * top_neg_distance:
flag = True
heapq.heappush(queue, (top_neg_distance, top_node))
# 進入另一個子樹搜索
if flag:
search_n(right, data, queue, k)525354555657
以上就是KD樹的Python實踐的全部內容,由於本人剛接觸python不久,可能實現上並不優雅,也可能在演算法理解上存在偏差,如果有任何的錯誤或不足,希望各位賜教。