本益比河流圖|Plotly-Filled Area Plot應用教學 - FinLab

文章推薦指數: 80 %
投票人數:10人

高成長股或獲利不夠穩定的企業不適用,本益比河流圖趨勢變化會太過劇烈。

Skiptocontent Tags:finlab量化平台教學,Plotly 內容目錄 隱藏 1 本益比河流圖的用途 2 如何繪製? 2.1 生成資料 2.2 繪圖 3 封裝函數與多元應用 4 總結 本益比河流圖的用途 取標的一段時間內的本益比上下限,再決定要分割幾層,用來判斷獲利或成長性穩定的股票所處於的本益比區間。

高成長股或獲利不夠穩定的企業不適用,本益比河流圖趨勢變化會太過劇烈。

本益比河流圖上升或層距擴大代表獲利逐漸成長,買在河流圖中下緣是理想位置。

本益比河流圖下降或層距縮小代表獲利逐步下掉,若股價位於河流圖上緣則風險偏高。

適合使用本益比的穩定企業不適合使用本益比的不穩定企業如何繪製? Plotly套件提供了FilledAreaPlot函數讓我們可以應用繪製本益比河流圖。

使用Scatter物件帶入fill參數就能將折線圖填充區域顏色。

importplotly.graph_objectsasgo #設定畫布 fig=go.Figure() #使用add_trace加入線段 fig.add_trace(go.Scatter(x=[1,2,3,4],y=[0,2,3,5],fill='tozeroy'))#filldowntoxaxis fig.add_trace(go.Scatter(x=[1,2,3,4],y=[3,5,1,7],fill='tonexty'))#filltotrace0y fig.show() 我們將步驟拆解為二,第一步是生成繪製所需要的資料,第二步是將資料套入繪圖function。

生成資料 pe/close先求出eps,再用split_range設定本益比上下限要分幾層河流。

河流邊界為各區間本益比倍數,與股價相乘後為該邊界本益比對應的股價序列。

fromfinlabimportdata importpandasaspd stock_id='2330' #幾層河流 split_range=8 close=data.get('price:收盤價') pe=data.get('price_earning_ratio:本益比') df=pe[stock_id] max_value=df.max() min_value=df.min() #求本益比上下限間距 quan_value=(max_value-min_value)/split_range #求本益比各河流倍數 river_borders=[round(min_value+quan_value*i,2)foriinrange(0,split_range+1)] #算出eps result=(close[stock_id]/df).dropna().to_frame() index_name='pe/close' result.columns=[index_name] result['close']=close[stock_id] result['pe']=pe[stock_id] #各本益比對應價格 forrinriver_borders: col_name=f"{r}pe" result[col_name]=result[index_name]*r result=round(result,2) 資料目標範例如下列dataframe: 繪圖 fromfinlabimportdata importpandasaspd importplotly.graph_objectsasgo importplotly.expressaspx df=result.copy() #挑出欄位有數字的來畫河流圖,過濾pe/close,close,pe col_name_set=[iforiindf.columnsifany(map(str.isdigit,i))] fig=go.Figure() #執行迴圈填入資料序列 forn,cinenumerate(col_name_set): #第一道邊界下不要填充 ifn==0: fill_mode=None else: fill_mode='tonexty' #colors.qualitative.Prism填入河流圖階層顏色 fig.add_trace( go.Scatter(x=df.index,y=df[c],fill=fill_mode,line=dict(width=0,color=px.colors.qualitative.Prism[n]), name=c)) #製作客製化data項目用來製作hovertemplate,顯示浮動資料 customdata=[(c,p)forc,pinzip(df['close'],df['pe'])] hovertemplate="
date:%{x|%Y/%m/%d}
close:%{customdata[0]}"+f"
'pe'"+":%{customdata[1]}" fig.add_trace(go.Scatter(x=df.index,y=df['close'],line=dict(width=2.5,color='#2e4391'),customdata=customdata, hovertemplate=hovertemplate,name='close')) #取股名製作title security_categories=data.get('security_categories').set_index(['stock_id']) stock_name=security_categories.loc[stock_id]['name'] fig.update_layout(title=f"{stock_id}{stock_name}{'PE'}RiverChart", template="ggplot2", yaxis=dict( title='price', ), #hovermode='xunified', ) #顯示十字線 fig.update_xaxes(showspikes=True) fig.update_yaxes(showspikes=True) 注意以下程式,若第一道邊界下沒設None,會變成以下形式,最低一層會被填入很大一塊區域,與河流間距不相符,有礙觀察,因此我們要讓第一道邊界以下不要填充才比較好。

forn,cinenumerate(col_name_set): fill_mode='tonexty' 封裝函數與多元應用 除了本益比河流圖,常用的還有股價淨值比河流圖,計算和應用方式和本益比河流圖大同小異,我們可以將上面的程式封裝成函數,設定一個mode參數去選擇我們要哪一種河流圖。

