<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	
	xmlns:georss="http://www.georss.org/georss"
	xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#"
	>

<channel>
	<title>Plotly &#8211; FinLab</title>
	<atom:link href="https://www.finlab.tw/tag/plotly/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.finlab.tw</link>
	<description>深入淺出的量化投資，讓你在在茫茫股海中，找到專屬於自己的投資方法</description>
	<lastBuildDate>Wed, 02 Nov 2022 15:01:57 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.9</generator>

<image>
	<url>https://www.finlab.tw/wp-content/uploads/2020/07/favicon.png</url>
	<title>Plotly &#8211; FinLab</title>
	<link>https://www.finlab.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">179699571</site>	<item>
		<title>國安基金與庫藏股應用教學｜政府軍急了嗎？</title>
		<link>https://www.finlab.tw/treasury_stock_national_security_fund/</link>
					<comments>https://www.finlab.tw/treasury_stock_national_security_fund/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Mon, 17 Oct 2022 05:37:42 +0000</pubDate>
				<category><![CDATA[籌碼面]]></category>
		<category><![CDATA[FinLab 量化平台]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[VIP文章]]></category>
		<category><![CDATA[pandas]]></category>
		<category><![CDATA[Plotly]]></category>
		<category><![CDATA[國安基金]]></category>
		<category><![CDATA[庫藏股]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=4684</guid>

					<description><![CDATA[2022 可說是亂世風雲，中國防疫政策、俄烏戰爭、通膨、美國大幅升息、企業庫存暴增...等等利空連發重挫市場，許多市場指數到 2022年10月都回檔30%，台股也在護國神山走山下，從 18000 點下殺到 13000 點以下，明顯跌入熊市。
令人不安的是救市神主牌國安基金在 2022/7/12 已進場護盤，卻仍止不住跌勢，被質疑是否過早進場送頭？如果連最後一張王牌都無法扛住，那確實麻煩大了。
本篇文章將用 Finlab 模組 與 Pandas 實作 國安基金與庫藏股 的簡易趨勢分析，讓你更加熟悉 Pandas 各種財經時序資料處理的手法。最後輸出的結果，我們會看到國安基金這次是否和以往不一樣？]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size">2022 可說是亂世風雲，中國防疫政策、俄烏戰爭、通膨、美國大幅升息、企業庫存暴增&#8230;等等利空連發重挫市場，許多市場指數到 2022年10月都回檔30%，台股也在護國神山走山下，從 18000 點下殺到 13000 點以下，明顯跌入熊市。<br>令人不安的是救市神主牌國安基金在 2022/7/12 已進場護盤，卻仍止不住跌勢，被質疑是否過早進場送頭？如果連最後一張王牌都無法扛住，那確實麻煩大了。<br>本篇文章將用 Finlab 模組 與 Pandas 實作 <strong>國安基金與庫藏股</strong> 的簡易趨勢分析，讓你更加熟悉 Pandas 各種財經時序資料處理的手法。最後輸出的結果，我們會看到國安基金這次是否和以往不一樣？</p>



<h2>庫藏股資料處理</h2>



<p class="has-medium-font-size">透過FinLab資料庫，我們可取得庫藏股資訊，在之前的「<a href="https://www.finlab.tw/treasury-stock-signal/">庫藏股實施家數｜崩盤後的長線抄底訊號｜左側交易</a>」文章中有相關實作，不過上篇是用「董事會決議庫藏股的日期」當訊號，這次換示範另一種寫法，使用「庫藏股實施期間」來當訊號，更能精準反應當下有在護盤的公司大概的總家數。</p>



<h3>程式範例</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">import pandas as pd
from finlab import data

預定買回期間_起 = data.get('treasury_stock:預定買回期間-起').unstack()
預定買回期間_迄 = data.get('treasury_stock:預定買回期間-迄').unstack()
# date 為董事會決議庫藏股日期
treasury_stock = pd.DataFrame({'預定買回期間_起':預定買回期間_起, '預定買回期間_迄':預定買回期間_迄}).dropna(how='all')
treasury_stock.index.names = ['stock_id', 'date']

# 產生實施期間序列
treasury_stock['period'] = [pd.date_range(s,e).to_list() for s,e in zip(treasury_stock['預定買回期間_起'],treasury_stock['預定買回期間_迄'])] 

# 使用 explode 展開資料
treasury_stock_period = treasury_stock.explode('period')
treasury_stock_period = treasury_stock_period[['period']]

# 計算每日預計實施庫藏股的公司家數
treasury_count = treasury_stock_period.groupby(['period'])['period'].count()
benchmark = data.get('benchmark_return:發行量加權股價報酬指數')

# 日期索引對應加權大盤報酬指數
treasury_count = treasury_count.reindex(benchmark.index).fillna(0)
treasury_count.plot()</code></pre>



<h3>程式說明</h3>



<ul class="has-medium-font-size"><li>組裝資料<br>將「預定買回期間起迄」兩份資料使用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.unstack.html" target="_blank" rel="noopener">unstack</a> 方法 將格式從 pivot 轉換成 Series，再組裝成 DataFrame。</li><li>產生庫藏股實施日日期序列<br>將開始與結束日期傳入 <a href="https://pandas.pydata.org/docs/reference/api/pandas.date_range.html" target="_blank" rel="noopener">date_range</a> 方法，得到日期序列。</li><li>統計每日預計實施庫藏股的公司家數<br>在使用 <a href="https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.groupby.html" target="_blank" rel="noopener">groupby </a>與 count 統計每日總家數前，要先使用 <a href="https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.explode.html" target="_blank" rel="noopener">explode</a> 方法展開上一個步驟得到的日期資料。</li><li>日期索引重置<br>為了等一下畫圖顯示趨勢，將庫藏股家數趨勢的日期對應加權大盤報酬指數，讓兩條序列長度一致，方便呈現。</li><li>簡易繪圖檢視<br>最後使用dataframe內建的 plot 方法，呈現剛剛整理的數據<br><img width="375" height="252" class="wp-image-4685" style="width: 150px;" src="https://www.finlab.tw/wp-content/uploads/2022/10/庫存股簡易趨勢.png" alt="庫存股簡易趨勢" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/庫存股簡易趨勢.png 375w, https://www.finlab.tw/wp-content/uploads/2022/10/庫存股簡易趨勢-300x202.png 300w" sizes="(max-width: 375px) 100vw, 375px" title="國安基金與庫藏股應用教學｜政府軍急了嗎？ 1"><br></li></ul>



<h2>取得國安基金資料</h2>



<p class="has-medium-font-size">現在 FinLab 的資料庫可以取得國安基金的進出場基本資訊了，詳見<a href="https://ai.finlab.tw/database/#national_security_fund" target="_blank" rel="noopener">資料庫</a>說明。<br>簡單一行就能取出囉 <code>data.get('national_security_fund')</code><br>目前國安基金共啟動8次。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="520" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-17-上午11.44.27-1024x520.png" alt="截圖 2022 10 17 上午11.44.27" class="wp-image-4686" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-17-上午11.44.27-1024x520.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-17-上午11.44.27-300x152.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-17-上午11.44.27-768x390.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-17-上午11.44.27-1536x780.png 1536w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-17-上午11.44.27.png 1585w" sizes="(max-width: 1024px) 100vw, 1024px" title="國安基金與庫藏股應用教學｜政府軍急了嗎？ 2"></figure>



<h2>趨勢繪圖</h2>



<p class="has-medium-font-size">將國安基金實施期間與庫藏股趨勢疊合，比較兩者訊號時間點。</p>



<h3>程式範例</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">import plotly.graph_objects as go
from plotly.subplots import make_subplots

# Create figure with secondary y-axis
fig = make_subplots(specs=[[{"secondary_y": True}]])

# Add traces
fig.add_trace(
    go.Bar(x=treasury_count.index, y=treasury_count.values, marker_color='navy',name="庫藏股實施家數"),
    secondary_y=False,
)

fig.update_traces(marker_color = 'rgba(0,0,250, 0.5)',
                  marker_line_width = 0,
                  selector=dict(type="bar"))

# 大盤指數
fig.add_trace(
    go.Scatter(x=benchmark.index, y=benchmark['發行量加權股價報酬指數'],line = dict(color = '#2C191B'), name="發行量加權股價報酬指數"),
    secondary_y=True,
)

# 國安基金實施期間
for i,row in national_security_fund.iterrows():
    fig.add_vrect(x0=row['啟動時間'], x1=row['退場時間'], 
                  annotation_text=row['時空背景'], annotation_position="top left",
                  fillcolor="green", opacity=0.25, line_width=0)
    
# Add figure title
fig.update_layout(
        title={
            'text': "庫藏股與國安基金護盤趨勢",
            'x': 0.49,
            'y': 0.9,
            'xanchor': 'center',
            'yanchor': 'top'},
        legend=dict(
            orientation="h",
            yanchor="bottom",
            y=1.02,
            xanchor="right",
            x=0.3
        )
)

# Set x-axis title
fig.update_xaxes(title_text="date",
                 rangeselector=dict(
                     buttons=list([
                         dict(count=1,
                              label="1y",
                              step="year",
                              stepmode="backward"),
                         dict(count=3,
                              label="3y",
                              step="year",
                              stepmode="backward"),
                         dict(count=5,
                              label="5y",
                              step="year",
                              stepmode="backward"),
                         dict(count=10,
                              label="10y",
                              step="year",
                              stepmode="backward"),
                         dict(step="all")
                     ])
                 ),
                 rangeslider=dict(
                     visible=True
                 ),
                 type="date")



# Set y-axes titles
fig.update_yaxes(title_text="&lt;b>count&lt;/b>", secondary_y=False)
fig.update_yaxes(title_text="&lt;b>benchmark&lt;/b>", secondary_y=True,showgrid=False)
fig.show()</code></pre>



<h2>救市趨勢分析</h2>



<h3>政府救市三步</h3>



<p class="has-medium-font-size">通常政府救市的步驟如下</p>



<p class="has-medium-font-size">1.鼓勵企業實施庫藏股</p>



<p class="has-medium-font-size">2.限空令 or 找法人喝咖啡</p>



<p class="has-medium-font-size">3.國安感冒糖漿(國家金融安定基金)</p>



<p class="has-medium-font-size">庫藏股對政府最省事，因為不用自己出一毛錢就可能有效果，當然別人先動手最好。<br>企業內部人往往對自家公司價值最了解，有些又有質押股票面臨市值下修的壓力。一般來說，庫藏股這類回燒公司資金的事，經營者多會考量價格是否合理(進入低檔)才買入。<br></p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="418" src="https://www.finlab.tw/wp-content/uploads/2022/10/newplot-18-1024x418.png" alt="newplot 18" class="wp-image-4688" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/newplot-18-1024x418.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-18-300x122.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-18-768x313.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-18-1536x627.png 1536w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-18.png 1960w" sizes="(max-width: 1024px) 100vw, 1024px" title="國安基金與庫藏股應用教學｜政府軍急了嗎？ 3"></figure>



<p class="has-medium-font-size"><br><strong>從圖表發現，前幾次國安基金進場前，庫藏股家數(藍柱)都會先明顯變多，內部人護盤也撐不住了，國家隊才會進場。</strong><br>但這次很不一樣，雖然政府在7月初已經 <a href="https://www.gvm.com.tw/article/94817" target="_blank" rel="noopener">鼓勵企業實施庫藏股</a>，卻沒啥公司響應，於是殺盤持續。即使現在跌多，庫藏股仍靜悄悄，是不是股價不到公司派目標價 (前幾年噴太多)？還是公司派看到未來景氣風險，要保留資金過冬？ <br>還沒等到公司派進場，政府軍這次等不及了，先啟動國安基金，發現還是抵擋不住殺盤，才再祭出「<a href="https://www.storm.mg/lifestyle/4560341" target="_blank" rel="noopener">限空令</a>」，SOP似乎和以前不一樣，就怕大招放完後仍抵擋不住，這次沒庫藏股先擋第一線，要自己多扛一點。</p>



<p class="has-medium-font-size">如果政府招式出盡後，還是繼續殺呢？那很可能國安基金這個六連勝的底部訊號也會失效，讓我們繼續看下去 ~ </p>



<p class="has-medium-font-size">下一篇來教大家怎麼將庫藏股和國安基金進出場化作大盤風險濾網加入策略。</p>



<h2>程式範例檔</h2>



<p class="has-medium-font-size"><a href="https://drive.google.com/file/d/1MIVKDhqjnWvjufa7I_VEbTSarX2ips0P/view?usp=sharing" target="_blank" rel="noopener">colab連結</a><br><br>註冊 FinLab 量化平台 VIP 才能取得全時段數據喔。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/treasury_stock_national_security_fund/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">4684</post-id>	</item>
		<item>
		<title>Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5)</title>
		<link>https://www.finlab.tw/plotly-sunburst-dashboard/</link>
					<comments>https://www.finlab.tw/plotly-sunburst-dashboard/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Fri, 17 Jun 2022 00:34:08 +0000</pubDate>
				<category><![CDATA[生產力]]></category>
		<category><![CDATA[FinLab 量化平台]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[Plotly]]></category>
		<category><![CDATA[sunburst]]></category>
		<category><![CDATA[多策略]]></category>
		<category><![CDATA[資料視覺化]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3858</guid>

					<description><![CDATA[Plotly - Sunburst 是不是十分絢麗呢！可以作多層次是覺化呈現及圖表互動。利用FinLab套件的 StrategySunburst 可以很輕鬆地將多策略資料漂亮地呈現出來，並觀察裡面的insight，當作其中一個管理多策略的工具，不同的繪圖參數設定能玩出不同的效果，趕快來試試吧！]]></description>
										<content:encoded><![CDATA[
<h2>開發動機</h2>



<p class="has-medium-font-size">你的 FinLab 量化平台的策略儀表板上是不是有很多豐富的策略呢？<br>如果答案為是，代表你很棒，嘗試了許多量化策略的實驗，有些策略拿來實驗想法、有些是真的拿來實戰。這時你可能會有下面幾個問題想處理，我想監控儀表板上真正拿來實戰的策略，看每個策略綜整後的部位為何？策略們的標的集中在哪些類股？哪些標的被多個策略同時選中或是比重最大？這時 Sunburst (旭日圖) 可能是你監控策略部位最好的資料視覺化武器之一，FinLab 已開發好工具了！來看看怎麼使用吧！</p>



<h2>Sunburst 是怎樣的圖表？</h2>



<p class="has-medium-font-size">Sunburst 是圓餅圖的進化版，可以顯示分層數據的比例關係，不同的子資料對應於不同級別層次結構，你可以想成是 <a href="https://www.finlab.tw/dashboard2-plotly-treemap/">Treemap</a> 的變化版，都可以使用面積與顏色呈現不同維度的資料，Sunburst 與 Treemap 的差異在允許子資料缺角，不一定要填滿，像是以下的圖例，使用起來比 Treemap 更有彈性，Treemap 就一定要填滿部位。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="903" height="525" src="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-11.png" alt="newplot 11" class="wp-image-3862" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-11.png 903w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-11-300x174.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-11-768x447.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-11-150x87.png 150w" sizes="(max-width: 903px) 100vw, 903px" title="Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5) 4"><figcaption>Sunburst 缺角圖<a href="https://plotly.com/python/sunburst-charts/" target="_blank" rel="noopener">https://plotly.com/python/sunburst-charts/</a></figcaption></figure>



<h2>Plotly-Sunburst 基礎教學</h2>



<h3>圖例</h3>



<p class="has-medium-font-size">plotly 官方文件提供了多元的 <a href="https://plotly.com/python/sunburst-charts/" target="_blank" rel="noopener">Sunburst 範例程式</a>，我們的多策略部位 Sunburst 會以色階型態的 Sunburst 範例為底，用色階變化呈現漲跌幅度，用面積顯示部位權重。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="903" height="525" src="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-13.png" alt="newplot 13" class="wp-image-3863" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-13.png 903w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-13-300x174.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-13-768x447.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-13-150x87.png 150w" sizes="(max-width: 903px) 100vw, 903px" title="Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5) 5"><figcaption>色階型 SunBurst </figcaption></figure>



<h3>程式解構</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">import plotly.express as px
import numpy as np
df = px.data.gapminder().query("year == 2007")
fig = px.sunburst(df, path=['continent', 'country'], values='pop',
                  color='lifeExp', hover_data=['iso_alpha'],
                  color_continuous_scale='RdBu',
                  color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.show()</code></pre>



<p class="has-medium-font-size"><code>plotly.express</code> 提供了高封裝程度的 API，讓我們可以用簡單的語法來繪圖，插入資料以 dataframe 來控制。接著說明一下 sunburst 裡的重要參數。</p>



<ul class="has-medium-font-size"><li>path：sunburst 分層路徑，list 資料是 dataframe 裡的欄位名稱，先後順序代表由裡到外的層級。</li><li>values：決定圓餅面積比例的欄位。</li><li>colors：決定圓餅色階的欄位。</li><li>hovers：游標滑過區塊部位時，想外加的顯示欄位。</li><li>color_continuous_scale：色階條樣式，RdBu 是常用樣式，可以自選<a href="https://plotly.com/python/builtin-colorscales/" target="_blank" rel="noopener">其他樣式</a>。</li><li>color_continuous_midpoint：色階中間決定斷點，用來控制色階深淺區間，範例是取平均壽命當中間點。</li></ul>



<h2>StrategySunburst 物件教學</h2>



<p class="has-medium-font-size"><code>finlab.plot.StrategySunburst()</code><br>提供了多策略的資料處理與視覺化功能，並將 plotly sunburst 的繪圖功能包裝進來。</p>



<h3>獲取多策略資料</h3>



<p class="has-medium-font-size">可以用s_data屬性連結到<code>finlab.data.get_strategies()</code>， 取得已上傳的策略資料，像是每個策略的報酬率曲線、策略報酬率統計、近期部位、近期換股日等等，就不用一個個策略回測取得，直接一把抓，並藉由以下範例取得策略名稱和單一策略部位，策略名稱會用於之後繪圖所用的策略框定。<br>取得策略名稱的範例如下：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.plot import StrategySunburst

# 實例化物件
strategies = StrategySunburst()
s_data = strategy.s_data
print(f'已上傳的策略名稱:{s_data.keys()}')</code></pre>



<h3>獲取繪圖資料</h3>



<p class="has-medium-font-size"><code>StrategySunburst().get_strategy_df(select_strategy=None)</code></p>



<p class="has-medium-font-size">StrategySunburst 下的 get_strategy_df 方法可獲取繪圖資料所用的 dataframe，</p>



<p class="has-medium-font-size">參數說明如下：</p>



<ul class="has-medium-font-size"><li>select_strategy (dict)：選取的策略與策略對應權重，預設是策略全選，權重為每個策略的資金比例平均。也可以自訂匡選的策略，像若是只想看兩個實戰的策略，並分別設定6成語4成資金比重，可以這樣設定：{&#8216;低波動本益成長比&#8217;:0.6,&#8217;研發魔人&#8217;:0.4}。若有現金的空部位想加入資產配置，可以設定如下，策略名稱為現金，即可創造現金部位 {&#8216;低波動本益成長比&#8217;:0.5,&#8217;研發魔人&#8217;:0.2, &#8216;現金&#8217;:0.2}。</li></ul>



<p class="has-medium-font-size">回傳的 dataframe 中，資料欄位 &#8216;market&#8217; 為資產所屬的市場，目前有 tw_stock (台股) 或 crypto (加密貨幣) 或 現金 選項。</p>



<h3>Sunburst 繪圖</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.plot import StrategySunburst

# 實例化物件
strategies = StrategySunburst()

strategies.plot().show()
strategies.plot(select_strategy={'高殖利率烏龜':0.5,'營收強勢動能瘋狗':0.3,'現金流價值成長':0.2}).show()
strategies.plot(select_strategy={'高殖利率烏龜':0.4,'營收強勢動能瘋狗':0.25,'現金流價值成長':0.2,'現金':0.15},path =  ['market', 'category','stock_id','s_name']).show()</code></pre>



<p class="has-medium-font-size"><code>StrategySunburst().plot(select_strategy=None, path=None, color_continuous_scale='RdBu_r')</code></p>



<p class="has-medium-font-size">StrategySunburst 下的 plot 方法提供了繪圖設定，使用短短的程式碼就可以顯示多策略部位圖表。參數承襲 <code>plotly.express.sunburst</code> ，說明如下：</p>



<ul class="has-medium-font-size"><li>select_strategy (dict)：設定選取的策略與策略對應的持股現值權重，預設策略是策略全選，權重策略數的平均值。也可以自訂匡選的策略，像是只想看兩個實戰的策略，並分別設定6成與4成持股現值比重，可以設定成 <code>{'低波動本益成長比':0.6,'研發魔人':0.4}</code> 。若有現金的空部位想加入資產配置，可以設定成 <code>{'低波動本益成長比':0.5,'研發魔人':0.2, '現金':0.2}</code> ，策略名稱為現金，即可創造現金部位。</li><li>path (list)：sunburst 分層路徑，預設由裡到外的分層是 <code>['s_name', 'market', 'category', 'stock_id']</code> ，可以觀察策略持有哪些類股為主。你可以自動設定分層，會有不同的效果，像是也可以設成 <code>['category','stock_id','s_name'] </code> 變成可以看標的被哪些策略同時選到。</li><li>color_continuous_scale (str)：預設為<code>'RdBu_r'</code>，可以自選<a href="https://plotly.com/python/builtin-colorscales/" target="_blank" rel="noreferrer noopener">其他樣式</a>。</li></ul>



<h3>繪圖範例</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.plot import StrategySunburst

# 實例化物件
strategies = StrategySunburst()

# 範例1
strategies.plot().show()
# 範例2
strategies.plot(select_strategy={'高殖利率烏龜':0.5,'營收強勢動能瘋狗':0.3,'現金流價值成長':0.2}).show()
# 範例3
strategies.plot(select_strategy={'高殖利率烏龜':0.4,'營收強勢動能瘋狗':0.25,'現金流價值成長':0.2,'現金':0.15},path =  ['market', 'category','stock_id','s_name']).show()</code></pre>



<h4>範例1</h4>



<p class="has-medium-font-size"><code>strategies.plot().show()</code></p>



<p class="has-medium-font-size">不帶任何參數會顯示全部的已上傳策略部位，策略資金分配比率為策略平均分配。</p>



<figure class="wp-container-2 wp-block-gallery-1 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1000" height="800" data-id="3947" src="https://www.finlab.tw/wp-content/uploads/2022/06/newplot.png" alt="newplot" class="wp-image-3947" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/newplot.png 1000w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-300x240.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-768x614.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-150x120.png 150w" sizes="(max-width: 1000px) 100vw, 1000px" title="Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5) 6"><figcaption>顯示全部策略</figcaption></figure>
</figure>



<p></p>



<h4>範例2</h4>



<p class="has-medium-font-size"><code>strategies.plot(select_strategy={'高殖利率烏龜':0.5,'營收強勢動能瘋狗':0.3,'現金流價值成長':0.2}).show()</code><br><br>自選3個策略，設定不同權重，看策略比重、策略持股的產業分佈。面積越大代表市值權重越大。顏色越紅代表上漲幅度越大，越藍代表跌幅越大。點擊策略可以做圖表互動，放大可只看單一策略的 sunburst (右圖)，從圖表觀察到營收策略選到三檔網通股，佔比最大，獲利最高的是6470 宇智，網通族群可能有營收趨勢翻多的群聚性。若是某些族群佔比超過 50% 以上，可能要反過來思考策略是不是太過於相似？可能會有標的不夠分散的風險。</p>



<figure class="wp-container-4 wp-block-gallery-3 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1000" height="800" data-id="3865" src="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-16.png" alt="newplot 16" class="wp-image-3865" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-16.png 1000w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-16-300x240.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-16-768x614.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-16-150x120.png 150w" sizes="(max-width: 1000px) 100vw, 1000px" title="Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5) 7"></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="1000" height="800" data-id="3864" src="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-15.png" alt="newplot 15" class="wp-image-3864" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-15.png 1000w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-15-300x240.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-15-768x614.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-15-150x120.png 150w" sizes="(max-width: 1000px) 100vw, 1000px" title="Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5) 8"></figure>
</figure>



<p></p>



<h4>範例3</h4>



<p class="has-medium-font-size"><code>strategies.plot(select_strategy={'高殖利率烏龜':0.4,'營收強勢動能瘋狗':0.25,'現金流價值成長':0.2,'現金':0.15},path = ['market', 'category','stock_id','s_name']).show()</code></p>



<p class="has-medium-font-size"><br>自選3個策略並設定現金權重，設定不同權重，除了看策略持股的產業分佈，也可看看標的被哪些策略同時選到。像圖中的 4572 駐龍同時被兩個策略選到，可能是非常厲害的標的喔！</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="1000" height="800" src="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-18.png" alt="newplot 18" class="wp-image-3866" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/newplot-18.png 1000w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-18-300x240.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-18-768x614.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/newplot-18-150x120.png 150w" sizes="(max-width: 1000px) 100vw, 1000px" title="Plotly-Sunburst｜輕鬆監控多策略部位｜DashBoard 應用教學(5) 9"></figure>



<h2>結論</h2>



<p class="has-medium-font-size">Plotly &#8211; Sunburst 是不是十分絢麗呢！可以作多層次是覺化呈現及圖表互動。利用 FinLab 套件的 StrategySunburst 可以很輕鬆地將多策略資料漂亮地呈現出來，並觀察裡面的 insight，當作其中一個管理多策略的工具，不同的繪圖參數設定能玩出不同的效果，趕快來試試吧！<br><br><a href="https://drive.google.com/file/d/16c_Oxy6X9qVYYVTTEGgy0fnjg-GI9TH-/view?usp=sharing" target="_blank" rel="noopener">colab 範例檔連結</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/plotly-sunburst-dashboard/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3858</post-id>	</item>
		<item>
		<title>大盤融資維持率｜Plotly-多重圖組｜DashBoard製作教學(3)</title>
		<link>https://www.finlab.tw/plotly-%e5%a4%9a%e9%87%8d%e5%9c%96%e7%b5%84%e8%9e%8d%e8%b3%87%e7%b6%ad%e6%8c%81%e7%8e%87dashboard%e8%a3%bd%e4%bd%9c%e6%95%99%e5%ad%b83/</link>
					<comments>https://www.finlab.tw/plotly-%e5%a4%9a%e9%87%8d%e5%9c%96%e7%b5%84%e8%9e%8d%e8%b3%87%e7%b6%ad%e6%8c%81%e7%8e%87dashboard%e8%a3%bd%e4%bd%9c%e6%95%99%e5%ad%b83/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Wed, 18 May 2022 08:03:12 +0000</pubDate>
				<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[生產力]]></category>
		<category><![CDATA[籌碼面]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[Plotly]]></category>
		<category><![CDATA[大盤融資維持率]]></category>
		<category><![CDATA[資料視覺化]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3560</guid>

					<description><![CDATA[融資維持率不見得每個券商app都有，透過FinLab API與Plotly，我們可以輕易製作出客製化的圖表來觀察融資維持率，只要有Python的基礎都能輕易上手。]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size">2022年4月到5月初受FED縮表、通膨超出預期、國內疫情爆發等利空因素引起殺盤，跌得昏天暗地，台積電差點跌破500元，更不用說體質更脆弱的小型股倒一片，OTC指數在2022年已回檔超過20%，融資斷頭ptt文齊發，令投資人煎熬。<br>可以抄底了沒？到底還要跌多久？是許多人想知道的問題。止跌的關鍵在不穩定籌碼被洗出了沒？只要投機籌碼仍多，股價就容易因利空產生恐慌急殺。</p>



<h2></h2>



<p class="has-medium-font-size">融資維持率是其中一個重要指標，該指標相關介紹可見<a href="https://www.finlab.tw/mt_rate_strategy/">&#8220;大盤融資維持率｜地板指標幫你搶長線反彈｜0050擇時策略優化？&#8221;</a>，利用融資成數、融資保證金計算，正常水位為1.67，近期大盤融資維持率又跌到150上下的偏低水位，搭配融資餘額持續退場，可見浮動籌碼逐漸被洗出場，有機會開始逐底。<br>若之後融資維持率10日均線開始上揚、融資維持率突破10日均線，則多方籌碼才會再有凝聚現象，不再受到過大的套牢壓力籠罩後，才有機會出現像樣的反彈。<br>融資維持率不見得每個券商app都有，透過FinLab API與Plotly，我們可以輕易製作出客製化的圖表來觀察融資維持率，只要有Python的基礎都能輕易上手。</p>



<h2>生成融資維持率</h2>



<p class="has-medium-font-size">透過以下簡單的程式，我們能生成繪圖所需要用到的資料。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab import data

融資今日餘額 = data.get('margin_transactions:融資今日餘額')
融資券總餘額 = data.get('margin_balance:融資券總餘額')
融資券總餘額 = 融資券總餘額.loc[融資今日餘額.index.intersection(融資券總餘額.index)]
融資券總餘額['上市融資買賣超'] = (融資券總餘額['上市融資交易金額']-融資券總餘額['上市融資交易金額'].shift()).fillna(0)/100000000
融資券總餘額['上櫃融資買賣超'] = (融資券總餘額['上櫃融資交易金額']-融資券總餘額['上櫃融資交易金額'].shift()).fillna(0)/100000000

close = data.get('price:收盤價')
benchmark = data.get('benchmark_return:發行量加權股價報酬指數').squeeze()
融資總餘額 = 融資券總餘額[['上市融資交易金額','上櫃融資交易金額']].sum(axis=1)
融資餘額市值 = (融資今日餘額*close*1000).sum(axis=1)
融資維持率 = (融資餘額市值/融資總餘額)
融資維持率</code></pre>



<h2>台股大盤融資指標圖組繪製</h2>



<p class="has-medium-font-size">我們將用上述的資料套入Plotly製作動態圖組，一目瞭然市場動態，並學習使用plotly.layout去控制外觀與圖表互動工具。以下會對程式的細節提出重點講解。</p>



<h3>目標結果</h3>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="546" src="https://www.finlab.tw/wp-content/uploads/2022/05/newplot-6-1024x546.png" alt="newplot 6" class="wp-image-3561" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/newplot-6-1024x546.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/05/newplot-6-300x160.png 300w, https://www.finlab.tw/wp-content/uploads/2022/05/newplot-6-768x410.png 768w, https://www.finlab.tw/wp-content/uploads/2022/05/newplot-6.png 1500w" sizes="(max-width: 1024px) 100vw, 1024px" title="大盤融資維持率｜Plotly-多重圖組｜DashBoard製作教學(3) 10"><figcaption>融資維持率</figcaption></figure>



<h3>程式範例</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">#@title 台股大盤融資指標
start= '2020-01-01' #@param {type:"date"}
end = "2022-05-17" #@param {type:"date"}

import pandas as pd
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import numpy as np

df = 融資維持率.loc[(融資維持率.index&gt;=start)&amp;(融資維持率.index&lt;=end)]
df2 = 融資券總餘額.loc[(融資券總餘額.index&gt;=start)&amp;(融資券總餘額.index&lt;=end)]


fig = make_subplots(rows=3,
                    cols=1,
                    shared_xaxes=True,
                    vertical_spacing=0.05,
                    specs=[[{"secondary_y": True}],
                            [{"secondary_y": True}],
                            [{"secondary_y": True}],
                           
                           ],
                    subplot_titles=('融資維持率',
                                    '上市融資餘額',
                                    '上櫃融資餘額',

                                    )
                    )

date_index=df.index
benchmark_values=benchmark.reindex(df.index)

# 融資mt_rate
fig.add_trace(
    go.Scatter(x=date_index, y=benchmark_values, name="大盤加權報酬指數",line=dict(width=3)),
    secondary_y=False, row=1, col=1
)

fig.add_trace(
    go.Scatter(x=date_index, y=df.values, name="融資維持率"),
    secondary_y=True, row=1, col=1
)

fig.add_trace(
    go.Scatter(x=date_index, y=df.rolling(10).mean().values, name="融資維持率_ma10"),
    secondary_y=True, row=1, col=1
)


# 買賣超
fig.add_trace(
    go.Scatter(x=date_index, y=df2['上市融資交易金額'], fill='tozeroy',
                line=dict(width=0.5, color='#efd267'), name="上市融資餘額"),
    secondary_y=False, row=2, col=1
)

fig.add_trace(
    go.Bar(x=date_index, y=df2['上市融資買賣超'],
            marker_color=df2['上市融資買賣超'].apply(lambda s: 'red'  if s&gt;0 else 'green' ), name="上市融資買賣超"),
    secondary_y=True, row=2, col=1
)


# otc買賣超
fig.add_trace(
    go.Scatter(x=date_index, y=df2['上櫃融資交易金額'], fill='tozeroy',
                line=dict(width=0.5, color='#efd267'), name="上櫃融資餘額"),
    secondary_y=False, row=3, col=1
)

fig.add_trace(
    go.Bar(x=date_index, y=df2['上櫃融資買賣超'],
            marker_color=df2['上櫃融資買賣超'].apply(lambda s: 'red'  if s&gt;0 else 'green' ), name="上櫃融資買賣超"),
    secondary_y=True, row=3, col=1
)


# remove empty date(holiday)
dt_all = pd.date_range(start=date_index.values[0], end=date_index.values[-1])
# retrieve the dates that are in the original datset
dt_obs = [d.strftime("%Y-%m-%d") for d in pd.to_datetime(close.index)]
# define dates with missing values
dt_breaks = [d for d in dt_all.strftime("%Y-%m-%d").tolist() if not d in dt_obs]
# hide dates with no values
fig.update_xaxes(rangebreaks=[dict(values=dt_breaks)])

# Add figure title


fig.update_layout(
    width=1500,
    height=800,
    title='台股大盤融資5',
    title_font_color="navy",
    title_font_size=20,
    hovermode='x unified',
    yaxis=dict(
        title='指數',
        showgrid=False
    ),
    yaxis2=dict(
        title='融資維持率',
    ),
    yaxis3=dict(
        title='price',
        showgrid=False
    ),
    yaxis4=dict(
        title='買賣超(億)',
    ),
    yaxis5=dict(
        title='price',
        showgrid=False
    ),
    yaxis6=dict(
        title='買賣超(億)',
    ),
        showlegend=True,
        xaxis=dict(
            rangeselector=dict(
                buttons=list([
                    dict(count=1,
                        label="1m",
                        step="month",
                        stepmode="backward"),
                    dict(count=6,
                        label="6m",
                        step="month",
                        stepmode="backward"),
                    dict(count=1,
                        label="YTD",
                        step="year",
                        stepmode="todate"),
                    dict(count=1,
                        label="1y",
                        step="year",
                        stepmode="backward"),
                    dict(count=3,
                        label="3y",
                        step="year",
                        stepmode="backward"),
                    dict(step="all")
                ])
            ),
            type="date"
        ),
        xaxis2=dict(
            type="date"
        ),
        xaxis3=dict(
            rangeslider=dict(
                visible=True
            ),
            type="date"
        ),
    )

fig.show()</code></pre>



<h3>多重子圖</h3>



<p class="has-medium-font-size">plotly的<a href="https://plotly.com/python/subplots/" target="_blank" rel="noopener">make_subplots</a>可控制多重圖組的畫布。<br>rows與cols參數控制畫布有多少張子圖，如此範例是三列一欄的子圖，繪圖物件的定位也依據此來設定。<br>shared_xaxes用來設定子圖是否要共用X軸，像此範例因有使用rangeslider做拉桿，希望拖動時間軸時，所有子圖能一起連動，所以設定為True。<br>vertical_spacing與horizontal_spacing參數為控制子圖間垂直與水平的間隙。<br>specs為設定圖組的格式，此範例因爲要設定雙Y軸縣市不同數據，有加入 <strong>{&#8220;secondary_y&#8221;: True}</strong>。</p>



<h3>融資維持率折線圖</h3>



<p class="has-medium-font-size">畫布加入add_trace(xxx)的意思是加入子圖物件至大畫布裡，如以下程式是在第一列第一行 (也就是第一張子圖) 繪製融資維持率，並將數值對應到右側的Y軸，設定secondary_y=True。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">fig.add_trace(
    go.Scatter(x=date_index, y=df.values, name="融資維持率"),
    secondary_y=True, row=1, col=1
)</code></pre>



<h3>餘額區域圖</h3>



<p class="has-medium-font-size">區域圖又稱<a href="https://plotly.com/python/filled-area-plots/" target="_blank" rel="noopener">Filled Area Plot</a>，使用go.Scatter(fill=&#8217;tozeroy&#8217;)即可將折線圖以下的區域設定填滿顏色。</p>



<h3>買賣超長條圖</h3>



<p class="has-medium-font-size">長條圖是用go.bar()來控制，這邊要注意長條圖顏色控制用融資買賣超的正負數來控制。</p>



<h3>假日空值處理</h3>



<p class="has-medium-font-size">plotly的小坑是時間序列若碰非連續，會有斷點。像台股資料週六、日未交易，圖表就會有被卡掉的現象。需用fig.update_xaxes(rangebreaks=[dict(values=dt_breaks)])來解決。</p>



<h3>layout設定</h3>



<p class="has-medium-font-size">設定畫布的大標題、長寬、子圖的X、Y軸細節，如showgrid只用每個子圖其中一個Ｙ軸對應，不然雙Y軸對應會顯得雜亂。<br>rangeselector能產生圖標左上的日期選取按鈕工具列，點擊1m會將資料帶到近1月，點擊YTD會將資料帶到最近一年度之後的資料，如今天是2022-05-17，會將資料限縮在2022-01-01之後。<br>rangeslider則是子圖最下方的拉桿控制。</p>



<h3>結語</h3>



<p class="has-medium-font-size">plotly有許多互動圖表功能可使用，熟悉後就十分方便，能玩轉更種資料，將FinLab API延伸出更多應用。<br>融資籌碼指標除了大盤融資維持率，個股的維持率與斷頭指標的估算也能幫助我們判斷個股是否落底，靜待下回分曉囉</p>



<h3><a href="https://drive.google.com/file/d/19XQAi4_K9onxcxOszAytJ9X8bsKYCrzr/view?usp=sharing" target="_blank" rel="noopener">colab程式範例</a></h3>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/plotly-%e5%a4%9a%e9%87%8d%e5%9c%96%e7%b5%84%e8%9e%8d%e8%b3%87%e7%b6%ad%e6%8c%81%e7%8e%87dashboard%e8%a3%bd%e4%bd%9c%e6%95%99%e5%ad%b83/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3560</post-id>	</item>
		<item>
		<title>本益比河流圖｜Python Plotly 應用教學</title>
		<link>https://www.finlab.tw/pepb-river-chart/</link>
					<comments>https://www.finlab.tw/pepb-river-chart/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Mon, 27 Sep 2021 07:11:50 +0000</pubDate>
				<category><![CDATA[生產力]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[VIP文章]]></category>
		<category><![CDATA[基本面分析]]></category>
		<category><![CDATA[finlab量化平台教學]]></category>
		<category><![CDATA[Plotly]]></category>
		<category><![CDATA[VIP限定]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=2816</guid>

					<description><![CDATA[本益比河流圖的用途 取標的一段時間內的本益比上下限，再決定要分割幾層，用來判斷獲利或成長性穩定的股票所處於的本 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2>本益比河流圖的用途</h2>



<p>取標的一段時間內的本益比上下限，再決定要分割幾層，用來判斷獲利或成長性穩定的股票所處於的本益比區間。</p>



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



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



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



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="264" src="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-1024x264.png" alt="newplot 10" class="wp-image-2820" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-1024x264.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-768x198.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-1536x396.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10.png 2038w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 11"><figcaption>適合使用本益比的穩定企業</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="264" src="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-11-1024x264.png" alt="newplot 11" class="wp-image-2821" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-11-1024x264.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-11-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-11-768x198.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-11-1536x396.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-11.png 2038w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 12"><figcaption>不適合使用本益比的不穩定企業</figcaption></figure>



<h2>如何繪製?</h2>



<p>Plotly套件提供了<a href="https://plotly.com/python/filled-area-plots/" class="rank-math-link" target="_blank" rel="noopener">Filled Area Plot</a>函數讓我們可以應用繪製本益比河流圖。</p>



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



<pre class="wp-block-code"><code lang="python" class="language-python">import plotly.graph_objects as go
# 設定畫布
fig = go.Figure()
# 使用add_trace加入線段
fig.add_trace(go.Scatter(x=[1, 2, 3, 4], y=[0, 2, 3, 5], fill='tozeroy')) # fill down to xaxis
fig.add_trace(go.Scatter(x=[1, 2, 3, 4], y=[3, 5, 1, 7], fill='tonexty')) # fill to trace0 y

fig.show()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="264" src="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-12-1024x264.png" alt="newplot 12" class="wp-image-2822" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-12-1024x264.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-12-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-12-768x198.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-12-1536x396.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-12.png 2038w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 13"></figure>



<p>我們將步驟拆解為二，第一步是生成繪製所需要的資料，第二步是將資料套入繪圖function。</p>



<h3>生成資料</h3>



<p>pe/close先求出eps，再用split_range設定本益比上下限要分幾層河流。河流邊界為各區間本益比倍數，與股價相乘後為該邊界本益比對應的股價序列。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab import data
import pandas as pd


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) for i in range(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]
# 各本益比對應價格
for r in river_borders:
    col_name = f"{r} pe"
    result[col_name] = result[index_name] * r
result = round(result, 2)</code></pre>



<p></p>



<p>資料目標範例如下列dataframe:</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="413" src="https://www.finlab.tw/wp-content/uploads/2021/09/截圖-2021-09-27-下午2.41.39-1024x413.png" alt="截圖 2021 09 27 下午2.41.39" class="wp-image-2824" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/截圖-2021-09-27-下午2.41.39-1024x413.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/截圖-2021-09-27-下午2.41.39-300x121.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/截圖-2021-09-27-下午2.41.39-768x310.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/截圖-2021-09-27-下午2.41.39-1536x619.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/截圖-2021-09-27-下午2.41.39.png 1593w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 14"></figure>



<h3>繪圖</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab import data
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px

df=result.copy()
# 挑出欄位有數字的來畫河流圖，過濾pe/close,close,pe
col_name_set = [i for i in df.columns if any(map(str.isdigit, i))]

fig = go.Figure()

# 執行迴圈填入資料序列
for n, c in enumerate(col_name_set):
    # 第一道邊界下不要填充
    if n == 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) for c, p in zip(df['close'], df['pe'])]
hovertemplate = "&lt;br&gt;date:%{x|%Y/%m/%d}&lt;br&gt;close:%{customdata[0]}" + f"&lt;br&gt;'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'} River Chart",
                  template="ggplot2",
                  yaxis=dict(
                      title='price',
                  ),
                  # hovermode='x unified',
                  )
# 顯示十字線
fig.update_xaxes(showspikes=True)
fig.update_yaxes(showspikes=True)</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="264" src="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-1024x264.png" alt="newplot 10" class="wp-image-2820" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-1024x264.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-768x198.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10-1536x396.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-10.png 2038w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 11"></figure>



<p>注意以下程式，若第一道邊界下沒設None，會變成以下形式，最低一層會被填入很大一塊區域，與河流間距不相符，有礙觀察，因此我們要讓第一道邊界以下不要填充才比較好。</p>



<pre class="wp-block-code"><code class="">for n, c in enumerate(col_name_set):
    fill_mode = 'tonexty'</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="264" src="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-16-1024x264.png" alt="newplot 16" class="wp-image-2825" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-16-1024x264.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-16-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-16-768x198.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-16-1536x396.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-16.png 2038w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 16"></figure>



<h2>封裝函數與多元應用</h2>



<p>除了本益比河流圖，常用的還有股價淨值比河流圖，計算和應用方式和本益比河流圖大同小異，我們可以將上面的程式封裝成函數，設定一個mode參數去選擇我們要哪一種河流圖。</p>



<p>完整程式如下:</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab import data
import pandas as pd
import plotly.graph_objects as go
import plotly.express as px

# 控制資料範圍
def df_date_filter(df, start=None, end=None):
    if start:
        df = df[df.index &gt;= start]
    if end:
        df = df[df.index &lt;= end]
    return df


def get_pe_river_data(start=None, end=None, stock_id='2330', mode='pe', split_range=6):
    if mode not in ['pe', 'pb']:
        print('mode error')
        return None
    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)
    if stock_id not in df.columns:
        print('stock_id input is not in data.')
        return None
    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) for i in range(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]
    for r in river_borders:
        col_name = f"{r} {mode}"
        result[col_name] = result[index_name] * r
    result = round(result, 2)
    return result

def plot_tw_stock_river(start=None, end=None, stock_id='2330', mode='pe', split_range=8):
    """Plot River chart for tw_stock

    Use maximum or minimum PE(PB) to calculate River.
    it is good for judging the  high and low in the historical interval.

    Args:
      start(str): The date of data start point.ex:2021-01-02
      end(str):The date of data end point.ex:2021-01-05
      stock_id(str): Target id in tw stock market ex:2330.
      mode(str): 'pe' or 'pb'.
      split_range(int):the quantity of river borders.
    Returns:
        figure
    """
    df = get_pe_river_data(start, end, stock_id, mode, split_range)
    if df is None:
        print('data error')
        return None
    col_name_set = [i for i in df.columns if any(map(str.isdigit, i))]

    fig = go.Figure()
    for n, c in enumerate(col_name_set):
        if n == 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) for c, p in zip(df['close'], df[mode])]
    hovertemplate = "&lt;br&gt;date:%{x|%Y/%m/%d}&lt;br&gt;close:%{customdata[0]}" + f"&lt;br&gt;{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()} River Chart",
                      template="ggplot2",
                      yaxis=dict(
                          title='price',
                      ),
                      # hovermode='x unified',
                      )
    fig.update_xaxes(showspikes=True)
    fig.update_yaxes(showspikes=True)

    return fig


