pyecharts繪制K線

      網友投稿 945 2022-05-29

      最近想擴展一下vnpy,優化一些功能和代碼的性能。在看backtesting部分代碼的時候,發現,vnpy其實回測功能挺弱的,可以自己擴展一下。隨之而來的就是一個回測結果可視化的問題。vnpy原生的回測結果沒有繪制k線,所以也就沒有指標的可視化和開倉平倉的可視化,只有隨后交易結果的可視化。筆者自己其實有點點不習慣,沒有看到策略的可視化回測結果,有點點不開心,所以打算自己做一下。首先就是選擇可視化的工具,pyecharts應該是一個首選了,而且現在發展的越來越好了。

      那么,首先來嘗試一下k線部分pyechats官方的代碼吧。

      下面的代碼來自官網哦

      http://pyecharts.org

      from?pyecharts?import?Kline ? v1?=?[[2320.26,?2320.26,?2287.3,?2362.94],?[2300,?2291.3,?2288.26,?2308.38], ??????[2295.35,?2346.5,?2295.35,?2345.92],?[2347.22,?2358.98,?2337.35,?2363.8], ??????[2360.75,?2382.48,?2347.89,?2383.76],?[2383.43,?2385.42,?2371.23,?2391.82], ??????[2377.41,?2419.02,?2369.57,?2421.15],?[2425.92,?2428.15,?2417.58,?2440.38], ??????[2411,?2433.13,?2403.3,?2437.42],?[2432.68,?2334.48,?2427.7,?2441.73], ??????[2430.69,?2418.53,?2394.22,?2433.89],?[2416.62,?2432.4,?2414.4,?2443.03], ??????[2441.91,?2421.56,?2418.43,?2444.8],?[2420.26,?2382.91,?2373.53,?2427.07], ??????[2383.49,?2397.18,?2370.61,?2397.94],?[2378.82,?2325.95,?2309.17,?2378.82], ??????[2322.94,?2314.16,?2308.76,?2330.88],?[2320.62,?2325.82,?2315.01,?2338.78], ??????[2313.74,?2293.34,?2289.89,?2340.71],?[2297.77,?2313.22,?2292.03,?2324.63], ??????[2322.32,?2365.59,?2308.92,?2366.16],?[2364.54,?2359.51,?2330.86,?2369.65], ??????[2332.08,?2273.4,?2259.25,?2333.54],?[2274.81,?2326.31,?2270.1,?2328.14], ??????[2333.61,?2347.18,?2321.6,?2351.44],?[2340.44,?2324.29,?2304.27,?2352.02], ??????[2326.42,?2318.61,?2314.59,?2333.67],?[2314.68,?2310.59,?2296.58,?2320.96], ??????[2309.16,?2286.6,?2264.83,?2333.29],?[2282.17,?2263.97,?2253.25,?2286.33], ??????[2255.77,?2270.28,?2253.31,?2276.22]] kline?=?Kline("K?線圖示例") kline.add("日K",?["2017/7/{}".format(i?+?1)?for?i?in?range(31)],?v1) kline.render()

      首先,k線在pyechats里面定義為Kline類。這里先是寫好了k線的數據,v1.我們注意到,數據的結構是一個列表的列表,里面的每一個列表是open close low high,也就是oclh格式。非常符合我們做量化的風格。

      有了數據之后是實例化k線對象,傳個圖像的名稱就可以了。然后就是關鍵的add方法,其實就是往圖像里面插入數據,我們可以看一下add的實現:

      def?__add(self,?name,?x_axis,?y_axis,?**kwargs): ????????""" ????????:param?name: ????????????系列名稱,用于?tooltip?的顯示,legend?的圖例篩選。 ????????:param?x_axis: ????????????x?坐標軸數據。 ????????:param?y_axis: ????????????y?坐標軸數據。數據中,每一行是一個『數據項』,每一列屬于一個『維度』。 ????????????數據項具體為?[open,?close,?lowest,?highest]?(即:[開盤值,?收盤值, ?????????????最低值,?最高值])。 ????????:param?kwargs: ????????"""

      在Kline類里面,add其實調用了__add,其中,name參數其實就是一個圖例,然后是x坐標的數據,y坐標的數據。

      然后就是render方法就可以獲得一個html格式的結果,用瀏覽器打開就可以了。

      大概是下面這樣:

      圖片來自pyecharts官網。

      此外還可以增加一些別的設置,這些設置都是通過add方法中設置一些關鍵字來完成,比如:

      kline.add(

      "日K",

      ["2017/7/{}".format(i + 1) for i in range(31)],

      v1,

      mark_point=["max"],

      is_datazoom_show=True,

      )

      這里,我們發現多了mark_point和is_datazoom_show的一個設置,其中,mark_point是用來標記處最大值,而is_datazoom_show是用來標記出是否具有伸縮坐標軸功能的。

      同樣的,坐標軸伸縮方向可以通過datazoom_orient來設置:

      kline.add(

      "日K",

      ["2017/7/{}".format(i + 1) for i in range(31)],

      v1,

      mark_point=["max"],

      is_datazoom_show=True,

      datazoom_orient="vertical",

      )

      此外,還可以在圖上畫一些別的線,比如close價的最大值。

      kline.add(

      "日K",

      ["2017/7/{}".format(i + 1) for i in range(31)],

      v1,

      mark_line=["max"],

      mark_line_symbolsize=0,

      datazoom_orient="vertical",

      mark_line_valuedim="close",

      )

      那么,接下來我們來看一下如何改進這個k先的繪制方法吧,我們從一個pandas開始。后面的代碼就是筆者自己寫的哦。

      我們現在有一個pandas, 里面的數據如下:

      還有一列ma10沒有放上去,其實就是5日均線和10日均線。

      def backtesting_plot(table_name, indicator_name_list):

      # data preparation

      da = pd.DataFrame(data=table_name)

      da['volume'] = da['volume'].apply(lambda vol: vol if vol > 0 else 0)

      date = da["datetime"].apply(lambda x: str(x)).tolist()

      k_plot_value = da.apply(lambda record: [record['open'], record['close'], record['low'], record['high']], axis=1).tolist()

      # K chart

      kline = Kline()

      kline.add("Backtesting Result", date, k_plot_value)

      indicator_lines = Line()

      for indicator_name in indicator_name_list:

      indicator_lines.add(indicator_name, date, da[indicator_name].tolist())

      # trading volume bar chart

      bar = Bar()

      bar.add("volume", date, da["volume"],

      tooltip_tragger="axis", is_legend_show=False, is_yaxis_show=False, yaxis_max=5*max(da["volume"]))

      # buy and sell

      v1 = date[10]

      v2 = da['high'].iloc[10]

      es = EffectScatter("buy")

      es.add("buy", [v1], [v2])

      v1 = date[18]

      v2 = da['high'].iloc[18]

      es.add( "sell",? [v1],? [v2], symbol="pin",)

      overlap = Overlap()

      overlap.add(kline)

      overlap.add(indicator_lines,)

      overlap.add(bar,yaxis_index=1, is_add_yaxis=True)

      overlap.add(es)

      overlap.render(path='tt.html')

      我們看一下上面這個函數,首先我們從pandas中拿出數據,轉換成pyecharts能接受的list格式。要提醒大家的是,這里的datetime也要轉化成字符串格式。

      然后就是實例化Kline和技術指標的Line

      pyecharts繪制K線

      # K chart

      kline = Kline()

      kline.add("Backtesting Result", date, k_plot_value)

      indicator_lines = Line()

      for indicator_name in indicator_name_list:

      indicator_lines.add(indicator_name, date, da[indicator_name].tolist())

      然后用bar來制作成交量。這樣的話基本就形成了。

      但是我們進一步希望能夠在k線圖上繪制出買賣信號發生的信息,也就是交易發出的時間點,那么我們用es來添加,這里隨便使用了10和18天作為一個買賣時間點。

      我們做了這么多的圖怎么讓他們一起顯示出來呢?這里就要用到overlap了,也就是疊加的類。

      overlap = Overlap()

      overlap.add(kline)

      overlap.add(indicator_lines,)

      overlap.add(bar,yaxis_index=1, is_add_yaxis=True)

      overlap.add(es)

      overlap.render(path='tt.html')

      我們最后來看一下結果怎么樣:

      可以說相當漂亮了。筆者圈起來的就是我們繪制的時候設置的buy和sell兩個點。

      數據平臺

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:phpStudy中升級MySQL版本到5.7.17的方法步驟
      下一篇:openGauss鯤鵬多核優化解讀
      相關文章
      亚洲国产成人精品女人久久久 | 国产亚洲精品资源在线26u| 亚洲av无码无线在线观看| 精品国产成人亚洲午夜福利| 亚洲国产亚洲综合在线尤物| 亚洲成无码人在线观看| 亚洲大香人伊一本线| 亚洲毛片一级带毛片基地| 亚洲成人一级电影| 亚洲一卡2卡4卡5卡6卡残暴在线| 亚洲国产日韩女人aaaaaa毛片在线| 亚洲欧洲校园自拍都市| 亚洲在成人网在线看| 亚洲免费电影网站| 日韩亚洲产在线观看| 国产成+人+综合+亚洲专| 日韩亚洲国产高清免费视频| 亚洲精品成a人在线观看夫| 亚洲一区无码中文字幕| 亚洲欧洲日产国码无码久久99| 亚洲国产精品一区二区成人片国内 | 亚洲神级电影国语版| 亚洲国产高清在线精品一区| 亚洲精品456在线播放| 亚洲人成77777在线观看网| 亚洲日韩一区精品射精| 亚洲经典千人经典日产| www.亚洲精品.com| 337p日本欧洲亚洲大胆裸体艺术| 国产精品国产亚洲精品看不卡| 亚洲国产精品久久久久网站| 亚洲最大免费视频网| 亚洲男人天堂2018av| 亚洲AV电影天堂男人的天堂| 亚洲国产精品人人做人人爱| 亚洲人成网77777色在线播放 | 婷婷亚洲综合一区二区| 久久精品国产亚洲Aⅴ香蕉| 国产亚洲蜜芽精品久久| 亚洲日韩中文字幕在线播放| 亚洲AV成人片色在线观看|