完整程式如下: fromfinlabimportdata importpandasaspd importplotly.graph_objectsasgo importplotly.expressaspx #控制資料範圍 defdf_date_filter(df,start=None,end=None): ifstart: df=df[df.index>=start] ifend: df=df[df.index<=end] returndf defget_pe_river_data(start=None,end=None,stock_id='2330',mode='pe',split_range=6): ifmodenotin['pe','pb']: print('modeerror') returnNone close=df_date_filter(data.get('price:收盤價'),start,end) pe=df_date_filter(data.get('price_earning_ratio:本益比'),start,end) pb=df_date_filter(data.get('price_earning_ratio:股價淨值比'),start,end) df=eval(mode) ifstock_idnotindf.columns: print('stock_idinputisnotindata.') returnNone df=df[stock_id] max_value=df.max() min_value=df.min() quan_value=(max_value-min_value)/split_range river_borders=[round(min_value+quan_value*i,2)foriinrange(0,split_range+1)] result=(close[stock_id]/df).dropna().to_frame() index_name=f'{mode}/close' result.columns=[index_name] result['close']=close[stock_id] result['pe']=pe[stock_id] result['pb']=pb[stock_id] forrinriver_borders: col_name=f"{r}{mode}" result[col_name]=result[index_name]*r result=round(result,2) returnresult defplot_tw_stock_river(start=None,end=None,stock_id='2330',mode='pe',split_range=8): """PlotRiverchartfortw_stock UsemaximumorminimumPE(PB)tocalculateRiver. itisgoodforjudgingthehighandlowinthehistoricalinterval. Args: start(str):Thedateofdatastartpoint.ex:2021-01-02 end(str):Thedateofdataendpoint.ex:2021-01-05 stock_id(str):Targetidintwstockmarketex:2330. mode(str):'pe'or'pb'. split_range(int):thequantityofriverborders. Returns: figure """ df=get_pe_river_data(start,end,stock_id,mode,split_range) ifdfisNone: print('dataerror') returnNone col_name_set=[iforiindf.columnsifany(map(str.isdigit,i))] fig=go.Figure() forn,cinenumerate(col_name_set): ifn==0: fill_mode=None else: fill_mode='tonexty' fig.add_trace( go.Scatter(x=df.index,y=df[c],fill=fill_mode,line=dict(width=0,color=px.colors.qualitative.Prism[n]), name=c)) customdata=[(c,p)forc,pinzip(df['close'],df[mode])] hovertemplate="
date:%{x|%Y/%m/%d}
close:%{customdata[0]}"+f"
{mode}"+":%{customdata[1]}" fig.add_trace(go.Scatter(x=df.index,y=df['close'],line=dict(width=2.5,color='#2e4391'),customdata=customdata, hovertemplate=hovertemplate,name='close')) security_categories=data.get('security_categories').set_index(['stock_id']) stock_name=security_categories.loc[stock_id]['name'] fig.update_layout(title=f"{stock_id}{stock_name}{mode.upper()}RiverChart", template="ggplot2", yaxis=dict( title='price', ), #hovermode='xunified', ) fig.update_xaxes(showspikes=True) fig.update_yaxes(showspikes=True) returnfig #plot_tw_stock_river(stock_id='2330',mode='pe',split_range=8) plot_tw_stock_river(stock_id='2330',mode='pb',split_range=8) 股價淨值比河流圖總結 使用finlab和plotly套件可以做出各式各樣視覺化的應用,只要學會一些小技巧,就能客製化屬於自己的看盤工具。

對本篇程式有興趣的可以參考文底連結附檔,記得要先註冊Finlab量化平台才可有權限使用程式喔! colab程式範例 覺得我們的文章有幫助到您,就把它分享給身邊的人吧! Sharethiscontent Opensinanewwindow Opensinanewwindow Opensinanewwindow Opensinanewwindow Genie FinLabeditor. Lovemagicofpythontoexplorethetradingworld. YouMightAlsoLike ADL指標幫你判斷台股盤勢|順勢為王|教你走出拉G盤的迷霧| 2021-04-30 FinLab量化平台入門者操作指南 2021-10-30 本益比選股策略|產業因子分析 2021-09-23 營建業選股策略|財報指標-流動合約負債 2021-08-13 Python財報月報股價爬蟲,台股資料庫終極解決之道! 2021-11-08 進化後的本益比|本益成長比選股策略 2021-09-24 Plotly&Dash初體驗|已實現損益儀表板|DashBoard製作教學(1) 2021-05-03 每週收到新知識 只要有新文章,立刻用Email通知你 加入 Emailisrequired. Emailnotvalid. Thanksforyoursubscription. Failedtosubscribe,pleasecontactadmin. 關於網站 FinLab財經實驗室 股票如何選擇?要怎麼學習量化投資?財報、技術指標如何看?FinLab利用股票分析、財經python教學,讓你在在茫茫股海中,找到專屬於自己的投資方法。

Facebook粉絲專頁 FinLabYouTube頻道 Opensinanewtab 近期文章 Finlab量化平台徵稿活動得獎作品營業利益率選股-安正 2022-02-13/ 0Comments ATR指標應用|肯特納通道 2022-02-13/ 0Comments Finlab量化平台徵稿活動得獎作品集技術面和籌碼面於一身的的AI選股策略-陳士謀 2022-02-09/ 0Comments 文章分類 AI看股票(16) FinLabYouTube(4) Python新手教學(18) PYTHON財經(12) Uncategorized(3) 加密貨幣(18) 基本面分析(19) 大盤漲跌(10) 實價登入(3) 技術面(14) 投資新手(3) 生產力(7) 籌碼面(5) 股票策略(21) 財報狗分析(5) 財經PYTHON教學(45) 選股策略(27) 量子電腦(1) Python理財入門課程Python理財進階課程Python加密貨幣實戰課程



請為這篇文章評分?