# plot_tw_stock_river(stock_id='2330',mode='pe',split_range=8)
plot_tw_stock_river(stock_id='2330',mode='pb',split_range=8)</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="264" src="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-17-1024x264.png" alt="newplot 17" class="wp-image-2826" srcset="https://www.finlab.tw/wp-content/uploads/2021/09/newplot-17-1024x264.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-17-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-17-768x198.png 768w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-17-1536x396.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/09/newplot-17.png 2038w" sizes="(max-width: 1024px) 100vw, 1024px" title="本益比河流圖｜Python Plotly 應用教學 17"><figcaption>股價淨值比河流圖</figcaption></figure>



<h2 id="block-e495eafc-9b2c-498f-a772-7e75e9aeb5d5">總結</h2>



<p>使用finlab和plotly套件可以做出各式各樣視覺化的應用，只要學會一些小技巧，就能客製化屬於自己的看盤工具。</p>



<p id="block-55168ab1-74c2-48d9-8026-9c0247c0d5c9">對本篇程式有興趣的可以參考文底連結附檔，記得要先註冊<a href="https://ai.finlab.tw/" target="_blank" rel="noopener">Finlab量化平台</a>才可有權限使用程式喔！</p>



<p id="block-08507cdf-ff03-4654-83bd-ea97a8476d7a"><a href="https://drive.google.com/file/d/14IrzzPzSbjBRToOU_rYFsmNskI-Gq8F_/view?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">colab程式範例</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/pepb-river-chart/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2816</post-id>	</item>
		<item>
		<title>Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2)</title>
		<link>https://www.finlab.tw/dashboard2-plotly-treemap/</link>
					<comments>https://www.finlab.tw/dashboard2-plotly-treemap/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Sat, 22 May 2021 07:51:30 +0000</pubDate>
				<category><![CDATA[生產力]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[Plotly]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[台股]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=2680</guid>

					<description><![CDATA[開發動機 常見美股財經部落客分享Finviz精美強大的圖表，像是美股板塊地圖，一目瞭然各板塊漲跌幅表現，依照顯 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2>開發動機</h2>



<p>常見美股財經部落客分享<a href="https://finviz.com/" class="rank-math-link" target="_blank" rel="noopener">Finviz</a>精美強大的圖表，像是<a href="https://finviz.com/map.ashx?t=sec" class="rank-math-link" target="_blank" rel="noopener">美股板塊地圖</a>，一目瞭然各板塊漲跌幅表現，依照顯示顏色紅綠深淺，很快就可以知道市場的熱門族群分佈。族群面積大小照市值排行，輕易看出各板塊的權值股代表。一張圖可說包山包海，掌握不同維度的資料，可以快速掌握市場動態，不用一直滑app查半天。</p>



<figure class="wp-block-image size-large"><img src="https://finviz.com/publish/052221/sec_010770481.png" alt="sec 010770481" title="Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2) 18"></figure>



<p>但在台股的網站上，看不太到這類功能，好在學了Python，知道Python在資料處理和資料視覺化非常強大，就來自己開發一下。</p>



<h2>Plotly範例解析</h2>



<p>搜尋一下Plotly，這類圖表稱為<a href="https://plotly.com/python/treemaps/" class="rank-math-link" target="_blank" rel="noopener">TreeMap</a>，很快就找到精美的範例。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="505" src="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-8-1024x505.png" alt="newplot 8" class="wp-image-2682" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-8-1024x505.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-8-300x148.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-8-768x379.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-8.png 1065w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2) 19"></figure>



<p>且程式碼精簡的不可思議：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import plotly.express as px
import numpy as np
df = px.data.gapminder().query("year == 2007")
df["world"] = "world" # in order to have a single root node
fig = px.treemap(df, path=['world', 'continent', 'country'], values='pop',
                  color='lifeExp', hover_data=['iso_alpha'],
                  color_continuous_scale='RdBu',
                  color_continuous_midpoint=np.average(df['lifeExp'], weights=df['pop']))
fig.show()</code></pre>



<p>稍微解析一下px.treemap，完整用法可參考：</p>



<p>帶入DataFrame，path為Top Down排序，最前面的value是最外圍的方塊，範例由世界-洲-國家來排序，由外而內樹狀分佈。</p>



<p>value是決定方塊大小，這裡是用pop(人口)。</p>



<p>color是用lifeExp(壽命)來決定，方塊顏色會依照該國平均壽命大小對應到<a href="https://plotly.com/python/builtin-colorscales/" class="rank-math-link" target="_blank" rel="noopener">color_continuous_scale</a>的樣式。</p>



<p>hover_data是互動圖表的功能，滑鼠移到方塊上時閃現的資訊，通常不用特別設定。</p>



<p>color_continuous_midpoin是決定lifeExp對應<a href="https://plotly.com/python/builtin-colorscales/" class="rank-math-link" target="_blank" rel="noopener">color_continuous_scale</a>顏色條的中間點數值為何？例如範例中的&#8217;RdBu&#8217;色條，數值由大到小是藍-白-紅，而我們希望用全世界人類平均餘命來定義中間點白色數值，則可寫成np.average(df[&#8216;lifeExp&#8217;], weights=df[&#8216;pop&#8217;])，越大於平均的數字越藍，越小的越紅。</p>



<h2>台股版塊程式撰寫</h2>



<h3>主程式</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">class TwStockTreeMap:

    def __init__(self, close, basic_info, start=None, end=None):
        self.start = start
        self.end = end
        self.close = close
        self.basic_info = basic_info

    # dataframe filter by selected date
    def df_date_filter(self, df, start=None, end=None):
        if start:
            df = df[df.index &gt;= start]
        if end:
            df = df[df.index &lt;= end]
        return df

    # map stock_name from basic info(stock_id +name)
    def map_stock_name(self, basic_info, s):
        target = basic_info[basic_info['stock_id'].str.find(s) &gt; -1]
        if len(target) &gt; 0:
            s = target['stock_id'].values[0]
        return s

    def create_data(self):
        close_data = self.df_date_filter(self.close, self.start, end=self.end)
        return_ratio = (close_data.iloc[-1] / close_data.iloc[0]).dropna().replace(np.inf, 0)
        return_ratio = round((return_ratio - 1) * 100, 2)
        return_ratio = pd.concat([return_ratio, close_data.iloc[-1]], axis=1).dropna()
        return_ratio = return_ratio.reset_index()
        return_ratio.columns = ['stock_id', 'return_ratio', 'close']
        return_ratio['stock_id'] = return_ratio['stock_id'].apply(lambda s: self.map_stock_name(basic_info, s))
        return_ratio = return_ratio.merge(self.basic_info[['stock_id', '產業類別', '市場別', '實收資本額(元)']], how='left',
                                          on='stock_id')
        return_ratio = return_ratio.rename(columns={'產業類別': 'category', '市場別': 'market', '實收資本額(元)': 'base'})
        return_ratio['market_value'] = round(return_ratio['base'] / 10 * return_ratio['close'] / 100000000, 2)
        return_ratio = return_ratio.dropna(thresh=5)
        return_ratio['country'] = 'TW-Stock'
        return_ratio['return_ratio_text_info']=return_ratio['return_ratio'].astype(str).apply(lambda s: '+' + s if '-' not in s else s) + '%'
        return return_ratio

    def create_fig(self, relative_market_strength=False):
        df = self.create_data()
        if relative_market_strength is True:
            color_continuous_midpoint = np.average(df['return_ratio'], weights=df['base'])
        else:
            color_continuous_midpoint = 0
        fig = px.treemap(df, path=['country', 'market', 'category', 'stock_id'], values='market_value',
                         color='return_ratio',
                         color_continuous_scale='Tealrose',
                         color_continuous_midpoint=color_continuous_midpoint,
                         custom_data=['return_ratio_text_info','close'],
                         title=f'TW-Stock Market TreeMap({self.start}~{self.end})',
                         width=1350, 
                         height=900)
        
        fig.update_traces(textposition='middle center', 
                          textfont_size=24,
                          texttemplate= "%{label}&lt;br&gt;%{customdata[0]}&lt;br&gt;%{customdata[1]}"
                          )
        return fig
   </code></pre>



<h3>資料處理邏輯</h3>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="640" src="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.21.30-1024x640.png" alt="截圖 2021 05 23 下午10.21.30" class="wp-image-2697" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.21.30-1024x640.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.21.30-300x188.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.21.30-768x480.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.21.30-1536x960.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.21.30-2048x1280.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2) 20"></figure>



<p>有了官方範例，我們很容易依樣畫葫蘆，只要用出同樣邏輯的dataframe就可套入。path的[&#8216;world&#8217;, &#8216;continent&#8217;, &#8216;country&#8217;]換成[&#8216;country&#8217;, &#8216;market&#8217;, &#8216;category&#8217;, &#8216;stock_id&#8217;]，ex:台股-上市-半導體-台積電，分為四層。</p>



<p>邏輯確定後就可開始撰寫dataframe，只會用到收盤價算報酬率、企業基本資料(<a href="https://mops.twse.com.tw/mops/web/t51sb01" class="rank-math-link" target="_blank" rel="noopener">公開資訊觀測站資料源</a>)抓股名、上市櫃分類、產業類別、實收資本額。計算市值時將單位化成億元單位。ETF由於沒有產業類別與實收資本額，會被排除掉。詳見create_data()程式碼。</p>



<h3>繪圖程式修改</h3>



<p>詳見create_fig()的內容，短短的程式碼就能弄出厲害的圖表:</p>



<p>1.value採用market_value(市值)。</p>



<p>2.color採用return_ratio(報酬率)。</p>



<p>3.color_continuous_scale採用&#8217;Tealrose&#8217;，因為由大到小，是紅到綠，與習慣相符。</p>



<p>4.color_continuous_midpoin設為0，因為我們希望漲的都是紅色系，跌的都是綠色系，若用原本範例的畫法，則是以相對市場平均強弱來顯現。</p>



<p>5.設置custom_data=[&#8216;return_ratio_text_info&#8217;,&#8217;close&#8217;]，客製化texttemplate會用到，不然只會有stock_id</p>



<p>6.加入title、width、height畫布樣式，設定標題與長寬。</p>



<p>7.<code>fig.update_traces(textposition='middle center', textfont_size=24,texttemplate= "%{label}&lt;br&gt;%{customdata[0]}&lt;br&gt;%{customdata[1]})</code>，textposition設定資料顯示字體位置，textfont_size字體大小，texttemplate使用custom_data自訂方塊內顯示的文字資訊。</p>



<p></p>



<p>plotly_express_treemap強大的地方是還會幫你自動計算整個板塊市值的市場占比，且點擊每一個方塊會自動縮放，放大各類股和企業區塊，有一些市值比較小的公司一開始看不到，透過點擊放大，就可以看出資料，這是原先finviz無法達成的互動性效果。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="640" src="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.22.04-1024x640.png" alt="截圖 2021 05 23 下午10.22.04" class="wp-image-2698" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.22.04-1024x640.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.22.04-300x188.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.22.04-768x480.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.22.04-1536x960.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-23-下午10.22.04-2048x1280.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2) 21"></figure>



<p>程式若在Colab跑，可用colab的<a href="https://colab.research.google.com/notebooks/forms.ipynb#scrollTo=bf5LUmgZt-kT" class="rank-math-link" target="_blank" rel="noopener">form語法</a>跑出簡易的操作介面，選取區間日期，查整體市場該期間的報酬情況。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">#@title 台股漲跌與市值板塊圖
start= '2021-05-20' #@param {type:"date"}
end = '2021-05-21' #@param {type:"date"}
relative_market_strength = "False" #@param ["False", "True"] {type:"raw"}</code></pre>



<figure class="wp-block-image size-large"><img src="https://www.finlab.tw/f5003c4b-0bfe-4ca2-9b0f-63e9d4d2e6f9" alt="f5003c4b 0bfe 4ca2 9b0f 63e9d4d2e6f9" title="Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2) 22"><figcaption>產生date widget</figcaption></figure>



<h3>繪圖輸出</h3>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="683" src="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-11-1-1024x683.png" alt="newplot 11 1" class="wp-image-2695" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-11-1-1024x683.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-11-1-300x200.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-11-1-768x512.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-11-1.png 1350w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly-TreeMap｜台股版塊地圖｜DashBoard製作教學(2) 23"></figure>



<p>是不是跟Finviz有87分像呢？有興趣的同學也可以把報酬率改成本益比或其他指標，或改成多指標選單，讓板塊圖的功能更加完善喔！</p>



<h3><a href="https://drive.google.com/file/d/1sDvVti1XBMLmxvnLIb70yqHJT0trvg02/view?usp=sharing" target="_blank" rel="noopener">Colab程式碼連結</a></h3>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/dashboard2-plotly-treemap/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2680</post-id>	</item>
		<item>
		<title>Plotly＆Dash初體驗｜已實現損益儀表板｜DashBoard製作教學(1)</title>
		<link>https://www.finlab.tw/realizedprofitloss_dashboard_plotly/</link>
					<comments>https://www.finlab.tw/realizedprofitloss_dashboard_plotly/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Mon, 03 May 2021 12:51:57 +0000</pubDate>
				<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[Plotly]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=2646</guid>

					<description><![CDATA[Plotly與Dash介紹 Plotly是近年Python互動資料視覺化非常強大的模組，可以用Python語法 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2>Plotly與Dash介紹</h2>



<p><a href="https://plotly.com/python/" class="rank-math-link" target="_blank" rel="noopener">Plotly</a>是近年Python互動資料視覺化非常強大的模組，可以用Python語法控制D3.js生成多樣化圖表，支援最潮的ML資料科學也沒問題。擁有完善的widget可做資料互動。結合相關套件Dash後可將圖表輕鬆鑲嵌到Django和其他Python後端模組。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="557" src="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午7.33.54-1024x557.png" alt="截圖 2021 05 03 下午7.33.54" class="wp-image-2649" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午7.33.54-1024x557.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午7.33.54-300x163.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午7.33.54-768x418.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午7.33.54-1536x835.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午7.33.54-2048x1114.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly＆Dash初體驗｜已實現損益儀表板｜DashBoard製作教學(1) 24"></figure>



<p><a rel="noreferrer noopener" href="https://plot.ly/products/dash/" target="_blank">Dash</a>&nbsp;是建構於 Plotly.js、<a rel="noreferrer noopener" href="https://reactjs.org/" target="_blank">React.js</a>&nbsp;與&nbsp;<a rel="noreferrer noopener" href="http://flask.pocoo.org/" target="_blank" class="rank-math-link">Flask</a>&nbsp;之上的 Python 網頁應用程式框架。等同於用Python來完成前端框架React部分功能，不用另外寫JS就能創造出互動性高的動態圖表，只要會簡單的html就能用Plotly加Dash串連前後端生成漂亮的圖表網頁。若想在Jupyter上Run Dash，可另外加裝<a href="https://github.com/plotly/jupyter-dash" class="rank-math-link" target="_blank" rel="noopener">jupyter-dash</a>模組。</p>



<p>中文世界學習Plotly&amp;Dash的資源不多，這系列會記錄一下這兩個套件的使用重點，範例以製作投資方面的圖表與儀表板為主。</p>



<h2>範例目標</h2>



<p>若今天想要依照日期查每日已實現損益的變化、標的損益佔比分佈、賺賠比，在券商app的對帳單無法實現，能不能客製化一個dashboard，只要傳入對帳單就能生成圖表呢？先看一下生成結果的靜態圖。以下會講幾個程式重點，文末會有colab連結供各位參考。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="853" src="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-12-1024x853.png" alt="newplot 12" class="wp-image-2648" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-12-1024x853.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-12-300x250.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-12-768x640.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/newplot-12.png 1200w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly＆Dash初體驗｜已實現損益儀表板｜DashBoard製作教學(1) 25"></figure>



<h2>程式重點</h2>



<h3>整理對帳單格式</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">
# 欄位修改:'日期':'date','損益':'pnl',日期改西元年datetime格式，stock_id換成股票代碼加中文名稱
def process_data(path='drive/MyDrive/sk88/2021對帳.csv'):
    df = pd.read_csv(path)
    df = df.rename(columns={'日期': 'date', '損益': 'pnl'})
    df = df[df['date'] != '總計：']
    df['date'] = df['date'].apply(
        lambda s: datetime.strptime(str(int(s[:s.index('/')]) + 1911) + s[s.index('/'):], "%Y/%m/%d"))
    df['stock_id'] = df['股票'] + ' ' + df['股名']
    return df</code></pre>



<p>每家券商對帳單格式不同，於process_data()修改欄位，自行複寫function。</p>



<p>你可以選擇寫爬蟲、連接api(不是每家都有)從券商拿對帳單，或是自行手動下載對帳單再丟入google drive，範例是使用手動的方式。</p>



<p>demo使用新光證券富貴角7號下載的對帳單，stock_id、date、pnl(已實現損益)是必要欄位，date換成西元年格式，之後dash的DatePickerRange會用到日期查詢互動的部分。colab裡的demo_df為dataframe範例格式供參考。</p>



<h3>繪圖物件</h3>



<p>RealizedProfitLoss物件結構主要有3個function，初始化實體屬性為丟入df生成圖表。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">class RealizedProfitLoss:
    def __init__(self,df):
        self.dataframe=df
    def plot(self,start_date=None, end_date=None):
       
    def run_dash(self):
 </code></pre>



<p></p>



<h4>Plot function</h4>



<pre class="wp-block-code"><code lang="python" class="language-python">     def plot(self,start_date=None, end_date=None):
        # 日期控制
        df=self.dataframe
        if start_date:
            df = df[df['date'] &gt;= start_date]
        if end_date:
            df = df[df['date'] &lt;= end_date]

        # 依照stock_id 分group計算每個標的的損益
        date_group = df.groupby(['date'])[['pnl']].sum()
        df = df.groupby(['stock_id'])[['pnl']].sum()
        df = df.reset_index()
        df = df.sort_values(['pnl'])
        # 分類賺賠
        df['category'] = ['profit' if i &gt; 0 else 'loss' for i in df['pnl'].values]
        df['pnl_absolute_value'] = abs(df['pnl'])
        
        # 製作Sunburst賺賠合併太陽圖所需資料
        df_category = df.groupby(['category'])[['pnl_absolute_value']].sum()
        df_category = df_category.reset_index()
        df_category = df_category.rename(columns={'category': 'stock_id'})
        df_category['category'] = 'total'

        df_total = pd.DataFrame(
            {'stock_id': 'total', 'pnl_absolute_value': df['pnl_absolute_value'].sum(), 'category': ''},
            index=[0])
        df_all = pd.concat([df, df_category, df_total])

        labels = df['stock_id']

        # Create subplots: use 'domain' type for Pie subplot
        fig = make_subplots(rows=4,
                            cols=3,
                            specs=[[{'type': 'domain', "rowspan": 2}, {'type': 'domain', "rowspan": 2},{'type': 'domain', "rowspan": 2}],
                                   [None, None, None],
                                   [{'type': 'xy', "colspan": 3, "secondary_y": True}, None, None],
                                   [{'type': 'xy', "colspan": 3}, None, None]],
                            horizontal_spacing=0.03,
                            vertical_spacing=0.08,
                            subplot_titles=('Profit Pie: ' + str(df[df['pnl'] &gt; 0]['pnl'].sum()),
                                            'Loss Pie: ' + str(df[df['pnl'] &lt; 0]['pnl'].sum()),
                                            'Profit Loss Sunburst: '+str(df['pnl'].sum()),
                                            'Profit Loss Bar By Date',
                                            'Profit Loss Bar By Target',
                                            )

                            )
        # 獲利donut圖
        fig.add_trace(go.Pie(labels=labels, values=df['pnl'], name="profit", hole=.3, textposition='inside',
                            textinfo='percent+label'), row=1, col=1)
        # 虧損donut圖
        fig.add_trace(go.Pie(labels=labels, values=df[df['pnl'] &lt; 0]['pnl'] * -1, name="loss", hole=.3,
                            textposition='inside', textinfo='percent+label'), row=1, col=2)
        # 賺賠合併太陽圖
        fig.add_trace(go.Sunburst(
            labels=df_all.stock_id,
            parents=df_all.category,
            values=df_all.pnl_absolute_value,
            branchvalues='total',
            marker=dict(
                colors=df_all.pnl_absolute_value.apply(lambda s: math.log(s + 0.1)),
                colorscale='earth'),
            textinfo='label+percent entry',
        ), row=1, col=3)

        # 每日已實現損益變化
        fig.add_trace(go.Bar(x=date_group.index, y=date_group['pnl'], name="date", marker_color="#636EFA"), row=3, col=1)
        fig.add_trace(
            go.Scatter(x=date_group.index, y=date_group['pnl'].cumsum(), name="cumsum_realized_pnl",
                      marker_color="#FFA15A"),
            secondary_y=True,row=3, col=1)
        
        # 標的損益變化
        fig.add_trace(go.Bar(x=df['stock_id'], y=df['pnl'], name="stock_id", marker_color="#636EFA"), row=4, col=1)
        
        # 修正Y軸標籤
        fig['layout']['yaxis']['title'] = '$NTD'
        fig['layout']['yaxis2']['showgrid']=False
        fig['layout']['yaxis2']['title'] = '$NTD(cumsum)'
        fig['layout']['yaxis3']['title'] = '$NTD'
        
        # 主圖格式設定標題，長寬
        fig.update_layout(
            title={
                'text': f"Realized Profit Loss Statistic ({start_date}~{end_date})",
                'x': 0.49,
                'y': 0.99,
                'xanchor': 'center',
                'yanchor': 'top'},
            width=1200,
            height=1000)
        return fig
</code></pre>



<p>plotly.express是用在比較不需要客製化圖表的情況，高級封裝語法，短短一行便可生成精美圖表，但在本次範例是以plotly.graph_objects操作，graph_objects是plotly下的底層圖形物件，plotly.express背後也是基於graph_objects實作，可以做客製化的設定。以下將幾個會用到的圖表官方教學連結附上，多是參考官方範例做調整</p>



<p>1.<a href="https://plotly.com/python/subplots/" class="rank-math-link" target="_blank" rel="noopener">make_subplots</a> ：製作子圖畫結構圖。</p>



<p>rows設定子圖列數，cols設定子圖欄數。</p>



<p>specs設定每個子圖的格式，注意每個圖表使用的type不一樣，例如&#8217;domain&#8217; 是用在 Pie，預設是xy，適用座標圖。colspan和rawspan可以做子圖佔比控制，和html語法一樣。若子圖有雙Ｙ軸，記得設定&#8221;secondary_y&#8221;: True。</p>



<p>subplot_titles可控制子圖標題，這邊加上賺賠與損益總金額到子圖的標題上。</p>



<p>2.fig.add_trace：控制子圖資訊，每一個子圖物件都要用fig.add_trace把字圖加入畫布結構中。使用row與col設定子圖在<a href="https://plotly.com/python/subplots/" target="_blank" rel="noopener">make_subplots</a>中specs的相對位置。</p>



<p>3.<a href="https://plotly.com/python/pie-charts/" class="rank-math-link" target="_blank" rel="noopener">pie-charts and sunburst</a>：sunburst可以做整合性的多層圓餅圖資料呈現。製作虧損標的的分佈圖時，注意要將值轉成絕對值，圖表顯示不出負數出來。hole參數控制中心洞的比例。textposition控制顯示資訊的位置，範例設定在圖形內。textinfo控制顯示的資訊，一般圓餅圖會使用&#8217;percent+label&#8217;顯示百分比和每一項資料的名稱。</p>



<p>太陽圖的marker可以做複雜的顏色設定，此範例各項資料的顏色會依照個比例數值帶進colorscale做漸層變化。</p>



<p>4.<a href="https://plotly.com/python/bar-charts/" class="rank-math-link" target="_blank" rel="noopener">bar</a> ：棒狀圖，繪製每日已實現損益變化和標的損益排序。marker_color調整柱狀顏色。</p>



<p>5.fig dict與<a href="https://plotly.com/python/creating-and-updating-figures/" class="rank-math-link" target="_blank" rel="noopener">fig.update_layout</a>：fig是dict的形式，可以直接透過修改dict裡的value調整圖型格式，或是用update_layout的function來修改。若子圖物件沒有參數可調整，可進來fig修正，此範例是修改Ｙ軸標籤，我們有兩個設有雙Ｙ軸的棒狀圖，所以可針對yaxis～yaxis3共四個yaxis做設定，&#8217;title&#8217;設定標籤名，&#8217;showgrid&#8217;控制該軸是否產生格線，通常會只用一鞭產生格線，不然圖表太雜亂。</p>



<p></p>



<h4>Run Dash</h4>



<pre class="wp-block-code"><code lang="python" class="language-python">    def run_dash(self):
        # Build App
        app = JupyterDash(__name__)
        app.layout = html.Div([
            html.H1("Realized Profit Loss JupyterDash"),
            html.P("date_range:"),
            dcc.DatePickerRange(
                id='my-date-picker-range',
                min_date_allowed=date(1990, 1, 1),
                max_date_allowed=date(2100, 12, 31),
                initial_visible_month=date(2021, 1, 1),
                start_date=date(2021, 1, 1),
                end_date=date(2021, 12, 31)
            ),
            dcc.Graph(id="graph")
        ])

        @app.callback(
            Output("graph", "figure"),
            [Input('my-date-picker-range', 'start_date'),
             Input('my-date-picker-range', 'end_date')])

        def update_output(start_date, end_date):
            return self.plot(start_date, end_date)
            
        # Run app and display result inline in the notebook
        app.run_server(mode='inline')</code></pre>



<p>app = JupyterDash(__name__)讓dash程式在jupyter上運行，colab無法開80port網頁出來跑。</p>



<p>app.layout鑲嵌入html語法，製作我們dashboard的網頁頁面。</p>



<p>DatePickerRange是來自dash_core_components（dcc）的日期選取器，可以生成一個widget讓我們選取要查詢的對帳單範圍，裡頭參數可設定預設顯示日期、極限範圍等等，id會關聯到將日期input到繪圖程式的功能。</p>



<p>dcc.Graph(id=&#8221;graph&#8221;)可嵌入plotly圖表到layout。</p>



<p>@app.callback設定output和input物件，參數帶id和變數名稱，如Output(&#8220;graph&#8221;, &#8220;figure&#8221;)，在此範例，output是圖表，input是對帳單起始日期。</p>



<p>update_output(start_date, end_date)這個func會帶入前面設定的Input變數start_date, end_date回傳入繪圖程式plot()，做update的動作。</p>



<p>app.run_server(mode=&#8217;inline&#8217;)，記得設mode=&#8217;inline&#8217;，才能在jupyter上顯示dash。</p>



<p>之後執行程式，loading跑完之後，美美的互動圖表就生成啦！右側的label列可以點掉標的，圖表就會扣除該標的重新計算比例，右上有plotly自帶的工具列，有縮放、截圖、拖拉等好用功能。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="393" src="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午8.44.49-1024x393.png" alt="截圖 2021 05 03 下午8.44.49" class="wp-image-2650" srcset="https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午8.44.49-1024x393.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午8.44.49-300x115.png 300w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午8.44.49-768x295.png 768w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午8.44.49-1536x590.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/05/截圖-2021-05-03-下午8.44.49-2048x787.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Plotly＆Dash初體驗｜已實現損益儀表板｜DashBoard製作教學(1) 26"></figure>



<h2><a href="https://colab.research.google.com/drive/1U9vZ3BC_LcJWKhNgM83rfhCvq79NikvW?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">colab連結</a></h2>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/realizedprofitloss_dashboard_plotly/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2646</post-id>	</item>
		<item>
		<title>ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜</title>
		<link>https://www.finlab.tw/adl-in-tw-stock/</link>
					<comments>https://www.finlab.tw/adl-in-tw-stock/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Fri, 30 Apr 2021 08:29:03 +0000</pubDate>
				<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[大盤漲跌]]></category>
		<category><![CDATA[技術面]]></category>
		<category><![CDATA[選股策略]]></category>
		<category><![CDATA[ADL]]></category>
		<category><![CDATA[Plotly]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[台股]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=2634</guid>

					<description><![CDATA[台股加權指數近年變成護國神山的形狀，若你常做多中小型股，是否常遇到大盤上漲你獨跌的囧境？ADL指標(騰落指標) [&#8230;]]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" src="https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-1024x385.png" alt="newplot 6" class="wp-image-2639" width="737" height="277" srcset="https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-1024x385.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-300x113.png 300w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-768x289.png 768w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-1536x578.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6.png 1595w" sizes="(max-width: 737px) 100vw, 737px" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 30"><figcaption>ADL Index by plotly</figcaption></figure></div>


<p>台股加權指數近年變成護國神山的形狀，若你常做多中小型股，是否常遇到大盤上漲你獨跌的囧境？ADL指標(騰落指標)是走出困局的明燈嗎？</p>



<p>以近期指數數值與權重來看，等於漲跌1元就會影響指數約8.5點，600元的台積電每漲跌1%，就影響約50點，超過2%的波動就能造成指數百點的震盪，以個股操作為主軸的投資人，過往常習慣看指數上漲就跟買個股，結果現在常成為拉G盤的冤魂，整體市場上漲家數小於下跌家數，只漲台積電，賺指數，賠個股，在選股勝率低的時候被騙進場。</p>



<p></p>



<p><img loading="lazy" src="https://lh6.googleusercontent.com/abYx_XSjSQ0f6GqVDlUhKdJPxrs9pHbAKntj4fgnl7HY7oI6Qtl7_WoskuXZsFu2aDr27Gvy-CeA9h5KsRiyddrvgbhBAmeIIxwcJjuS_Ek8_Ht2U_CIobbez_H-46WVav3xFeVk" width="602" height="469" alt="abYx XSjSQ0f6GqVDlUhKdJPxrs9pHbAKntj4fgnl7HY7oI6Qtl7 WoskuXZsFu2aDr27Gvy CeA9h5KsRiyddrvgbhBAmeIIxwcJjuS Ek8 Ht2U CIobbez H" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 31"></p>



<p>ADL指標運用簡單的淨漲跌家數加上均線概念，可輔助判斷出真正百花齊放的大多頭時代，讓你的中小型股投資組合迎風而上。</p>



<p>ADL指標同時也可當作資產配置與擇時進出的輔助指標，台股過去淨上漲累積家數長期與大盤走勢背離！多數時候，你只能看台積電等等權值股上漲， ADL指標短期走弱時，適度配置指數型ETF或縮手會是明智的選擇，ADL指標短期走強時，中小型股較大的機率取得高報酬。</p>



<h2>ADL(Advance/Decline line)定義</h2>



<p>中文又稱“騰落指標”，是一種針對整體市場行情，依據市場每日漲跌家數不同的變化而演算出的一種技術指標。</p>



<p>它是籍由累算每日市場漲跌家數的差值，來反出應整體市場行情漲升力道的強弱變化，並且以此來研判出未來行情大勢可能的發展方向。</p>



<p>ADL指標公式如下：</p>



<p>ADL<sub>t</sub>=ADL<sub>t-1</sub> + AI<sub>t</sub> &#8211; DI<sub>t</sub></p>



<p>ADL有幾點特性：</p>



<p>1.不看市值權重，平等的對待每一支股票，只管它是漲是跌，而不論它的漲幅或股本大小等其它因素。</p>



<p>2.其次，ADL對當日平盤的股票不列入計算考量的範圍。</p>



<h2>ADL與大盤指數趨勢相關性</h2>



<p>同時，由於ADL累計式的特性，因此不同的起始點將推算出不同的ADL值來，所以在研究ADL線圖時，主要的重點應在於研究ADL線圖前後的走勢方向，而非ADL值本身的大小。我們可用台股上市櫃還原股價來繪製ADL，來簡單看一下指標走勢:</p>



<p><img loading="lazy" width="409" height="259" src="https://lh5.googleusercontent.com/6YmB4PrJhTs0vpxuPxR687hd_jFgFImCiZjH7TLBJQvdStwQqwesOVhQGDO-TxPuKKILHyn1p07pUhd8v10JiBZdm8JofTHD_rps1dKAWTy8BHS1biMSot9HjkOO9WMpBsPLV1gz" alt="6YmB4PrJhTs0vpxuPxR687hd jFgFImCiZjH7TLBJQvdStwQqwesOVhQGDO" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 32"></p>



<p>從上圖可以發現，ADL竟是一路的負值趨勢，對比下圖的台股加權報酬指數一路上揚，簡直是兩個世界！</p>



<p><img loading="lazy" width="393" height="259" src="https://lh5.googleusercontent.com/oSCa2XJ5H6iJ9qyZUPGL6vohZyeg4HpxjMBcoIIzwd8l0xqGt8mLtaXy6--YCJM19k6HiOkhYecxjiXlM3kqi6QxWQwWvXajjaewWitTXmdFDvMgQnJkr4VA8nRs2vHw1cZe9i3B" alt="oSCa2XJ5H6iJ9qyZUPGL6vohZyeg4HpxjMBcoIIzwd8l0xqGt8mLtaXy6" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 33"></p>



<p>從兩張圖的關聯，我們可以解釋台股加權報酬指數的上漲是靠少數大權值股貢獻，指數的長期上漲沒有時常伴隨個股百花齊放。個股射飛鏢長期的勝率很低，大部分的時候，多是下跌家數大於上漲家數，造成ADL一路下降，可見見大盤漲就覺得追個股勝率也高的策略並不可靠。</p>



<h2>ADL策略</h2>



<p>由於ADL數值變化劇烈，使用均線平滑數據才能較清楚看到趨勢輪廓，例如ADL的MA5與MA60有不錯的應用效果，用來當趨勢長短期判斷。</p>



<h3>策略假設</h3>



<p>1.若ADL MA5&gt;MA60時為long，且指數趨勢亦上揚，此時最適合做多，個股或指數皆佳。2018下旬下殺後的反彈與2020疫情後大反彈的百花齊放行情都有掌握到。這類機會比較少。</p>



<p>2.若ADL MA5&lt;MA60時為short，代表短期市場下跌家數較多的趨勢持續，個股勝率低，適合指數操作。若大盤指數上揚，與ADL趨勢背離，在缺乏整體市場拉抬力度下，當權值股如台積電被拉抬完後，指數容易回檔，2018與2019年下旬就曾發生此例，在ADL MA5未黃金交叉ADL_MA60時，硬做多可能遇上後來的中期回檔都做白工。</p>



<h3>驗證回測</h3>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="288" src="https://www.finlab.tw/wp-content/uploads/2021/04/截圖-2021-04-30-下午3.48.36-1024x288.png" alt="截圖 2021 04 30 下午3.48.36" class="wp-image-2635" srcset="https://www.finlab.tw/wp-content/uploads/2021/04/截圖-2021-04-30-下午3.48.36-1024x288.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/04/截圖-2021-04-30-下午3.48.36-300x84.png 300w, https://www.finlab.tw/wp-content/uploads/2021/04/截圖-2021-04-30-下午3.48.36-768x216.png 768w, https://www.finlab.tw/wp-content/uploads/2021/04/截圖-2021-04-30-下午3.48.36.png 1267w" sizes="(max-width: 1024px) 100vw, 1024px" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 34"></figure>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://www.finlab.tw/wp-content/uploads/2021/04/newplot-4-1024x334.png" alt="newplot 4" class="wp-image-2636" width="896" height="293" srcset="https://www.finlab.tw/wp-content/uploads/2021/04/newplot-4-1024x334.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-4-300x98.png 300w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-4-768x250.png 768w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-4-1536x501.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-4.png 1611w" sizes="(max-width: 896px) 100vw, 896px" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 35"></figure>



<p>從圖中可以發現long的區間下，做多個股的勝率與short區間差不多，但是勝率有差距，可以裝到右上紫色點的百花齊放噴發的行情，避掉左下各股齊跌的情況。</p>



<p>cross為long區間的period比short少一半。主動投資個股在多數時候不是好選擇。</p>



<h3>主動和被動投資擇時應用</h3>



<p>long訊號期間市場平均報酬能否贏過權值股加權平均報酬(0050)?</p>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://www.finlab.tw/wp-content/uploads/2021/05/newplot-11-1024x410.png" alt="newplot 11" class="wp-image-2644" width="784" height="311" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 36"></figure>



<p>1.adl_0050_strategy：ADL MA多方期間(ma5突破ma60)做多個股，空方期間(ma5跌破ma60)不做多個股，改持有“0050 ETF”取得加權平均市場報酬，績效在近年比一直持有“0050 ETF”好。</p>



<p>2.adl_clearance_strategy：為指標空方時保持空手，不一定比空方時持有etf有優勢，因為死叉期間可能是權值股大漲，大部分的時間adl都是往下的，過去幾年台股指數長期往上，會躲過大跌，但同時也容易錯過指數大漲的時候。不過金融海嘯當年，該指標有躲過崩盤。</p>



<p>3.adl_short_strategy：ADL MA空方期間硬做多個股，長期績效近乎白工。</p>



<p>4.0050走勢與個股平均報酬貼合，但考量換股交易成本，績效與效率不如持有0050。</p>



<h3>結論</h3>



<p>指標走空時空手或改持有0050等指數好標地、不做多個股。</p>



<p>指標翻多時，可考慮加碼中小型股為主的策略。</p>



<h2>如何製作ADL圖表？</h2>



<figure class="wp-block-image size-large is-resized"><img loading="lazy" src="https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-1024x385.png" alt="newplot 6" class="wp-image-2639" width="750" height="282" srcset="https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-1024x385.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-300x113.png 300w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-768x289.png 768w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6-1536x578.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/04/newplot-6.png 1595w" sizes="(max-width: 750px) 100vw, 750px" title="ADL指標幫你判斷台股盤勢｜順勢為王｜教你走出拉G盤的迷霧｜ 37"></figure>



<p>請參考<a href="https://plotly.com/" class="rank-math-link" target="_blank" rel="noopener">plotly</a>與<a href="https://colab.research.google.com/drive/1ylg1Kf6JOG1XdCWJd3suoEPEYb7nQRd5?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">colab程式連結</a>。</p>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/adl-in-tw-stock/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2634</post-id>	</item>
	</channel>
</rss>
