<?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>股票分析 &#8211; FinLab</title>
	<atom:link href="https://www.finlab.tw/tag/%E8%82%A1%E7%A5%A8%E5%88%86%E6%9E%90/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.finlab.tw</link>
	<description>深入淺出的量化投資，讓你在在茫茫股海中，找到專屬於自己的投資方法</description>
	<lastBuildDate>Fri, 12 Aug 2022 21:31:42 +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>股票分析 &#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/python-biotech-stock-portfolio/</link>
					<comments>https://www.finlab.tw/python-biotech-stock-portfolio/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 05 Aug 2020 14:44:59 +0000</pubDate>
				<category><![CDATA[PYTHON財經]]></category>
		<category><![CDATA[技術面]]></category>
		<category><![CDATA[股票策略]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[選股策略]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[如何買股票]]></category>
		<category><![CDATA[簡易策略]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=2039</guid>

					<description><![CDATA[國光生、中天、亞諾法、合一，這些妖怪股最近的漲跌每天都是10％上下，非常的可怕，要如何才能買在低點、賣在高點？ [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>國光生、中天、亞諾法、合一，這些妖怪股最近的漲跌每天都是10％上下，非常的可怕，要如何才能買在低點、賣在高點？本文教你怎麼設計策略，在 2008 ～2020 年翻 6 倍的穩定策略，獲利不錯且風險小，從零開始研究生技股策略？讓 FinLab 做實驗跟你分享！請原諒我標題殺人，這篇還滿學術且實用的，但往往最有用的東西反而沒人看，只好標題殺人吸引你的目光，看完後保證你值回票價。</p>



<figure class="wp-block-image size-large"><img width="1024" height="683" src="https://www.finlab.tw/wp-content/uploads/2020/08/photo-1591696205602-2f950c417cb9-1024x683.jpeg" alt="生技股（國光生、中天、亞諾法、合一）股價波動大 - 如何寫出穩定的策略呢？" class="wp-image-2055" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/photo-1591696205602-2f950c417cb9-1024x683.jpeg 1024w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1591696205602-2f950c417cb9-300x200.jpeg 300w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1591696205602-2f950c417cb9-768x512.jpeg 768w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1591696205602-2f950c417cb9-1536x1024.jpeg 1536w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1591696205602-2f950c417cb9.jpeg 1650w" sizes="(max-width: 1024px) 100vw, 1024px" title="生技股如何安全買？逆勢爆賺策略分享 1"><figcaption>生技股（國光生、中天、亞諾法、合一）股價波動大 &#8211; 如何寫出穩定的策略呢？</figcaption></figure>



<h2>生技股 ，漲停又跌停，如何判斷？</h2>



<p>上禮拜問大家最想看什麼股票的回測，很多人都說「國光生」、「合一」，這些生技股。在我的機器學習策略中，上禮拜也出現非常多檔，像是「亞諾法」、「中天」等等，當時打開看盤軟體，跌停好幾天了，看到真的會怕，一邊買手一邊抖。</p>



<p>但對我來講，科學比賺錢還要重要，假如我主觀的干預，就算獲利了，也不會開心，<strong>不相信自己的策略，就等於背棄量化交易的信仰</strong>，等於無時無刻都要檢查策略是否出錯，<strong>檢驗股票，汲汲營營於股市，會犧牲很多時間</strong>！還是要交給量化交易，資金才能有系統的放大！</p>



<p>所以無論如何我都不想干預它選出的結果，咬緊牙關低接，事後發現，報酬相當不錯，果然，別人恐慌我貪婪，是股票中的真理。雖然我也很恐慌，但我相信自己做出來的策略。上述經驗，是上禮拜的持股，這禮拜我並沒有建議買生技股呀！</p>



<p>雖然大家可能沒有機器學習策略，但是也想要買生技股，那</p>



<h3>要如何判斷對的時機加碼呢？</h3>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="681" src="https://www.finlab.tw/wp-content/uploads/2020/08/photo-1512767254318-423c816efbf3-1024x681.jpeg" alt="photo 1512767254318 423c816efbf3" class="wp-image-2054" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/photo-1512767254318-423c816efbf3-1024x681.jpeg 1024w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1512767254318-423c816efbf3-300x199.jpeg 300w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1512767254318-423c816efbf3-768x510.jpeg 768w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1512767254318-423c816efbf3-1536x1021.jpeg 1536w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1512767254318-423c816efbf3.jpeg 1953w" sizes="(max-width: 1024px) 100vw, 1024px" title="生技股如何安全買？逆勢爆賺策略分享 2"><figcaption>如何加碼生技股呢？</figcaption></figure>



<p>這篇文章就帶大家來設計一個簡單的策略，雖然設計的簡單，但過程不簡單，我們只要由上次「<a href="https://www.finlab.tw/twii-2330-invest/" class="rank-math-link">如何買台積電？</a>」這篇文章的範例改寫而來，加入了一個回測上的技巧，來防止過擬合，找到適當的參數，同時<strong>避免優化雜訊的風險</strong>！</p>



<h2>生技股策略研發</h2>



<p>策略人人都會寫，特別是用 multicharts ，提供簡單好用的功能，10行以內就可以有績效不錯的策略。只要參數夠多，想要績效多好就有多好，只要透過參數優化就可以了！但是重點就在於，<strong>參數優化真的是有效的嗎？還是你只是優化了歷史，沒有優化未來呢？</strong></p>



<h3>優化歷史不等於優化未來？</h3>



<p>為什麼策略上線後，績效表現不好？為什麼無法優化未來？主要可以分成以下幾個原因：</p>



<ul><li><strong>策略參數維度太大，</strong>相較之下，樣本太少，有點像是買樂透，只要買夠多張，一定會中獎，但不代表你會知道下一期的開獎號碼！更學術的講法，就是策略<strong>誤將歷史雜訊當成規律來優化</strong>（overfitting）。</li><li>第二種可能是，策略雖然有抓到股價的型態，但是隨著越來越多人用一樣的策略，<strong>導致市場效率上升，獲利空間被壓縮</strong>。</li><li>商品因為<strong>基本面和消息面、黑天鵝事件，有重大的變化</strong>，導致價格的特性跟以往不一樣。</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" width="640" height="182" src="https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-9-1.png" alt="thumbnail 9 1" class="wp-image-1153" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-9-1.png 640w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-9-1-300x85.png 300w" sizes="(max-width: 640px) 100vw, 640px" title="生技股如何安全買？逆勢爆賺策略分享 3"><figcaption>overfitting 的結果：只是在優化雜訊</figcaption></figure>



<h3>要如何避免優化失敗呢？</h3>



<p>針對上述的 1 跟 2 點的問題，我們可以用以下的方式，在策略研發時，避免 overfitting：</p>



<ol><li>限制策略的維度：研發策略時，不要用太多參數，或是參數盡量重複使用，讓<strong>可調整的維度盡量縮小</strong>。</li><li>限制回測的次數：當你手動修改策略時，也是一種最佳化，所以<strong>盡量避免盲目的修改程式碼並回測的過程</strong>，有些人把「大於」換成「小於」，就測一次，參數隨便改一改，也測一次，條件拿掉一個，再測一次，濾網增加一個，又測一次。在這樣不斷的測試中，其實是「工人」智慧的最佳化，也會導致 overfitting 喔！</li><li>增加樣本數量：<strong>我們可以取不同的商品，將所有商品用同一個策略來優化</strong>，這樣針對單獨商品的績效會變差，但是整體來說，由於樣本數量變多，商品之間的correlation比較小，找到的 pattern 更 robust（不知道中文怎麼翻：魯棒性？超詭異的）不容易 overfitting。</li><li><strong>使用 hold-out method</strong>：將資料分成樣本內（in-sample IS）跟樣本外（out-of-sample OOS）並且在 IS 做最佳化後，再用 OOS 驗證。</li><li>但 hold-out method 會讓 samples 變少，所以也有其他更複雜的方法，可以參考「<a href="https://www.finlab.tw/backtesting-overfitting-probability/" class="rank-math-link">策略最佳化是有效的嗎？</a>」這篇文章</li><li>驗證近期績效，當你研發出來的策略報酬是凸狀，這種策略可能在近期就不管用了，假如是股票策略，尤其是選股策略，<strong>一定要將兩三年的績效，跟大盤做均一化（normalize、rebase）後的比較</strong>，才能確保策略在近年是有效的，也有人會用 rolling n years 的方式，來看近期績效是否下滑。</li></ol>



<p>上述這麼多種方法，我們今天先簡單挑幾個，接下來就可以開始實做策略囉！</p>



<h2>生技股策略實做</h2>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="683" src="https://www.finlab.tw/wp-content/uploads/2020/08/photo-1575503802870-45de6a6217c8-1024x683.jpeg" alt="photo 1575503802870 45de6a6217c8" class="wp-image-2058" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/photo-1575503802870-45de6a6217c8-1024x683.jpeg 1024w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1575503802870-45de6a6217c8-300x200.jpeg 300w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1575503802870-45de6a6217c8-768x512.jpeg 768w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1575503802870-45de6a6217c8-1536x1024.jpeg 1536w, https://www.finlab.tw/wp-content/uploads/2020/08/photo-1575503802870-45de6a6217c8.jpeg 1650w" sizes="(max-width: 1024px) 100vw, 1024px" title="生技股如何安全買？逆勢爆賺策略分享 4"></figure>



<p>為了避免 overfitting，我們遵守上面「避免優化失敗」的前三個要點：</p>



<ul><li>首先，我們<strong>使用最傳統的均線策略即可，不用作任何修改</strong>，上次怎麼買台積電，就怎麼買生技股！由於是均線策略，只有兩個維度，就是短週期、長週期的均線參數而已。</li><li><strong>增加了停損 -30%</strong>，畢竟生技股大漲大跌還是挺可怕的，使用 &#8211; 30％最主要是防止策略由於基本面、消息面的因素，產生巨幅下跌。此參數是靠經驗設定，不太需要重新回測，所以不太會造成研發策略時的過擬合。</li><li><strong>使用多商品回測，來確保參數的 robustness</strong> ，避免 overfitting。</li></ul>



<p>我們跟上次一樣，使用 Colab 進行回測，Colab 是一個免費線上運行 Python 的平台，請大家打開 <a href="https://colab.research.google.com/drive/1OeZGldvveMZKFErEi1LPdi_OkyhLNmqC?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">Colab</a>，跟我們一起運行程式吧！（只要複製貼上就可以囉！）文末附上完整程式碼，假如你連複製貼上都懶，拉到下方，也可以直接運行喔！</p>



<h3>安裝 Packages</h3>



<p>這個步驟跟上次一樣，是股票回測最基本的起手勢：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers"># 要一小段時間安裝 Packages
!pip install yfinance > log.txt
!pip install Backtesting==0.2.0 > log.txt
!pip install talib-binary</code></pre>



<p>接下來，使用 yahoo finance 下載各種股票的數據來回測，這次的標的有：</p>



<figure class="wp-block-table aligncenter is-style-regular"><table class="has-subtle-light-gray-background-color has-fixed-layout has-background"><thead><tr><th>股票名稱</th><th>Yahoo 股票代碼</th></tr></thead><tbody><tr><td>國光生</td><td>4142.TW</td></tr><tr><td>中天</td><td>4124.TWO</td></tr><tr><td>亞諾法</td><td>4133.TW</td></tr><tr><td>合一</td><td>4743.TW</td></tr></tbody></table><figcaption>股票代號與代碼</figcaption></figure>



<p>上述股票的 yahoo 代碼，假如是上市，就是「TW」結尾，假如是上櫃，就是「TWO」，我們將上述股票的代碼列出來(stocks)，並且使用 <code>get_historical_data</code> 來取得歷史資料，將歷史資料存在 <code>dfs</code> 裡面：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import yfinance as yf
import pandas as pd

def get_historical_data(ticker):
  d = yf.Ticker(ticker)
  df = d.history(period="max")
  df.columns = df.columns.str.lower()
  df.columns = pd.Series(df.columns).str.capitalize().values
  return df.dropna()

stocks = ['4142.TW', '4743.TWO', '4128.TWO', '4133.TW']
dfs = {s:get_historical_data(s) for s in stocks}</code></pre>



<p>接下來就是本篇的重頭戲，<strong>要如何一次考慮所有股票進行優化呢？</strong>當然我們可以一檔一檔優化，並將結果（如 sharpe ratio）平均起來，但是這樣的方式，要修改不少程式，還要加入 for 迴圈，會讓程式碼不好維護。</p>



<p>所以我用了一個簡單的方法，把它取名為「price fusion」，顧名思義，就是將<strong>所有商品的開高低收整合起來，融合成一個商品</strong>，這樣就可以用一樣優化方法，但是最後的結果同時考慮了上述 5 檔股票，是不是方便很多呢？</p>



<p>由於程式碼稍微複雜，所以我就不詳細介紹是怎麼寫的，有興趣的人可以自行研究，假如你時間有限，可以直接呼叫下方的「price_fusion」這個 function，就可以了。</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import numpy as np
def price_fusion(ohlcv, symbols):
  start_bar = 0
  close_ref = pd.Series(np.concatenate([ohlcv[s].Close.astype(float).pct_change().values[start_bar:] for s in symbols]))
  close_ref[close_ref.abs() > 0.1] = 0
  ret_close = (close_ref + 1).cumprod()

  close = pd.Series(np.concatenate([ohlcv[s].Close.astype(float).values[start_bar:] for s in symbols]))
  high = pd.Series(np.concatenate([ohlcv[s].High.astype(float).values[start_bar:] for s in symbols]))
  low = pd.Series(np.concatenate([ohlcv[s].Low.astype(float).values[start_bar:] for s in symbols]))
  open_ = pd.Series(np.concatenate([ohlcv[s].Open.astype(float).values[start_bar:] for s in symbols]))
  volume = pd.Series(np.concatenate([ohlcv[s].Volume.astype(float).values[start_bar:] for s in symbols]))

  ret_high = ret_close * high / close
  ret_low = ret_close * low / close
  ret_open = ret_close * open_ / close

  return pd.DataFrame({
      'Open': ret_open.values,
      'High': ret_high.values,
      'Low': ret_low.values,
      'Close': ret_close.values,
      'Volume': volume.values,
  }, index=pd.date_range('2000-1-1', periods=len(ret_close), freq='1h')).dropna().astype(float)

df = price_fusion(dfs, stocks)
print('price dataframe shape', df.shape)
df.head()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="318" src="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-4.01.22-PM-1-1024x318.png" alt="Screen Shot 2020 08 05 at 4.01.22 PM 1" class="wp-image-2042" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-4.01.22-PM-1-1024x318.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-4.01.22-PM-1-300x93.png 300w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-4.01.22-PM-1-768x239.png 768w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-4.01.22-PM-1.png 1370w" sizes="(max-width: 1024px) 100vw, 1024px" title="生技股如何安全買？逆勢爆賺策略分享 5"></figure>



<p>我們可以發現，原本六檔股票，已經整合成同一個商品了，<strong>總共有11861天，大約是47年的績效</strong>！你可以想像一下，假如你可以找到<strong>一個策略，長達 47年有效，是不是覺得這個策略的可靠性變高很多</strong>，對這個策略更有信心了呢？這就是有效增加sample的方法！</p>



<h3>回測生技股</h3>



<p>融合完以上的商品，我們可以來回測了，回測的策略跟「<a href="https://www.finlab.tw/twii-2330-invest/" class="rank-math-link">研發台積電策略</a>」的文章是一模一樣的，所以我們在這邊只列出程式碼，不額外講解，假如對於下方的程式碼有任何不清楚，都可以前往<a href="https://www.finlab.tw/twii-2330-invest/" class="rank-math-link">該篇文章</a>詳讀喔！</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">from backtesting import Backtest, Strategy

class Strategy(Strategy):
    
    n1 = 40
    n2 = 30
    
    def init(self):
        super().init()
        
        # Precompute the two moving averages
        close = pd.Series(self.data.Close)
        sma1 = talib.SMA(close, timeperiod=self.n1)
        sma2 = talib.SMA(close, timeperiod=self.n2)

        # Precompute signal
        signal_long = (sma1 > sma2) &amp; (sma1.shift() &lt; sma2.shift())
        signal_short = ((sma1 &lt; sma2) &amp; (sma1.shift() > sma2.shift()))

        # combine signal
        signal = signal_long
        signal[signal_short] = -1
        
        # plot sma
        self.I(lambda x: sma1, 'sma1')
        self.I(lambda x: sma2, 'sma2')

        # set signal to trade
        self.signal = self.I(lambda x: signal, 'signal')

    def next(self):
        super().next()

        entry_size = self.signal[-1]

        if entry_size > 0:
            self.buy()
        elif entry_size &lt; 0:
          for trade in self.trades:
            trade.close()

        for trade in self.trades:
          if self.data.Close[-1] &lt; trade.entry_price * 0.7:
            trade.close()

bt = Backtest(df, Strategy)
result1 = bt.run()
bt.plot()</code></pre>



<p>下圖就是回測跑完的結果，我偷偷先使用了最佳化參數，但你這個階段理論上，不應該得到如此好的績效，這是優化後的結果，為了省去大家設參數的辛勞！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="581" src="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-10.15.15-PM-1024x581.png" alt="Screen Shot 2020 08 05 at 10.15.15 PM" class="wp-image-2060" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-10.15.15-PM-1024x581.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-10.15.15-PM-300x170.png 300w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-10.15.15-PM-768x436.png 768w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-10.15.15-PM-1536x872.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-10.15.15-PM-2048x1163.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="生技股如何安全買？逆勢爆賺策略分享 6"></figure>



<h3>策略優化</h3>



<p>可以回測後，我們就可以做策略的最佳化，這邊要注意的地方是，為了避免 overfitting，在參數枚舉時（列舉所有參數時），不要間格太密，例如「5」，我覺得就是很剛好的數字，不用到「1」，不然容易 overfitting。</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">result2 = bt.optimize(n1=range(10, 60, 5),
                      n2=range(10, 60, 5))
print(result2._strategy)

# plot results
result2._equity_curve.Equity.plot(use_index=False, logy=True)</code></pre>



<p>下圖是最後策略的結果，我們可以看到47年總共獲利30000％！由於數字太大了，所以我們用 log 將數值變得比較有可看性，以一個粗糙的策略來說，我覺得很棒了，事實是，有時候均線策略，只要用對的方法來製作策略，就能夠有不錯的績效！你可以說我研發策略返璞歸真，也可以說我懶，但不論如何，有效最重要！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1010" height="564" src="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-8.57.37-PM.png" alt="Screen Shot 2020 08 05 at 8.57.37 PM" class="wp-image-2051" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-8.57.37-PM.png 1010w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-8.57.37-PM-300x168.png 300w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-8.57.37-PM-768x429.png 768w" sizes="(max-width: 1010px) 100vw, 1010px" title="生技股如何安全買？逆勢爆賺策略分享 7"><figcaption>fusion price 回測結果</figcaption></figure>



<p>上圖中有一行「Strategy(n1=49, n2=30)」可以看到優化後，程式設定最佳參數為（n1=40, n2=30）這兩條均線，<strong>代表30日均線跌到40日下方時，我們可以購買這些生技股，停損一律是30％，直到股價回升，均線黃金交叉為止。歷史績效會有不錯的表現</strong>。雖然使用融合商品，得到不錯的績效，但在個股單一表現實用上，究竟能不能重現這樣驚人的績效呢？</p>



<h2>回到單檔股票回測</h2>



<p>上述是我們用融合的商品，回測47年的狀況，但是我們實際交易時，應該是會有很多商品，而商品的價格是同步進行的，怎麼修正呢？最終還是得一檔一檔測測看，使用 for 迴圈測，不過這時候因為策略都研發完了，所以只是做最後的檢驗動作：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">eqs = {}
for s in stocks:
  bt = Backtest(dfs[s], Strategy)
  r = bt.run()
  eqs[s] = r._equity_curve.Equity
eqs = pd.DataFrame(eqs)
eqs.plot()</code></pre>



<p>下圖是跑出來的結果，可以看到這個策略在單一商品上，也表現的還算OK，但當然偶爾虧損還是滿大的，例如 4128（綠色）這檔股票 2018 年的跌幅，目測應該三個月虧損了快30％，這樣的策略是不能使用的！太危險！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1018" height="468" src="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.03.53-PM.png" alt="Screen Shot 2020 08 05 at 9.03.53 PM" class="wp-image-2052" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.03.53-PM.png 1018w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.03.53-PM-300x138.png 300w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.03.53-PM-768x353.png 768w" sizes="(max-width: 1018px) 100vw, 1018px" title="生技股如何安全買？逆勢爆賺策略分享 8"><figcaption>生技股回測結果</figcaption></figure>



<h3>多商品合併以降低風險</h3>



<p>最後，為了將風險降低，我們來寫一個資產分配的回測，模擬將資產平均分配到這 4 個商品上，每個月重新再平衡，會得到如何的報酬率呢？</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">(eqs.resample('M')
    .last()
    .pct_change()+1
).mean(axis=1).cumprod().plot()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="898" height="528" src="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.10.56-PM.png" alt="Screen Shot 2020 08 05 at 9.10.56 PM" class="wp-image-2053" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.10.56-PM.png 898w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.10.56-PM-300x176.png 300w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-05-at-9.10.56-PM-768x452.png 768w" sizes="(max-width: 898px) 100vw, 898px" title="生技股如何安全買？逆勢爆賺策略分享 9"><figcaption>多商品合併</figcaption></figure>



<p>從2009年到2019年，總共將資產翻了6倍，drawdown 看起來不大，我不會覺得太差，送給大家囉！由於此策略是擇時策略，所以會有很多閒置資金，所以績效應該比 6 倍好很多。另外，由於我們對多商品都用同一個策略，所以過擬合的機率算低，而此策略又是大家最舒服的逆勢加碼，相信除了學術練習外，實用上也會有一定的價值，不過任何策略都有失效和過擬合的可能，我們只能將其機率降低，無法保證 100％有效。假如大家有興趣看那個產業的策略，請在下方留言！我會不定時參考一下，決定之後要出的文章喔！</p>



<p>最後我們可以任意觀看其中一檔標的，是否值得買入，例如法諾亞（4133.TW）：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">s = '4133.TW'
bt = Backtest(dfs[s], Strategy)
r = bt.run()
bt.plot()</code></pre>



<p>法諾亞最近五筆交易，使用此策略，勝率為80％！雖然大波段沒抱到，但是也賺了4～50％，很不錯了啦（畢竟是逆勢策略）！不過當前的股價，由於均線沒有死亡交叉，所以對此策略來說，價格偏高，不適合買入，大家可以隨時跑程式，來觀察是否有生技股有均線死亡交叉，都會是很好的買入時機喔（根據歷史統計來說）！這就是簡單但又不簡單的均線最佳化策略！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="581" src="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-06-at-9.12.55-AM-1024x581.png" alt="Screen Shot 2020 08 06 at 9.12.55 AM" class="wp-image-2068" srcset="https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-06-at-9.12.55-AM-1024x581.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-06-at-9.12.55-AM-300x170.png 300w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-06-at-9.12.55-AM-768x436.png 768w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-06-at-9.12.55-AM-1536x872.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/08/Screen-Shot-2020-08-06-at-9.12.55-AM-2048x1163.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="生技股如何安全買？逆勢爆賺策略分享 10"></figure>



<p>接下來一系列，我會介紹加密貨幣。其實早在 2020 年 04 月 20 號，我就低調開始撰寫一系列 BTC 的文章，當時價格為 6838 BTC/USDT，現在已經破 12000了！要是你那時候有追蹤 finlab，就算放著不動，可能已經獲利 70％。</p>



<p>我自己也有不少資產放在 BTC，並且用 Python 自動交易，因為 BTC 是新商品，算是非效率市場（個人回測時的感覺），尤其是其他的加密貨幣（alternative coin 簡稱 altcoin），用量化交易操作，就像就是用坦克跟原始人打仗一樣！現在開始，使用量化投資做低風險的BTC交易，為時不晚，下一篇，我們從加密貨幣的基本面開始講起。可以<a href="https://www.facebook.com/finlab.python" class="rank-math-link" target="_blank" rel="noopener">追蹤 finlab 粉絲團，收到最新的文章</a>喔！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/python-biotech-stock-portfolio/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2039</post-id>	</item>
		<item>
		<title>台積電如何買？用 Python 研發投資策略</title>
		<link>https://www.finlab.tw/twii-2330-invest/</link>
					<comments>https://www.finlab.tw/twii-2330-invest/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 29 Jul 2020 05:28:08 +0000</pubDate>
				<category><![CDATA[選股策略]]></category>
		<category><![CDATA[PYTHON財經]]></category>
		<category><![CDATA[技術面]]></category>
		<category><![CDATA[股票策略]]></category>
		<category><![CDATA[台積電]]></category>
		<category><![CDATA[如何投資]]></category>
		<category><![CDATA[如何買股票]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=1928</guid>

					<description><![CDATA[人人都想買台積電，獲得穩定的報酬，然而股價現在這麼高了，還安全嗎？怎麼才能安全的享受台積電的上漲的獲利，又可以在下跌時加碼呢？我們可以針對台積電，用 Python 研發擇時買賣！]]></description>
										<content:encoded><![CDATA[
<p>最近股票圈最熱門的話題，不外乎就是「台積電」，以前我們都說，市值太大的股票，上漲的幅度有限。但是台積電果然是國家棟梁，身為台股最大市值的股票，竟然可以漲停板！然而現在這麼高了，還安全嗎？怎麼才能安全的享受台積電的上漲的獲利，又可以在下跌時加碼呢？我們可以針對台積電，用 Python 研發擇時買賣，文末附上完整程式範例！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="577" src="https://www.finlab.tw/wp-content/uploads/2020/07/Picture1-6-1024x577.png" alt="台積電" class="wp-image-1957" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Picture1-6-1024x577.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Picture1-6-300x169.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Picture1-6-768x433.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Picture1-6-1536x866.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Picture1-6-2048x1155.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="台積電如何買？用 Python 研發投資策略 11"><figcaption>台積電要如何買賣呢？</figcaption></figure>



<h3>3步驟帶你分析台積電</h3>



<p>這篇文章會分享怎麼研發台積電的投資策略，主要有三個步驟：</p>



<ol><li>使用 <strong>Colab</strong> 並安裝 yfinance 、 backtesting、talib 的函式庫</li><li><strong>下載台積電股價歷史紀錄</strong>，研發買賣訊號</li><li><strong>回測交易結果分析</strong>，並且研究策略如何<strong>優化</strong></li></ol>



<h2>1. 使用 <a href="https://colab.research.google.com/" target="_blank" rel="noreferrer noopener">Colab</a> 並下載環境</h2>



<p>要建構一個股票策略，只要會基本的 Python ，就可以開始了，我們使用 <a rel="noreferrer noopener" href="https://colab.research.google.com/" target="_blank">Colab</a> 來當作撰寫 Python 的平台，這是 Google 佛心推出的，讓我們可以線上撰寫程式，而且<strong>完全免費</strong>！我自己已經把幾乎所有程式碼搬到 Colab 上了！雖然速度比桌機稍慢，但是<strong>可以雲端任何地點編輯，就算換電腦也不用擔心！</strong></p>



<h3>安裝 Package</h3>



<p>我們今天要用的 Package，有兩個，一個是 <a href="https://pypi.org/project/yfinance/" target="_blank" rel="noreferrer noopener">yfinance</a> ，負責下載 yahoo finance 上的股價資料，另外一個是 <a href="https://github.com/kernc/backtesting.py" target="_blank" rel="noreferrer noopener">backtesting</a>，顧名思義就是用來研發策略用的！但研發策略，有時候會需要製作技術指標，並根據技術指標來交易，所以需要用到 <a href="http://mrjbq7.github.io/ta-lib/" target="_blank" rel="noreferrer noopener">talib</a> 這個 Package，我們可以用簡單的三行指令完成安裝：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">!pip install yfinance
!pip install Backtesting
!pip install talib-binary</code></pre>



<p>上述三行，只要在程式碼輸入欄輸入，系統就會幫你安裝好這三款 package，這三行的第一個字符是驚嘆號，代表我們要執行 <a href="https://zh.wikipedia.org/wiki/%E6%AE%BC%E5%B1%A4" target="_blank" rel="noreferrer noopener">Shell</a> 的語法，不是 Python 的語法！假如你不是用 Colab，而是用個人電腦，也可以在打開 <a href="https://zh.wikipedia.org/wiki/%E6%AE%BC%E5%B1%A4" target="_blank" rel="noreferrer noopener">Shell</a> 輸入這些指令，記得將指令的驚嘆號移除喔！</p>



<h2>2. 下載台積電股價，研發買賣訊號！</h2>



<p>首先，我們先來下載台積電的歷史紀錄，在下方的程式碼中，我們已經幫大家寫好一個函式，叫做「get_historical_data」，可以直接呼叫它來獲取股價。由於 yfinance 的歷史紀錄算是滿豐富的，所以有很多股票都可以下載，包含美股台股，例如蘋果（AAPL），特斯拉（TSLA），微軟（MSFT），然而台股的部分，比較可惜的地方，就是只有上市資料，如台積電（2330.TW），以下是完整的範例。<strong>你可以 <a href="https://finance.yahoo.com/quote/2330.TW?p=2330.TW&amp;.tsrc=fin-srch" target="_blank" rel="noreferrer noopener">參考 yahoo finance</a> 來下載你有興趣股票！</strong></p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import yfinance as yf
import pandas as pd

def get_historical_data(ticker):
  d = yf.Ticker(ticker)
  df = d.history(period="max")
  df.columns = df.columns.str.lower()
  df.columns = pd.Series(df.columns).str.capitalize().values
  return df.dropna()

df = get_historical_data('2330.TW')
df</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="373" src="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-11.57.25-AM-1024x373.png" alt="Screen Shot 2020 07 29 at 11.57.25 AM" class="wp-image-1938" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-11.57.25-AM-1024x373.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-11.57.25-AM-300x109.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-11.57.25-AM-768x279.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-11.57.25-AM.png 1242w" sizes="(max-width: 1024px) 100vw, 1024px" title="台積電如何買？用 Python 研發投資策略 12"></figure>



<h3>策略訊號研發</h3>



<p>有了股票的歷史紀錄，就可以來研發策略了，由於 Python 是個執行速度很慢的語言（比起 C、C++），所以我們不太使用 <a href="https://www.w3schools.com/python/python_for_loops.asp" target="_blank" rel="noreferrer noopener">for 迴圈</a> 來回測，而是用向量矩陣的方式產生訊號，<strong>速度會快很多</strong>，其中的「sma1」、「sma2」、「signal_long」、「signal_short」都是時間序列，下方為均線為範例，假如你不喜歡均線，<strong>可以參考 <a href="http://mrjbq7.github.io/ta-lib/" target="_blank" rel="noreferrer noopener">talib</a> 來製作你有興趣的技術指標喔</strong>！</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import talib

# compute simple moving average using talib
sma1 = talib.SMA(df.Close, timeperiod=20)
sma2 = talib.SMA(df.Close, timeperiod=60)

# compute buy and sell signals (golden cross and death cross)
signal_long = (sma1 > sma2) &amp; (sma1.shift() &lt; sma2.shift())
signal_short = (sma1 &lt; sma2) &amp; (sma1.shift() > sma2.shift())

# combine long and short signals
signal = signal_long.copy()
signal[signal_short] = -1</code></pre>



<p>程式碼看不懂嗎？沒關係，我們將這些時間序列 2020 年的數值繪製出來：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">df.Close['2020'].plot()
sma1['2020'].plot()
sma2['2020'].plot()
signal['2020'].astype(int).plot(secondary_y=True)</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="433" src="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.08.26-PM-1024x433.png" alt="Screen Shot 2020 07 29 at 12.08.26 PM" class="wp-image-1943" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.08.26-PM-1024x433.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.08.26-PM-300x127.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.08.26-PM-768x324.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.08.26-PM.png 1198w" sizes="(max-width: 1024px) 100vw, 1024px" title="台積電如何買？用 Python 研發投資策略 13"></figure>



<ul><li>藍色：df.Close &#8212;&#8211;&gt; 台積電的股價（一飛沖天！）</li><li>黃色：sma1 &#8212;-&gt; 20日均線</li><li>綠色：sma2 &#8212;-&gt; 60日均線</li><li>紅色：signal &#8212;-&gt; 買賣訊號</li></ul>



<p>接下來，我們就可以根據上圖中，<strong>紅色訊號為 1 時買入， -1 時賣出</strong>，這樣的的方式來交易，但是效果會如何呢？沒有人知道，所以我們還要進行「<strong>回測</strong>」，也就是將此策略放在歷史上模擬交易的報酬率！</p>



<h2>3. 回測和參數優化</h2>



<p>接下來我們就可以來測測看，究竟這樣子買台積電效果如何？我們可以用 backtesting 這個工具來幫我們回測，完整的程式碼如下，雖然有點長，但你會發現核心程式碼，跟剛剛是非常類似的！所以不用擔心太複雜！你也可以參考 <a href="https://github.com/kernc/backtesting.py" target="_blank" rel="noreferrer noopener">backtesting</a> 的官方教學，來獲得更詳細的用法喔！</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">from backtesting import Backtest, Strategy

class Strategy(Strategy):
    
    n1 = 20
    n2 = 60
    
    def init(self):
        super().init()
        
        # Precompute the two moving averages
        close = pd.Series(self.data.Close)
        sma1 = talib.SMA(close, timeperiod=self.n1)
        sma2 = talib.SMA(close, timeperiod=self.n2)

        # Precompute signal
        signal_long = (sma1 > sma2) &amp; (sma1.shift() &lt; sma2.shift())
        signal_short = (sma1 &lt; sma2) &amp; (sma1.shift() > sma2.shift())

        # combine signal
        signal = signal_long
        signal[signal_short] = -1
        
        # plot sma
        self.I(lambda x: sma1, 'sma1')
        self.I(lambda x: sma2, 'sma2')

        # set signal to trade
        self.signal = self.I(lambda x: signal, 'signal')

    def next(self):
        super().next()

        entry_size = self.signal[-1]

        if entry_size > 0:
            self.buy()
        elif entry_size &lt; 0:
          for trade in self.trades:
              trade.close()

bt = Backtest(df, Strategy)
result1 = bt.run()
bt.plot()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="571" src="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.13.35-PM-1024x571.png" alt="Screen Shot 2020 07 29 at 12.13.35 PM" class="wp-image-1944" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.13.35-PM-1024x571.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.13.35-PM-300x167.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.13.35-PM-768x428.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.13.35-PM-1536x856.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.13.35-PM-2048x1141.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="台積電如何買？用 Python 研發投資策略 14"></figure>



<p>上圖就是我們的回測結果，這是一個動態的圖表，所以我們可以將一部分放大：</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="571" src="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.20.57-PM-1024x571.png" alt="Screen Shot 2020 07 29 at 12.20.57 PM" class="wp-image-1946" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.20.57-PM-1024x571.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.20.57-PM-300x167.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.20.57-PM-768x428.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.20.57-PM-1536x856.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.20.57-PM-2048x1141.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="台積電如何買？用 Python 研發投資策略 15"></figure>



<p>上圖從上到下，總共有五個小圖，我們一張一張解釋：</p>



<p>圖一：為最後的總績效結果（藍色線段），代表策略的報酬率，從2000到現在可以獲利約400％，而當中的紅色水平線段，代表最久沒有創新高的時間段，這段時間可能會讓你懷疑，這個策略有沒有效果，而放棄策略，這段時間當然是越短越好！</p>



<p>圖二：有很多的三角形，假如是正三角就是做多，倒三角就是做空，我們這次寫的策略是做多的策略！所以不會有做空的倒三角喔！另外顏色代表獲利或是虧損，綠色為獲利，紅色為虧損，這些三角形的高度代表獲利或虧損的程度，以虛線做區分，虛線上方是獲利，而虛線下方式虧損，可以看到這種交易方法 2008 年以後每次虧損不會太多，獲利有時候還滿驚人的！</p>



<p>圖三是交易的明細，除了股價 K 棒外，我們也看到了兩條均線（藍色跟橘色），方便我們核對交易的時間，另外我們可以看到綠色和紅色的虛線，每一條虛線都代表一次交易，虛線的起始和結束，代表交易的價格跟時間，綠色代表獲利，而紅色代表虧損。</p>



<p>第四和第五張圖，則是成交量以及 signal 訊號，此策略就是模擬 signal 訊號為 1 時買進，而 -1 時賣出，比對其他圖片的數據，非常合理！</p>



<h3>策略效果不夠好？尋找最佳參數！</h3>



<p>剛剛我們用的均線是20日跟60日，來做交易，然而這是最好的均線嗎？我們可以將這兩個參數，當成策略的參數，分別叫 n1 和 n2 ，透過暴力枚舉（range(5, 200)），來從 5 到 200 裡面挑出 <a href="https://www.investopedia.com/terms/s/sharperatio.asp" target="_blank" rel="noreferrer noopener">Sharpe ratio</a> 比較好的參數：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">result2 = bt.optimize(n1=range(5, 200, 10),
                      n2=range(5, 200, 10))
result2._strategy</code></pre>



<pre class="wp-block-code"><code lang="python" class="language-python"># 程式碼顯示結果：
&lt;Strategy Strategy(n1=165,n2=5)></code></pre>



<p>以上，就是整個優化的過程，程式碼非常簡潔，最後優化完的數字是</p>



<ul><li>n1 = 165</li><li>n2 = 2</li></ul>



<p>眼尖的人會發現，奇怪怎麼長短週期倒過來了？代表我們死亡交叉買入，而黃金交叉賣出，這種交易比較像是均值回歸，在低點買，高點賣，屬於逆勢策略，我們用這兩個新的參數，來測測看結果如何？</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="578" src="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.32.06-PM-1024x578.png" alt="Screen Shot 2020 07 29 at 12.32.06 PM" class="wp-image-1952" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.32.06-PM-1024x578.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.32.06-PM-300x169.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.32.06-PM-768x434.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.32.06-PM-1536x867.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.32.06-PM-2048x1156.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="台積電如何買？用 Python 研發投資策略 16"></figure>



<p>雖然報酬率雖然比較低，但是交易的風險小滿多的，我們可以將順勢跟逆勢策略結合，獲得更穩定的報酬率，下方就是程式碼</p>



<pre class="wp-block-code"><code lang="python" class="language-python">((result1._equity_curve.Equity + 
result2._equity_curve.Equity)/2).plot()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="974" height="482" src="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.40.45-PM.png" alt="Screen Shot 2020 07 29 at 12.40.45 PM" class="wp-image-1954" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.40.45-PM.png 974w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.40.45-PM-300x148.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-29-at-12.40.45-PM-768x380.png 768w" sizes="(max-width: 974px) 100vw, 974px" title="台積電如何買？用 Python 研發投資策略 17"><figcaption>績效合併後的結果</figcaption></figure>



<p>基本上2008 到現在，沒什麼虧損過，台積電上漲時，會追蹤到漲幅，而下跌時也會危機入市，算是一個非常簡單，但績效很舒服的策略，分享給大家，現在就<a href="https://colab.research.google.com/drive/18U4QvoqH99450ixNBDKCm_ESqQW-slvr?usp=sharing" target="_blank" rel="noreferrer noopener">打開現成的 Colab 直接運行程式碼</a>。假如大家對於我們這樣的分享有興趣，可以幫我們推廣一下！我們也有其他類似的文章可以參考：</p>



<ul><li><a href="https://www.finlab.tw/low-risk-fft-spy-strategy/">低風險高報酬投資組合，股債平衡策略研發</a></li><li><a href="https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b8%ef%bc%9a%e5%a4%8f%e6%99%ae%e6%8c%87%e6%95%b8%e7%ad%96%e7%95%a5/">避開危險的投資時機 – 夏普指數策略</a></li><li><a href="https://www.finlab.tw/%e5%8a%a0%e9%80%9f%e5%ba%a6%e6%8c%87%e6%a8%99%e5%af%a6%e5%81%9a/">找出會加速的股票 &#8211; 加速度指標實做</a></li></ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/twii-2330-invest/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">1928</post-id>	</item>
		<item>
		<title>股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！</title>
		<link>https://www.finlab.tw/pb-data-analysis-explain/</link>
					<comments>https://www.finlab.tw/pb-data-analysis-explain/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Thu, 23 Jul 2020 00:03:00 +0000</pubDate>
				<category><![CDATA[基本面分析]]></category>
		<category><![CDATA[股票策略]]></category>
		<category><![CDATA[股價淨值比]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<category><![CDATA[資料分析]]></category>
		<category><![CDATA[量化投資]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=337</guid>

					<description><![CDATA[股價淨值比(PB)，可以用來判斷公司是被高估還是低估，簡單來說，有點像是股票的 CP 值（但是反著看），股價淨值比小於1代表划算的生意，大於1則是賠本生意。更深入一點的講法，就是公司「股市中的總價值」除以「實體的價值」，其中「股市中的總價值」就是股價X發行量，也就是市值。而「實體價值」就是指不動產 廠房及設備、債務...等的總價值，也就是資產負債相底後，真正留下的價值。]]></description>
										<content:encoded><![CDATA[
<p>股價淨值比(Price-Book Ratio PB)，可以用來判斷公司是被高估還是低估，也可以用來做出很厲害的選股策略！這篇文章會帶大家用數據來玩轉股價淨值比！讓你對股價淨值比「有感覺」！</p>



<h3>股價淨值比 PB 是什麼？</h3>



<p>簡單來說，股價淨值比像是股票的 CP 值。更深入一點的講法，就是</p>



<p>公司的「股市中的總價值」（市值） / 「資產負債的總價值」（淨值）</p>



<p>其中「股市中的總價值」就是股價乘以發行量，也就是市值。而「實體價值」就是指不動產 廠房及設備、債務&#8230;等的總價值，也就是資產負債相底後，真正留下的價值。也有人會寫成「股價/每股淨值」等於分子分母都除以股票發行量。</p>



<h4>股價淨值比也透露股票的「未來價值」</h4>



<p>投資人的樂觀與悲觀，都會影響 PB 的大小，當某當公司股票前景樂觀，投資人會預期公司營利，則股價推升，造成股價淨值比變高，然而反之投資人對公司前景悲觀，則股價淨值比會偏低。換句話說，股價淨值比就是投資人對於該公司的未來看好還是看壞，代表投資人對於該公司的「未來價值」的共識！</p>



<p>有了理論，還得有數據佐證，讓 FinLab 用最清晰的圖表分析，讓你對股價淨值筆的數值「有感覺」！以下就是 2020 年 6 月 30 號，台灣上市上櫃所有的公司，股價淨值比分佈圖：</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="505" src="https://34.80.70.15/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.40.18-PM-1024x505.png" alt="股價淨值比" class="wp-image-341" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.40.18-PM-1024x505.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.40.18-PM-300x148.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.40.18-PM-768x379.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.40.18-PM-1536x757.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.40.18-PM.png 1890w" sizes="(max-width: 1024px) 100vw, 1024px" title="股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！ 18"><figcaption>股價淨值比分佈圖</figcaption></figure>



<p>你可能會覺得奇怪，為什麼大部份的股票，股價淨值比都大於1呢？大部分股票都偏貴嗎？不是的，這是因為股票是先行反映了此公司的「未來價值」，一家公司只要有營收，就可以用來茁壯，就會成長，所以股價淨值比大於 1 並不會奇怪，因為公司規模都是從小慢慢養大的，反而小於 1 才奇怪，因為代表公司可能有一些財務問題，或是負面新聞導致的，所以看到一家公司股價淨值比低，不是貿然就買進，必須找到下跌的原因，並判斷是否對公司未來有長遠的影響，才能安心買進呀！</p>



<p>雖然股價淨值比低，代表投資人對於某檔股票悲觀，但好處是，你可以用更便宜的價格買到它！相反的，投資人對於股票價格過於樂觀，大家瘋搶，造成股價淨值比過高，暗示買入的價格可能太昂貴囉！</p>



<h3>用數據驗證坊間的謠傳</h3>



<p>坊間謠傳，股價淨值比越小越好，代表該股票買入成本很低，買的比較划算！為了驗證這個說法，可以來設計一個簡單的實驗試試看！</p>



<h4><strong>實驗素材</strong></h4>



<p>為了做一個實驗，必須取得以下的資料，進行回測：</p>



<ol><li><strong>股價淨值比</strong>：可以從<a rel="noreferrer noopener" href="https://www.twse.com.tw/zh/page/trading/exchange/BWIBBU_d.html" target="_blank">公開資訊觀測站</a>，來得到股價淨值比「每日」的數值，其算法的由來，就是由每日的「股價」除以最新季度財報中的「每股淨值」。</li><li><strong>盤後收盤價</strong>：除了上述股價淨值比，公開資訊觀測站還提供「<a rel="noreferrer noopener" href="https://www.twse.com.tw/zh/page/trading/exchange/MI_INDEX.html" target="_blank">每日收盤價</a>」，可以將2004年到現在的收盤價都抓下來。</li><li><strong>除權息歷史紀錄</strong>：雖然可以由收盤價的漲跌來算出報酬率，但是由於除權息的關係，報酬率會失真，所以額外需要「<a rel="noreferrer noopener" href="https://www.twse.com.tw/zh/page/trading/exchange/TWT49U.html" target="_blank">除權息歷史紀錄</a>」來計算調整後的收盤價，才能更準確反應報酬率。</li></ol>



<p>假如你覺得自己處理這些資料很麻煩，也可以參考FinLab的課程，裡面都有提供喔！（置入性行銷&#8230;嘿嘿）</p>



<p>但最簡單的方法，還是使用我們所提供的 <a href="https://www.finlab.tw/%e5%8f%b0%e7%81%a3%e8%82%a1%e5%b8%82%e6%9c%80%e5%bc%b7%e7%9a%84-python-package/" data-type="URL" data-id="https://www.finlab.tw/%e5%8f%b0%e7%81%a3%e8%82%a1%e5%b8%82%e6%9c%80%e5%bc%b7%e7%9a%84-python-package/">FinLab Package</a> 啦！</p>



<h4>回測設計</h4>



<ul><li>回測時間：從2000年到2020年</li><li>換股頻率：每一季度（&#8217;03-31&#8242;, &#8217;06-30&#8242;, &#8217;09-30&#8242;, &#8217;12-31&#8217;）</li><li>選股策略：將所有上市上櫃的股票，股價淨值比由小到大，分成均衡數量五等份，第一個投資組合的是股價淨值比小於 20％的股票，而第二種策略則是 股價淨值比介於 20％～40％的股票，以此類推。</li></ul>



<figure class="wp-block-image size-large"><img loading="lazy" width="700" height="450" src="https://34.80.70.15/wp-content/uploads/2020/07/newplot-4.png" alt="newplot 4" class="wp-image-338" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/newplot-4.png 700w, https://www.finlab.tw/wp-content/uploads/2020/07/newplot-4-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" title="股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！ 19"><figcaption>五組股票不同的報酬率</figcaption></figure>



<p>這張圖的 Y 軸是從 2004 年開始投資，資產的倍數變化圖，可以發現股價淨值比低於全體的 20% 的股票組合（藍色），真的比其他組合的報酬率來要好，但這邊的回測是一群股票的整體結果，由於樣本數量夠大，才能發現這樣的現象。</p>



<h4>究竟股價淨值比選多少比較安全呢？</h4>



<p>結合上述的實驗結果，可以做圖繪製出「每段時間的股價淨值比中位數」：</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="484" src="https://34.80.70.15/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.29.02-PM-1024x484.png" alt="Screen Shot 2020 07 03 at 6.29.02 PM" class="wp-image-340" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.29.02-PM-1024x484.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.29.02-PM-300x142.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.29.02-PM-768x363.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.29.02-PM-1536x726.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-03-at-6.29.02-PM.png 1996w" sizes="(max-width: 1024px) 100vw, 1024px" title="股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！ 20"><figcaption>上市上櫃股價淨值比中位數</figcaption></figure>



<p>由上圖中可以發現，股價淨值比的中位數是「隨時間浮動的」！也就是，當牛市時，全體國民瘋搶股票，造成很多雞蛋水餃股，股價莫名其妙衝很高；另外當熊市時，很多很多股票都被打回原形，造成股價淨值比中位數來到 1 左右，甚至在 2008 金融海嘯時，比 1 還小！所以股價淨值比的高低是「相對的」，也就是說，股價淨值比小於 1.5 不帶表划算，例如當金融海嘯時，超過一半的股票 PB 都小於 0.7，所以<strong><em>不能用絕對的數值來判斷股價淨值比</em></strong>，而是用相對、浮動的百分比，會比較妥當喔！到底要怎麼用來選股，賣個關子，看到最後再告訴你。</p>



<h3>選股價淨值比低的股票，報酬會不會不穩定呢？</h3>



<p>正如剛剛所提及，股價淨值比小於 1 的股票，代表投資人對其公司前景不看好，或沒人關注，那當金融海嘯發生時，這些淨值低的股票，會不會有倒閉的風險呢？為了回答這個問題，像剛剛一樣，將股票的股價淨值比從小到大，切成五等份，持有一個季度，並衡量每個季度的報酬率：</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="471" src="https://34.80.70.15/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-12.55.44-AM-1024x471.png" alt="Screen Shot 2020 07 04 at 12.55.44 AM" class="wp-image-344" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-12.55.44-AM-1024x471.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-12.55.44-AM-300x138.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-12.55.44-AM-768x353.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-12.55.44-AM-1536x707.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-12.55.44-AM-2048x942.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！ 21"><figcaption>股價淨值比從小到大分成五份，持有一季的報酬率</figcaption></figure>



<p>上圖 Y 軸是報酬率，0.1 代表賺 10% 的意思。你會發現，當股價淨值比小的股票組合（PB &lt; 20%，上圖藍色），在2007年股市泡沫時，有異常很好的表現（圖中最高的藍色棒子），報酬率來到了50％/季，畢竟大家熱炒一波，便宜股雞犬升天，變成高價股，是很正常的！那下跌的時候呢？可以看到當 2008 年下跌時，低股價淨值比的股票並沒有跌得很嚴重！為什麼會這樣呢？</p>



<h3>照理說不被看好的股票應該會跌的更嚴重吧？</h3>



<p>還記得剛剛所提及的「股價淨值比中位數」嗎？由於金融海嘯時，股價淨值比中位數（50％）來到了 0.7 這麼小，更何況是小於 20％ 的股票，據統計，2008年股價淨值比 20％ 的絕對數值，只剩下 0.39 ！也就是股價淨值比低於 0.39 才有可能被選入持股中，相信這些股票是已經跌到「跌無可跌」的地步了吧！</p>



<p>所以我們就要選擇低股價淨值比的股票囉？等等&#8230;別著急，先來看看</p>



<h3>低股價淨值比的股票 &#8211; 近年表現如何？</h3>



<p>上面的圖表，是考慮了 2008 年金融海嘯時的狀況，那假如是近幾年呢？近幾年的報酬率表現如下：</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="467" src="https://34.80.70.15/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-1.11.11-AM-1024x467.png" alt="Screen Shot 2020 07 04 at 1.11.11 AM" class="wp-image-345" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-1.11.11-AM-1024x467.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-1.11.11-AM-300x137.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-1.11.11-AM-768x350.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-1.11.11-AM-1536x700.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-1.11.11-AM.png 2040w" sizes="(max-width: 1024px) 100vw, 1024px" title="股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！ 22"><figcaption>股價淨值比每一季的表現</figcaption></figure>



<p>上圖中可以發現，在 2017 年和 2018 年，低股價淨值比，也就是藍色代表的報酬率，明顯高於其他的股票，但是 2019 和 2020 年則沒有表現得特別好，甚至在這次疫情下，下跌的最多，而反彈的卻不夠多！大致上來說，可以發現 2019 年以後 股價淨值比的表現並沒有特別突出或是特別差，變成一個比較中性的指標。</p>



<h2>為何股價淨值比，在 2020 疫情期間表現不好？</h2>



<p>總結了以下三點，說明股價淨值比近期表現不太理想的原因：</p>



<ul><li>股價淨值比越來越多人使用，市場效率變高，這個指標越來越不顯著。</li><li>在 2013 年、2004 年 也出現過股價淨值比失效的狀況，也可以說每一種指標，都有失效的時候，不是全年無休一直都有效果，說不定之後又生效了也不一定。</li><li>但很大的因素，是因為疫情之下，上漲的都是生技股，而生技股的股價淨值比，由於體質關係，本來就會高於平均的緣故，例如以 2020 年 6 月 30 號的統計，技股平均股價淨值比：3.07，遠高於整體的平均：2.2，由於領漲的都是生技股，所以自然「高股價淨值比」看起來報酬率比較好。</li></ul>



<p>由上述結論其實可以看出，選股其實也很偏重題材的，畢竟只要題材有了，股價淨值比也是可以忽略不計，當作沒看到都可以！然而假如想要建立一個長久有效的選股模型，相信股價淨值比是不會被取代的，相信時間會還給股價淨值比一個公道。</p>



<h3>低股價淨值比策略實戰</h3>



<p>有用的策略，只要一句話就瞭解：</p>



<blockquote class="wp-block-quote"><p><strong><em>找出股票價格大於5，股價在季線之上，且（股價淨值比 X 股價） 最小的20檔股票，持有一個季度</em></strong></p><cite>FinLab 策略庫</cite></blockquote>



<p><strong>太簡單了吧！？</strong>就是要這麼簡單呀！</p>



<p>有時候，投資搞太複雜，看完型態學，又分析價量，再觀察籌碼分析，最後還是被自己的人性所打敗。這樣盲目照著各方說法操作，只會讓你覺得股市就像大海，載浮載沈。FinLab 主張，策略簡單，邏輯粗暴，無腦複製，讓你有時間多陪陪自己的家人，多出去戶外運動。投資不複雜，<strong><em>複雜的是人心，也就是看到這篇文章，卻沒有行動的你。</em></strong></p>



<p>回測後，結果如下圖所示，這是一個非常簡單的策略，一年調整四次，卻可以有非常可觀的歷史報酬率（ 2000 至今有 2000％！），美中不足的是， 2004 年跟 2008 年大跌，最大跌幅（maximum drawdown）來到了 &#8211; 60%，另外，這個策略所買的股票，成交量很小，所以餵納量可能不夠大，假如你的資本太大的話，可能會不適用。假如你手邊資金小，那此策略應該是，可以用<a rel="noreferrer noopener" href="https://www.cmoney.tw/vt/" target="_blank">股市大富翁</a>試試看此策略！至於避開大盤大跌的方法，就讓我留到下一篇吧！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="612" src="https://34.80.70.15/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-2.24.04-AM-1024x612.png" alt="Screen Shot 2020 07 04 at 2.24.04 AM" class="wp-image-347" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-2.24.04-AM-1024x612.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-2.24.04-AM-300x179.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-2.24.04-AM-768x459.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-2.24.04-AM-1536x918.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/Screen-Shot-2020-07-04-at-2.24.04-AM.png 1616w" sizes="(max-width: 1024px) 100vw, 1024px" title="股價淨值比能找到好股票？用歷史數據讓你感受它的厲害！ 23"><figcaption>策略回測結果</figcaption></figure>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/pb-data-analysis-explain/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">337</post-id>	</item>
		<item>
		<title>好用Package：用ffn分析時間序列</title>
		<link>https://www.finlab.tw/ffn-intro/</link>
					<comments>https://www.finlab.tw/ffn-intro/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 23:53:54 +0000</pubDate>
				<category><![CDATA[PYTHON財經]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=922</guid>

					<description><![CDATA[Pandas 的 DataFrame 可以很方變得幫我們處理時間序列，只需要短短幾行，就能達到在其他程式語言要寫數十行的功能，但是DataFrame就夠了嗎？當我們在處理財務金融時，常常會需要分析時間序列（例如股價）但是有時候用dataframe來計算，還是免不了寫一些數學計算，增加程式碼的複雜度，讓閱讀程式碼變得比較辛苦。]]></description>
										<content:encoded><![CDATA[
<p>Pandas 的 DataFrame 可以很方便的幫我們處理時間序列，只需要短短幾行，就能達到在其他程式語言要寫數十行的功能。</p>



<h3 id="但是DataFrame就夠了嗎？">但是DataFrame就夠了嗎？</h3>



<p>當我們在處理財務金融時，常常會需要分析時間序列（例如股價），雖然我們可能都知道什麼是maximum dropdown、什麼是sharp ratio，什麼是daily<br>return，但是有時候用dataframe來計算，還是免不了寫一些數學計算，增加程式碼的複雜度，讓閱讀程式碼變得比較辛苦。</p>



<h3 id="救星：ffn-Financial-Functions-for-Python">救星：ffn (Financial Functions for Python)</h3>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="570" src="http://34.96.136.135/wp-content/uploads/2020/07/th-1024x570.png" alt="th" class="wp-image-924" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/th-1024x570.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/th-300x167.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/th-768x427.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/th-1536x855.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/th.png 1826w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 24"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/th.png"></a></p>



<p>所以這時候，你的救星就出現了，叫做 <a href="https://pmorissette.github.io/ffn/" rel="noreferrer noopener" target="_blank">ffn</a>，ffn是一個分析時間序列的package，只要 import ffn，你的 dataframe 就會瞬間多了很多能力！接下來我們就來看看是什麼能力吧！</p>



<p>這次的程式碼都會在<a href="https://colab.research.google.com/drive/1lzqgK-ERM4bH5GYRyQNPURBhFKhQ9x6q" rel="noreferrer noopener" target="_blank">google colab</a>上，大家可以直接打開網頁就開始跟我們一起玩耍吧！</p>



<p>首先，我們必須要先安裝ffn，安裝的方式非常的直覺：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">!pip install ffn</code></pre>



<p>這樣就安裝好囉！上式中的驚嘆號代表我們將這段command line語法，輸入在jupyter來安裝，這又就不需要額外再開啟terminal了！</p>



<p>安裝好了之後我們就可以開始寫程式囉！</p>



<h3 id="利用ffn取得股價">利用ffn取得股價</h3>



<p>有了ffn我們可以很輕易的取得多檔股票的股價，ffn的底層是使用yahoo api，所以同樣也可以抓台股或其他國際股市喔！</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import ffn

prices = ffn.get('2330.TW, 1101.TW')
prices.head()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="514" src="http://34.96.136.135/wp-content/uploads/2020/07/1-2-1-1024x514.png" alt="1 2 1" class="wp-image-925" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/1-2-1-1024x514.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-1-300x150.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-1-768x385.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-1.png 1340w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 25"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/1.png"></a></p>



<p>可以發現這個股價的格是就是我們熟悉的dataframe耶！所以我們一樣可以使用一些dataframe既有的功能，例如「.plot」來繪圖：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">prices.plot()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="567" src="http://34.96.136.135/wp-content/uploads/2020/07/2-3-1-1024x567.png" alt="2 3 1" class="wp-image-926" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/2-3-1-1024x567.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-1-300x166.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-1-768x425.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-1.png 1330w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 26"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/2.png"></a></p>



<p>繪完圖後發現，雖然我們可以比較「2330」台積電，跟「1101」台泥的股價，但是他們的起始股價是不一樣的，所以無從比較報酬率。</p>



<p>想要比較報酬率，我們可以用「ffn」新增的額外功能「rebase」：</p>



<h3 id="ffn提供的functions">ffn提供的functions</h3>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">prices.rebase().plot()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="540" src="http://34.96.136.135/wp-content/uploads/2020/07/3-4-1-1024x540.png" alt="3 4 1" class="wp-image-927" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/3-4-1-1024x540.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/3-4-1-300x158.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/3-4-1-768x405.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/3-4-1.png 1340w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 27"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/3.png"></a>這樣就可以讓股價的起始值相同囉！這是ffn提供的眾多功能之一，但你不用額外學一個新的資料表示法，而是直接對dataframe操作就可以了！所以說ffn有點像是dataframe的補充包，讓我們來看看還有哪些好用的功能吧！</p>



<h3 id="下跌幅度">下跌幅度</h3>



<p>我們可以藉由ffn來計算並比較dropdown，也就是比較虧損的幅度：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">prices.to_drawdown_series().plot()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="542" src="http://34.96.136.135/wp-content/uploads/2020/07/4-3-1-1024x542.png" alt="4 3 1" class="wp-image-928" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/4-3-1-1024x542.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/4-3-1-300x159.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/4-3-1-768x406.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/4-3-1.png 1334w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 28"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/4.png"></a></p>



<p>或是我們之前教過的heatmap，也一行就搞定了</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">prices.plot_corr_heatmap()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="596" src="http://34.96.136.135/wp-content/uploads/2020/07/5-3-1-1024x596.png" alt="5 3 1" class="wp-image-929" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/5-3-1-1024x596.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-1-300x175.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-1-768x447.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-1.png 1344w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 29"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/5.png"></a></p>



<p>最後我們也可以來計算這兩檔股票的歷史數據分析：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">stats = prices.calc_stats()
stats.display()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="699" src="http://34.96.136.135/wp-content/uploads/2020/07/6-3-1-1024x699.png" alt="6 3 1" class="wp-image-930" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/6-3-1-1024x699.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/6-3-1-300x205.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/6-3-1-768x524.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/6-3-1.png 1324w" sizes="(max-width: 1024px) 100vw, 1024px" title="好用Package：用ffn分析時間序列 30"></figure></div>


<p><a href="https://www.finlab.tw/ffn-intro/6.png"></a></p>



<p>這個輕量級的package有很多簡單的語法，可以快速幫助我們進行報酬率的分析<br>而且所有的功能都是使用dataframe擴增，所以不用擔心要學新的結構，滿小巧可愛的！大家可以安裝起來玩玩看喔！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/ffn-intro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">922</post-id>	</item>
		<item>
		<title>ROE怎麼看? 機器學習告訴你！</title>
		<link>https://www.finlab.tw/roe%e6%80%8e%e9%ba%bc%e7%9c%8b-%e6%a9%9f%e5%99%a8%e5%ad%b8%e7%bf%92%e5%91%8a%e8%a8%b4%e4%bd%a0/</link>
					<comments>https://www.finlab.tw/roe%e6%80%8e%e9%ba%bc%e7%9c%8b-%e6%a9%9f%e5%99%a8%e5%ad%b8%e7%bf%92%e5%91%8a%e8%a8%b4%e4%bd%a0/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 23:05:39 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[MACHINE LEARNING]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[機器學習]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=794</guid>

					<description><![CDATA[機器學習究竟能不能輔助人類買賣股票？答案一定是可以的，我們可以藉由機器學習歸納出結果，來優化我們的選股方式，今天這篇文章沒有非常高深的數學，也沒有困難的程式，只會有做完研究的心得，幫助大家選股更順利！]]></description>
										<content:encoded><![CDATA[
<p>機器學習究竟能不能輔助人類買賣股票？答案一定是可以的，我們可以藉由機器學習歸納出結果，來優化我們的選股方式，今天這篇文章沒有非常高深的數學，也沒有困難的程式，只會有做完研究的心得，幫助大家選股更順利！<br><a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/thumbnail.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="669" src="http://34.96.136.135/wp-content/uploads/2020/07/thumbnail-1-5-1024x669.png" alt="thumbnail 1 5" class="wp-image-796" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-1-5-1024x669.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-1-5-300x196.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-1-5-768x502.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-1-5.png 1518w" sizes="(max-width: 1024px) 100vw, 1024px" title="ROE怎麼看? 機器學習告訴你！ 31"></figure></div>



<p>這篇文章中，我把市值跟ROE拿來做比較，並且利用SVM來訓練判斷，看看市值跟ROE對於股價漲跌的關連！</p>



<h3 id="什麼是SVM？">什麼是SVM？</h3>



<p>SVM的全名叫做&nbsp;<a href="https://en.wikipedia.org/wiki/Support_vector_machine" rel="noreferrer noopener" target="_blank">Support Vector Machine</a>，而這類的機器學習，會用 hyperplane 將空間切開，進而將空間中的座標進行分類，所以當我們有2個features時，就可以將第一個feature當作 x 軸，第二個 feature 當作 y 軸，然後顏色代表漲跌，畫出一張圖：<a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/svm.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="356" src="http://34.96.136.135/wp-content/uploads/2020/07/svm-1024x356.png" alt="svm" class="wp-image-797" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/svm-1024x356.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/svm-300x104.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/svm-768x267.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/svm-1536x534.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/svm.png 1560w" sizes="(max-width: 1024px) 100vw, 1024px" title="ROE怎麼看? 機器學習告訴你！ 32"></figure></div>



<p>其中的綠色點，就是代表下跌的股票，而紅色的點，則代表了上漲的股票，而hyperplane 就是黃色的時線，將這個平面上畫出精準的一刀，切成兩個部分，右半部份，代表SVM覺得未來會上漲，左半部份代表SVM覺得未來會下跌的股票。</p>



<p>以上是由視覺的方式來說明SVM，數學的部分，其實大家國中高中都有學過，其實就是點與 hyperplane 的長度，SVM會計算「點到線」之間的長度，來決定誤差。當有越多點歸類錯誤的時候，SVM就會將這些「點到線的距離加總」，當作是錯誤總分，越大越不好，於是演算法不斷的移動這個切割線（hyperplane），來達到最完美的狀態，使得錯誤總分最低。</p>



<h3 id="SVM-的-Kernel-Trick">SVM 的 Kernel Trick</h3>



<p>我們上述的都是一條直線的 hyperplane ，但其實它不一定得是直的，只要能夠切分出不同的區域來分類即可。下圖就是使用linear的kernel跟曲線的kernel的範例：<a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/kernel.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="345" src="http://34.96.136.135/wp-content/uploads/2020/07/kernel-1-1024x345.png" alt="kernel 1" class="wp-image-799" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/kernel-1-1024x345.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/kernel-1-300x101.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/kernel-1-768x259.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/kernel-1.png 1234w" sizes="(max-width: 1024px) 100vw, 1024px" title="ROE怎麼看? 機器學習告訴你！ 33"></figure></div>



<p>接下來，我們就來使用不同的kernel，來將股票做歸類，看它們究竟會上漲還是下跌？我們所使用的 features 只有：ROE、市值<br>方便我們以圖形化的方式呈現並理解，以下是結果：</p>



<h3 id="使用線性的kernel">使用線性的kernel</h3>



<p>此時 hyperplane 就是很簡單的一條線。雖然是簡單的一條線，但它還是非常有用處，我們可以藉由這條線的斜率，來瞭解 ROE 跟市值的關係：<a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/linear.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="548" src="http://34.96.136.135/wp-content/uploads/2020/07/linear-1-1024x548.png" alt="linear 1" class="wp-image-801" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/linear-1-1024x548.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/linear-1-300x160.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/linear-1-768x411.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/linear-1.png 1234w" sizes="(max-width: 1024px) 100vw, 1024px" title="ROE怎麼看? 機器學習告訴你！ 34"></figure></div>



<p>程式自動最佳化後，上圖就是程式找到一刀最完美的切法，</p>



<ul><li>黃色三角形為上漲的股票</li><li>藍色正方形為下跌的股票</li><li>黃色平面是SVM認為會上漲的股票</li><li>藍色平面是SVM認為會下跌的股票</li></ul>



<p>這邊的市值跟ROE都已經經過preprocessing，所以跟我們平常看到的數值不太一樣，我們由上圖可以看出程式在想什麼：</p>



<h4 id="機器學習：市值越高的股票，ROE也要越高">機器學習：市值越高的股票，ROE也要越高</h4>



<p>可以看到上圖中，斜率是正的，代表當市值越高時，SVM 會傾向於選擇 ROE 高一點的股票，而且此條線偏上方，代表ROE比較高比較好，所以我們可以做一些歸納；</p>



<h4 id="假如有一檔股票「市值高，但是ROE低」，不會被選進來">假如有一檔股票「市值高，但是ROE低」，不會被選進來</h4>



<p>這樣的想法算滿合理的，因為大家對市值高的股票期望比較高，或是公司的規模比較大，但此公司坐擁資源竟然還沒辦法為股東賺錢，於是期望可能轉換為失望，所以SVM表示看跌。</p>



<p>當然這個理由是我自己加的，SVM 是無情的最佳化結果而已。<br>另外我們也可以看到：</p>



<h4 id="對於「市值低，ROE低」的公司，SVM會比較寬容">對於「市值低，ROE低」的公司，SVM會比較寬容</h4>



<p>一檔「市值低，ROE低」的公司，SVM會比較寬容一些些（但還是有一定的門檻）只是不如市值高的公司那麼嚴苛罷了。</p>



<p>我們來看一下以此種邏輯回測的結果，紅色為預測會漲的股票，綠色為預測會跌的股票，每季獲利的平均<a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/eq1.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="375" height="242" src="http://34.96.136.135/wp-content/uploads/2020/07/eq1-1-1.png" alt="eq1 1 1" class="wp-image-802" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/eq1-1-1.png 375w, https://www.finlab.tw/wp-content/uploads/2020/07/eq1-1-1-300x194.png 300w" sizes="(max-width: 375px) 100vw, 375px" title="ROE怎麼看? 機器學習告訴你！ 35"></figure></div>



<p>效果很不錯，但是這個邏輯是否是完美的呢？<br>我們再來使用不同的kernel，試試看：</p>



<h3 id="使用曲線的kernel">使用曲線的kernel</h3>



<p>下圖為使用不同的kernel，所做出來的分類結果，我們使用2次多項式來對股票進行分類：<a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/poly.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="539" src="http://34.96.136.135/wp-content/uploads/2020/07/poly-1024x539.png" alt="poly" class="wp-image-803" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/poly-1024x539.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/poly-300x158.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/poly-768x404.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/poly.png 1224w" sizes="(max-width: 1024px) 100vw, 1024px" title="ROE怎麼看? 機器學習告訴你！ 36"></figure></div>



<p>怎麼分出來完全不一樣呀！我們來看第二個實驗，SVM又告訴了我們什麼：</p>



<h4 id="市值高的股票-ROE-不要太高">市值高的股票 ROE 不要太高</h4>



<p>這其實還是有些道理的，ROE 太高的股票不要買，這個是很多實驗都有做出來的結果，因為大公司的獲利，好歹也是龐大而穩定的系統，ROE高是會有上限的，不可能一直成長，當今天ROE已經很高時，代表接下來不會更高了，甚至還有可能會衰退。</p>



<p>所以買市值高的股票時，SVM傾向「ROE 不要太高」！</p>



<h4 id="市值低的股票-ROE-越高越好">市值低的股票 ROE 越高越好</h4>



<p>然而本實驗的另一個特點，就是SVM統計出來，發現市值低的股票ROE高是沒有關係的，至於原因可能是因為，市值低的股票，大家對於該公司期望並不高，在此狀況下，高 ROE 的數值跌破大家的眼鏡，所以造成長期的後市看好。（只是推測）</p>



<p>所以買市值低的股票時，SVM傾向「ROE 盡量高一點」！</p>



<h4 id="市值中間的股票，不要買">市值中間的股票，不要買</h4>



<p>這個條件是最詭異的一個，我還是不要亂解釋好了XDD。</p>



<h3 id="回測結果">回測結果</h3>



<p>這樣的邏輯可以獲利嗎？我們可以看以下的結果，紅色為持有預測會漲的股票，綠色為持有預測會跌的股票，每季獲利的平均：<a href="https://www.finlab.tw/ROE%E6%80%8E%E9%BA%BC%E7%9C%8B-%E6%A9%9F%E5%99%A8%E5%AD%B8%E7%BF%92%E5%91%8A%E8%A8%B4%E4%BD%A0/eq2.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="375" height="242" src="http://34.96.136.135/wp-content/uploads/2020/07/eq2-4.png" alt="eq2 4" class="wp-image-804" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/eq2-4.png 375w, https://www.finlab.tw/wp-content/uploads/2020/07/eq2-4-300x194.png 300w" sizes="(max-width: 375px) 100vw, 375px" title="ROE怎麼看? 機器學習告訴你！ 37"></figure></div>



<p>也是有不錯的獲利！<br>利用 SVM 來分辨漲跌的股票，真的還滿有趣的，本文利用了兩種不同的 kernel：</p>



<ul><li>linear</li><li>polynomial<br>來進行分類，結果顯示 linear 的分類，跑出來的回測獲利比較優秀，但由這兩種不同的kernel，製作出來的模型，都可以拿來獲利。</li></ul>



<p>雖然兩個模型的闡述「相互矛盾」「有點道理、但又有點詭異」，就像是投資界眾說紛紜的理論一樣，所以以後看到相互矛盾的論點，其實不一定誰好誰壞，甚至說不定都能夠獲利，這就是股票市場的有趣之處。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/roe%e6%80%8e%e9%ba%bc%e7%9c%8b-%e6%a9%9f%e5%99%a8%e5%ad%b8%e7%bf%92%e5%91%8a%e8%a8%b4%e4%bd%a0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">794</post-id>	</item>
		<item>
		<title>Python新手教學(Part 2)：全球指數一次抓</title>
		<link>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e4%b8%80%e6%ac%a1%e6%8a%93/</link>
					<comments>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e4%b8%80%e6%ac%a1%e6%8a%93/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 07:05:39 +0000</pubDate>
				<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[爬蟲]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=851</guid>

					<description><![CDATA[我們已經知道怎麼抓取任意一檔股票歷史價格了，但有時候我們一次需要很多檔股票，怎麼辦呢？難道每個股票我們都要寫這麼多行，才能抓下來嗎？今天我們教你如何將上一次的功能包裝成 function，然後一次下載全球指數！]]></description>
										<content:encoded><![CDATA[
<p>我們已經知道怎麼抓取任意一檔股票歷史價格了，但有時候我們一次需要很多檔股票，怎麼辦呢？難道每個股票我們都要寫這麼多行，才能抓下來嗎？今天我們教你如何將上一次的功能包裝成 function，然後一次下載全球指數！<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E4%B8%80%E6%AC%A1%E6%8A%93/thumbnail.png"></a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="679" src="http://34.96.136.135/wp-content/uploads/2020/07/thumbnail-5-2-1024x679.png" alt="thumbnail 5 2" class="wp-image-853" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-2-1024x679.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-2-300x199.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-2-768x510.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-2-1536x1019.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-2.png 1664w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 2)：全球指數一次抓 38"></figure></div>


<h3 id="上次的程式碼爬取台積電">上次的程式碼爬取台積電</h3>



<p>首先，我們上次已經教了怎麼樣爬取一檔股票：「台積電2330」，這次我們重新複習一下，下方的程式，假如有任何一個部分忘記了，都可以去<a href="https://www.finlab.tw/%E7%94%A8%E7%88%AC%E8%9F%B2%E7%88%AC%E5%85%A8%E4%B8%96%E7%95%8C%E8%82%A1%E5%83%B9/">前一個單元</a>複習喔！</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import yfinance as yf

df = yf.Ticker("2330.TW").history(period="max")
df</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="443" src="http://34.96.136.135/wp-content/uploads/2020/07/1-2-1024x443.png" alt="1 2" class="wp-image-854" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/1-2-1024x443.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-300x130.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-768x332.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-1536x664.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/1-2-2048x885.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 2)：全球指數一次抓 39"></figure></div>


<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E4%B8%80%E6%AC%A1%E6%8A%93/1.png"></a></p>



<p>但是以上的程式碼只能爬「台積電」的股價，我想要爬其他的指數怎麼辦呢？</p>



<h3 id="將上述程式碼打包成function">將上述程式碼打包成function</h3>



<p>我們可以用<code>function</code>將上面的程式碼打包起來，方便我們多次使用，變成下面這樣，其實跟之前長的非常像，可以先比較一下：首先，第一行多了<code>def crawl_price(stock_id):</code>，這行的意思就是宣告一個可呼叫的程式區塊，叫做<code>crawl_price(stock_id)</code>，再來，原本的程式碼前方都被加了4個空白格，代表這些功能是同一個<code>function</code>中被執行的代碼。</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import yfinance as yf

def crawl_price(stock_id):
  df = yf.Ticker(stock_id).history(period="max")
  return df

</code></pre>



<p>上面的代碼中，有個特別可以注意的變數：<code>stock_id</code>，當今天<code>stock_id</code>被傳進<code>function</code>中的時候，url就會隨著<code>stock_id</code>的不同，而出現不同的<code>url</code>所以我們就可以爬到不同的股票歷史股價！</p>



<p>既然我們已經寫好了此<code>function</code>，接下來就可以呼叫它，得到不同股票的歷史股價</p>



<h3 id="使用function">使用function</h3>



<p>假如以後我們需要爬取不同的股票，例如「鴻海2354」，我們就可以寫：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">df = crawl_price("2354.TW")
df.Close.plot()</code></pre>



<p>就可以順利將鴻海的股票爬取下來喔！<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E4%B8%80%E6%AC%A1%E6%8A%93/2.png"></a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="536" src="http://34.96.136.135/wp-content/uploads/2020/07/2-2-1024x536.png" alt="2 2" class="wp-image-855" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/2-2-1024x536.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/2-2-300x157.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/2-2-768x402.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/2-2-1536x804.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/2-2-2048x1072.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 2)：全球指數一次抓 40"></figure></div>


<p>接下來我們就來爬取世界上重要的指數吧！</p>



<h3 id="國際重要指數清單">國際重要指數清單</h3>



<p>首先我們必須要爬取到國際重要指數清單，可以到以下網址來獲取：<br><a href="https://finance.yahoo.com/world-indices/" rel="noreferrer noopener" target="_blank">https://finance.yahoo.com/world-indices/</a><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E4%B8%80%E6%AC%A1%E6%8A%93/3.png"></a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="568" src="http://34.96.136.135/wp-content/uploads/2020/07/3-1-2-1024x568.png" alt="3 1 2" class="wp-image-857" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/3-1-2-1024x568.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/3-1-2-300x167.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/3-1-2-768x426.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/3-1-2-1536x853.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/3-1-2-2048x1137.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 2)：全球指數一次抓 41"></figure></div>


<p>接下來我們就可以將上述清單給手動複製起來？！<br>不，我們要用更炫的方法，當然是要用程式來爬呀：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">url = "https://finance.yahoo.com/world-indices/"
response = requests.get(url)

import io
f = io.StringIO(response.text)
dfs = pd.read_html(f)
world_index = dfs[0]</code></pre>



<p>上述的程式碼，剛開始很簡單，就是用<code>requests.get</code>來獲取此網頁的資料，網頁中的資料都存在<code>response.text</code>中，跟之前一模一樣。</p>



<p>不過第5行有點不一樣，我們使用<code>io.StringIO(response.text)</code>將資料存成檔案<code>f</code><br>第6行，我們將此文件利用<code>pd.read_html(f)</code>來分析網頁<code>f</code>中的表格，將所有的表格存成 a list of dataframe<br>第7行，我們將第一張dataframe給拿出來。<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B82%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E4%B8%80%E6%AC%A1%E6%8A%93/4.png"></a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="435" src="http://34.96.136.135/wp-content/uploads/2020/07/4-1-2-1024x435.png" alt="4 1 2" class="wp-image-859" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/4-1-2-1024x435.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/4-1-2-300x128.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/4-1-2-768x327.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/4-1-2-1536x653.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/4-1-2-2048x871.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 2)：全球指數一次抓 42"></figure></div>


<p>這樣我們就有了此表格中的symbol和name，以供之後歷史股價的爬取</p>



<p>這個單元的程式碼範例，都可以<a href="https://colab.research.google.com/drive/1TxyeRy6ukAhrJ10x80YoIoYTChd4EUEQ?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">在colab上直接運行</a>喔！趕快來跑跑看吧！</p>



<h3 id="最後，終於要爬取全球股價了！">最後，終於要爬取全球股價了！</h3>



<p>萬事俱備！只欠東風，不過由於這次的教學已經很多了，所以大家可以自己練習看看，或是前往<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/">下一個單元</a>，來爬取所有的歷史指數吧！</p>



<p>這一系列是我們影音課程的化簡版，<br>假如對此教程有興趣，歡迎點選下方影音課程，會豐富到炸裂喔～</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e4%b8%80%e6%ac%a1%e6%8a%93/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">851</post-id>	</item>
		<item>
		<title>Python新手教學(Part 3)：全球指數歷史數據下載大全</title>
		<link>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b83%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e6%ad%b7%e5%8f%b2%e6%95%b8%e6%93%9a/</link>
					<comments>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b83%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e6%ad%b7%e5%8f%b2%e6%95%b8%e6%93%9a/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 07:05:39 +0000</pubDate>
				<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[爬蟲]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=861</guid>

					<description><![CDATA[這個單元我們要利用 for 迴圈將所有的歷史數據爬下來，並且繪製所有的歷史股價。我們也會介紹一些 for 迴圈的進階技巧，並且將這些技巧結合起來，完成這次的功能，想要學習python，就慢慢跟著我們一步一步來吧！]]></description>
										<content:encoded><![CDATA[
<p>這個單元我們要利用 for 迴圈將所有的歷史數據爬下來，並且繪製所有的歷史股價。我們也會介紹一些 for 迴圈的進階技巧，並且將這些技巧結合起來，完成這次的功能，想要學習python，就慢慢跟著我們一步一步來吧！<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/thumbnail.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="679" src="http://34.96.136.135/wp-content/uploads/2020/07/thumbnail-5-4-1024x679.png" alt="thumbnail 5 4" class="wp-image-864" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-4-1024x679.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-4-300x199.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-4-768x510.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-4-1536x1019.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-5-4.png 1664w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 43"></figure></div>



<p>延續<a href="https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b82%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e4%b8%80%e6%ac%a1%e6%8a%93/" class="rank-math-link">上個單元</a>，我們應該已經爬取了<code>world_index</code>這張表格：<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/1.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="314" src="http://34.96.136.135/wp-content/uploads/2020/07/1-3-1-1024x314.png" alt="1 3 1" class="wp-image-866" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/1-3-1-1024x314.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/1-3-1-300x92.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/1-3-1-768x235.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/1-3-1-1536x471.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/1-3-1-2048x627.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 44"></figure></div>



<p>然後還有一個我們寫好的function</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import json
import requests
import datetime
import pandas as pd
import numpy as np

def crawl_price(stock_id):

    d = datetime.datetime.now()
    url = "https://query1.finance.yahoo.com/v8/finance/chart/"+stock_id+"?period1=0&amp;period2="+str(int(d.timestamp()))+"&amp;interval=1d&amp;events=history&amp;=hP2rOschxO0"

    res = requests.get(url)
    data = json.loads(res.text)
    df = pd.DataFrame(data['chart']['result'][0]['indicators']['quote'][0], index=pd.to_datetime(np.array(data['chart']['result'][0]['timestamp'])*1000*1000*1000))
    return df</code></pre>



<p>接下來就可以將他們結合，來爬取歷史資料了！在爬取資料之前，有幾個程式的小技巧必須要學會</p>



<h3 id="1-for-迴圈">1. for 迴圈</h3>



<p>假如我們要執行重複性的動作，通常第一件事情就是想到for 迴圈，例如我們想要印出1～9，不用for迴圈，我們可以寫成</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">print(1)
print(2)
print(3)
print(4)
print(5)
print(6)
print(7)
print(8)
print(9)</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="328" src="http://34.96.136.135/wp-content/uploads/2020/07/2-3-1024x328.png" alt="2 3" class="wp-image-867" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/2-3-1024x328.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-300x96.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-768x246.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-1536x493.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/2-3-2048x657.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 45"></figure></div>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/2.png"></a>但很明顯我們就已經快要中風了，所以改成for迴圈後</p>



<pre class="wp-block-code"><code lang="python" class="language-python">for i in [1,2,3,4,5,6,7,8,9]:
    print(i)</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="216" src="http://34.96.136.135/wp-content/uploads/2020/07/3-2-1-1024x216.png" alt="3 2 1" class="wp-image-868" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/3-2-1-1024x216.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/3-2-1-300x63.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/3-2-1-768x162.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/3-2-1-1536x325.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/3-2-1-2048x433.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 46"></figure></div>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/3.png"></a></p>



<p>這樣短短的就寫完了！其中<br>第一行：我們有一個變數i，他會從1～9不斷變換，並且執行下方的print(i)。第二行要記得加上前方四個空白，通常叫做縮排「indent」，當第一行有<code>for</code>這個標示後，之後就必須用縮排indent直到寫完for迴圈裡的內容為止。</p>



<p>但有時候我們希望同時做兩個迴圈呢？</p>



<h3 id="使用zip">使用zip</h3>



<p>我們可以使用zip，一次執行兩個list：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">for number, letter in zip([1,2,3], ['a', 'b', 'c']):
    print(number, letter)</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="129" src="http://34.96.136.135/wp-content/uploads/2020/07/4-2-1024x129.png" alt="4 2" class="wp-image-869" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/4-2-1024x129.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/4-2-300x38.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/4-2-768x97.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/4-2-1536x194.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/4-2-2048x258.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 47"></figure></div>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/4.png"></a></p>



<p>最後，我們要使用 dictionary 將全球的指數給存起來。</p>



<h3 id="dictionary">dictionary</h3>



<p>這邊先示範最簡單的用法：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">d = {}
d['a'] = 1
d['b'] = 2

# 查找
print(d['b']) # 2

# 迴圈
# 其中，d.items 有點像是zip的感覺，
# 針對dictionary中的['a', 'b']和[1,2]進行迴圈）
for letter, number in d.items():
    print(letter, number)
# a 1
# b 2</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="248" src="http://34.96.136.135/wp-content/uploads/2020/07/6-1-1-1024x248.png" alt="6 1 1" class="wp-image-870" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/6-1-1-1024x248.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/6-1-1-300x73.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/6-1-1-768x186.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/6-1-1-1536x372.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/6-1-1-2048x496.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 48"></figure></div>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/6.png"></a>結合上述的小功能，就可以寫一個程式將世界指數都抓下來了！<br>我建議你自己試試看～<br>寫完之後再往下拉看範例：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import time
world_index_history = {}
for symbol, name in zip(world_index['Symbol'], world_index['Name']):
    
    print(name)
    
    world_index_history[name] = crawl_price(symbol)
    time.sleep(5)</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="445" src="http://34.96.136.135/wp-content/uploads/2020/07/5-2-1024x445.png" alt="5 2" class="wp-image-871" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/5-2-1024x445.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/5-2-300x130.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/5-2-768x334.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/5-2-1536x668.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/5-2-2048x890.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 49"></figure></div>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/5.png"></a>假如你有認真研究前三點功能，相信這些代碼應該難不倒你！其中沒有教到的是，我們利用<code>time.sleep(5)</code>，來休息一下，不要抓的太頻繁，不然會被封鎖，除此之外，上述代碼非常簡單，寫一個for迴圈，將所有的指數都抓下來，存在<code>world_index_history</code>中。</p>



<h3 id="繪製指數">繪製指數</h3>



<p>接下來，我們可以用一樣的for迴圈，來將指數給畫出來</p>



<pre class="wp-block-code"><code lang="python" class="language-python">for name, history in world_index_history.items():
    history.close.plot()</code></pre>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="1024" height="597" src="http://34.96.136.135/wp-content/uploads/2020/07/f-1-1024x597.png" alt="f 1" class="wp-image-873" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/f-1-1024x597.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/f-1-300x175.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/f-1-768x447.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/f-1-1536x895.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/f-1-2048x1193.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 3)：全球指數歷史數據下載大全 50"></figure></div>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B83%E5%85%A8%E7%90%83%E6%8C%87%E6%95%B8%E6%AD%B7%E5%8F%B2%E6%95%B8%E6%93%9A/f.png"></a></p>



<p>這個<a href="https://colab.research.google.com/drive/1W-pA4jdlPVfil9WZqsRK0Nd8Mel4tMlx?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">單元的程式碼，都可以使用 colab 來執行</a>喔！趕快來玩玩看吧！</p>



<h3 id="有了指數，接下來要做什麼呢？">有了指數，接下來要做什麼呢？</h3>



<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/">下個單元</a>，我們要來分析一下這些指數，看看哪些適合投資，哪些不適合，敬請期待～</p>



<p>這一系列是我們影音課程的化簡版，</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b83%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e6%ad%b7%e5%8f%b2%e6%95%b8%e6%93%9a/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">861</post-id>	</item>
		<item>
		<title>Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究</title>
		<link>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b84%e7%9b%b8%e9%97%9c%e6%80%a7%e5%88%86%e6%9e%90/</link>
					<comments>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b84%e7%9b%b8%e9%97%9c%e6%80%a7%e5%88%86%e6%9e%90/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 07:05:39 +0000</pubDate>
				<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[爬蟲]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=875</guid>

					<description><![CDATA[為什麼美股大跌，在台灣的投資人要很緊張？原因就是相關性！想知道台股跟哪國指數最同步嗎？不是S&#038;P 500美國指數，也不是深圳指數，那究竟是哪國呢？這篇文章我們就來研究一下吧！]]></description>
										<content:encoded><![CDATA[
<p>為什麼美股大跌，在台灣的投資人要很緊張？原因就是相關性！想知道台股跟哪國指數最同步嗎？不是S&amp;P 500美國指數，也不是深圳指數，那究竟是哪國呢？這篇文章我們就來研究一下吧！<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/last.png"></a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="988" src="http://34.96.136.135/wp-content/uploads/2020/07/last-1-1024x988.png" alt="last 1" class="wp-image-877" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/last-1-1024x988.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/last-1-300x289.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/last-1-768x741.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/last-1.png 1108w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 51"></figure></div>


<h2 id="相關性最白話">相關性</h2>



<p>首先我們先介紹什麼是相關性，<br>相關性最白話的講法，你可以想像，看到天空烏雲密佈，代表可能要下雨了，<br>代表天空的顏色跟下雨機率有相關，<br>你可以由一個現象，去預測另一個現象，這就是相關性！</p>



<h3 id="相關性稍微數學一點">相關性稍微數學一點</h3>



<p>相關性也可以更數值化的方式表示，先用以下例子講解：<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/2.png"></a></p>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="263" src="http://34.96.136.135/wp-content/uploads/2020/07/2-4-1024x263.png" alt="2 4" class="wp-image-878" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/2-4-1024x263.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/2-4-300x77.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/2-4-768x197.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/2-4-1536x395.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/2-4.png 1914w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 52"></figure></div>


<p>這張圖中：</p>



<ul><li>我們可以看上方左側圖，天氣溫度跟買冰棒人數的變化圖，可以想像某人每一天記錄天氣溫度與冰棒人數，每天畫一個黃點，時間久了，就可以看出黃點之間的關係，也就是天氣越熱，越有人會想要買冰棒！</li><li>同理，上方中間那張圖，某人也可以記錄每天生病的人數，此時就發現，天氣越冷，越多人會感冒！</li><li>當然某人覺得有趣，於是又記錄了溫度與擲筊的關係，最後發現：沒什麼關連</li></ul>



<p>好了，某人已將觀測值變成數字記錄起來了，但每次都必須畫這麼多點，才能看出相關性，也太累了吧？能不能用一個數字取代呢？</p>



<p>這時就可以用</p>



<h3 id="correlation-coefficient-（相關性係數）">correlation coefficient （相關性係數）</h3>



<p>有人可能覺得太多點點了，有密集恐懼症，希望可以將上方這三張圖，每張圖用一個數字代表就好，這樣就不需要看到這麼多點點。</p>



<p>所以某人提出了 correlation coefficient ，從上面第一張圖開始從左而又，分別可以用 1、-1、0來代表：</p>



<ul><li>1 代表正相關，也就是X越高Y越高，X越低Y越低（成正比）</li><li>─1 代表負相關，也就是X越高Y越低，或X越低Y越高（成反比）</li><li>0 代表無相關性</li></ul>



<p>上述只是化簡後的例子<br>事實上相關性係數不是整數，而是會介於─1～1間，代表正負相關的程度！</p>



<p>讀到這裡，你可能會問，</p>



<h3 id="所以跟投資有什麼關係？">所以相關性跟投資有什麼關係？</h3>



<p>投資就是預測未來現象與當下現象的相關性！<br>就像你看到天空烏雲密佈，就能預測接下來會下雨，<br>我們也可以將相關性係數用於全球指數，</p>



<p>為什麼美股大跌，在台灣的投資人要很緊張？原因就是相關性！<br>台股跟美股有正相關。</p>



<p>我們可以用Python將相關性畫出來，假如你還沒有爬取歷史股價的話，可以先到<a href="https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b83%e5%85%a8%e7%90%83%e6%8c%87%e6%95%b8%e6%ad%b7%e5%8f%b2%e6%95%b8%e6%93%9a/" class="rank-math-link">前個單元</a>爬取喔！</p>



<h2>程式碼撰寫</h2>



<h3>歷史數據回顧</h3>



<p>首先我們可以看一下上個單元爬下來的歷史數據</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">print(world_index_history['S&amp;P 500'].head())</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="241" src="http://34.96.136.135/wp-content/uploads/2020/07/3-3-1024x241.png" alt="3 3" class="wp-image-879" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/3-3-1024x241.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/3-3-300x71.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/3-3-768x181.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/3-3-1536x362.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/3-3-2048x483.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 53"></figure></div>


<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/3.png"></a>還記得<code>world_index_history</code>嗎？它是一個dictionary，根據不同的字串，例如<code>S&amp;P 500</code>，可以叫出相對應的表格（dataframe）</p>



<p>有了&nbsp;<code>world_index_history</code>&nbsp;我們就可以將國際指數的相關性給畫出來，但首先，我們要先來瞭解</p>



<h3 id="Adj-Close跟Close的差異？"><code>比對歷史數據，發現close價格不一樣？</code></h3>



<p>假如你認真的比對歷史數據（例如玩股網），就會發現離現在越久遠以前的歷史價格，誤差越大！這是為什麼呢？其實這個並不是誤差喔！因為 yahoo finance 的歷史價格是「調整後收盤價」代表這是考慮了除權息的價格變化，所計算出來的價格。</p>



<h3 id="簡單的例子">簡單的例子</h3>



<p>當除權息、增減資時，一般股價會有大波動，以除權息為例，股票價格瞬間下跌<br>然而帳戶裡的股票張數會變多（例如領股利）<br>或是帳戶資金量變多（領股息）<br>總體來講是不賺不賠的</p>



<p>所以當除權息時，<br>正常的收盤價&nbsp;會突然下跌很多，<br>而 yahoo finance 的調整後收盤價，不會因為除權息有巨幅下跌<br>更能夠精確的反映股票價值，跟投資的獲利狀況！</p>



<h3 id="Python-終於開始了">Python 終於開始了</h3>



<p>首先我們先將所有指數的&nbsp;<code>Adj Close</code>&nbsp;先集合起來，變成一張表格(dataframe)</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">close = {}
for name, price in world_index_history.items():
    if len(price) != 0:
        close[name] = price['Close']

close = pd.DataFrame(close)
close = close.resample('1d').last().dropna(how='all', axis=1).dropna(how='all', axis=0)</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="433" src="http://34.96.136.135/wp-content/uploads/2020/07/5-3-1024x433.png" alt="5 3" class="wp-image-881" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/5-3-1024x433.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-300x127.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-768x325.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-1536x650.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/5-3-2048x867.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 54"></figure></div>


<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/5.png"></a></p>



<p>接下來就可以來觀察每檔指數的&nbsp;<code>Adj Close</code>&nbsp;相關性，</p>



<pre class="wp-block-code"><code lang="python" class="language-python">corr = close.corr()
print(corr)</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1022" height="544" src="http://34.96.136.135/wp-content/uploads/2020/07/6-2.png" alt="6 2" class="wp-image-882" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/6-2.png 1022w, https://www.finlab.tw/wp-content/uploads/2020/07/6-2-300x160.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/6-2-768x409.png 768w" sizes="(max-width: 1022px) 100vw, 1022px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 55"></figure></div>


<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/6.png"></a></p>



<p>上圖可以看到一個二維的表，就是每個指數跟每個指數之間的相關性，<br>上圖中可以發現，指數自己跟自己的相關性一定是1，代表完全正相關！<br>而這張表會是symmetric matrix，也就是做對角線會是對稱的。</p>



<p>接下來我們可以用更視覺化的方式來表示，假如沒有sns的package，要記得先去安裝<code>pip install sns</code>即可，想瞭解如何安裝，可以到<a href="https://www.finlab.tw/Python%E8%82%A1%E7%A5%A8%E6%8A%95%E8%B3%87/">此安裝教學</a>的下半部分，有簡單的教學喔！</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import seaborn as sns
sns.heatmap(corr, square=True ,vmax=1.0, linecolor='white', annot=True)</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="988" src="http://34.96.136.135/wp-content/uploads/2020/07/last-1-2-1024x988.png" alt="last 1 2" class="wp-image-884" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/last-1-2-1024x988.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/last-1-2-300x289.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/last-1-2-768x741.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/last-1-2.png 1108w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 56"></figure></div>


<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/last.png"></a></p>



<p>假如你發現圖比我的小，字看不清楚，可以改成以下程式碼</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers"># set figure size
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['figure.figsize'] = (18, 18)

# original code
import seaborn as sns
sns.heatmap(corr, square=True ,vmax=1.0, linecolor='white', annot=True)
</code></pre>



<p>有了以上的code，我們就可以知道</p>



<h3 id="台灣股票跟誰最連動">台灣股票跟誰最連動</h3>



<p>我們可以人眼觀察，發現台灣指數<code>TSEC weighted index</code>跟英國前一百大<code>Cboe UK 100</code>超像！相關係數高達0.9，代表非常非常像</p>



<p>我們可以將這兩個指數畫出來檢查一下：</p>



<pre class="wp-block-code"><code class="">close['Cboe UK 100']['2015':].plot()
close['TSEC weighted index']['2015':].plot()</code></pre>


<div class="wp-block-image">
<figure class="aligncenter size-large"><img loading="lazy" width="1024" height="343" src="http://34.96.136.135/wp-content/uploads/2020/07/7-1-1024x343.png" alt="7 1" class="wp-image-886" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/7-1-1024x343.png 1024w, https://www.finlab.tw/wp-content/uploads/2020/07/7-1-300x100.png 300w, https://www.finlab.tw/wp-content/uploads/2020/07/7-1-768x257.png 768w, https://www.finlab.tw/wp-content/uploads/2020/07/7-1-1536x514.png 1536w, https://www.finlab.tw/wp-content/uploads/2020/07/7-1-2048x686.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="Python新手教學(Part 4)：台股的好兄弟是？台股相關性研究 57"></figure></div>


<p><a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B84%E7%9B%B8%E9%97%9C%E6%80%A7%E5%88%86%E6%9E%90/7.png"></a></p>



<p>雖然價格不同，但是趨勢還真的頗像的耶！然而台灣的加權指數，在2020年的價格，跟某幾個美國的指數相關性非常高，究竟是哪一個指數呢？可以使用<a href="https://colab.research.google.com/drive/1W-pA4jdlPVfil9WZqsRK0Nd8Mel4tMlx?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">我們寫好的colab範例</a>跑跑看喔！</p>



<h3 id="如何用於交易？">如何用於交易？</h3>



<p>兩個相關性很高的股票，可以拿來做pair trading配對交易，但也不是只看相關性，<br>這個就容我們之後再慢慢分析吧！<br>這個單元會一直帶你從零開始，慢慢學習，直到機器學習的部分喔！敬請期待～<br>下一個單元中，我們來看一下<a href="https://www.finlab.tw/Python%E6%96%B0%E6%89%8B%E6%95%99%E5%AD%B8%EF%BC%9A%E9%A2%A8%E9%9A%AA%E8%88%87%E5%A0%B1%E9%85%AC/">要怎麼控制報酬與風險</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/python%e6%96%b0%e6%89%8b%e6%95%99%e5%ad%b84%e7%9b%b8%e9%97%9c%e6%80%a7%e5%88%86%e6%9e%90/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">875</post-id>	</item>
		<item>
		<title>股票投資組合系列（一）</title>
		<link>https://www.finlab.tw/%e8%82%a1%e7%a5%a8%e6%8a%95%e8%b3%87%e7%b5%84%e5%90%88%e7%b3%bb%e5%88%97%ef%bc%88%e4%b8%80%ef%bc%89/</link>
					<comments>https://www.finlab.tw/%e8%82%a1%e7%a5%a8%e6%8a%95%e8%b3%87%e7%b5%84%e5%90%88%e7%b3%bb%e5%88%97%ef%bc%88%e4%b8%80%ef%bc%89/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 07:05:22 +0000</pubDate>
				<category><![CDATA[股票策略]]></category>
		<category><![CDATA[選股策略]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<category><![CDATA[量化投資]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=686</guid>

					<description><![CDATA[這篇介紹多股票或是策略的配置方法，會以常見的方式加以說明，
並以用淺顯易懂的方式帶大家拆解複雜的公式，
期貨已經有很多人在用「多商品多策略」的方式在投資，
這邊的理論部分也是適用的，歡迎進來看看。]]></description>
										<content:encoded><![CDATA[
<p>這篇介紹多股票或是策略的配置方法，會以常見的方式加以說明，<br>並以用淺顯易懂的方式帶大家拆解複雜的公式，<br>期貨已經有很多人在用「多商品多策略」的方式在投資，<br>這邊的理論部分也是適用的，歡迎進來看看。</p>



<p>股票策略是比較難量化的，<br>因為股票要同時考慮財報、技術、籌碼面，光是要做出策略就已經不容易<br>甚至還要同時考慮多策略，並且配置資產！？真的很難<br>這篇就來介紹一下，比較宏觀的一些數學推演，<br>然後我手上的9個交易策略當作範例，來看看效果如何。<a href="https://www.finlab.tw/%E8%82%A1%E7%A5%A8%E6%8A%95%E8%B3%87%E7%B5%84%E5%90%88%E7%B3%BB%E5%88%97%EF%BC%88%E4%B8%80%EF%BC%89/final.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="580" height="463" src="http://34.96.136.135/wp-content/uploads/2020/07/final.png" alt="final" class="wp-image-687" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/final.png 580w, https://www.finlab.tw/wp-content/uploads/2020/07/final-300x239.png 300w" sizes="(max-width: 580px) 100vw, 580px" title="股票投資組合系列（一） 58"></figure></div>



<h3 id="報酬率模型">報酬率模型</h3>



<p>我們用一個最簡單的模型，用數學寫起來就是這樣：</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="178" height="84" src="http://34.96.136.135/wp-content/uploads/2020/07/Screenshot-2020-07-13-at-18.37.24.png" alt="Screenshot 2020 07 13 at 18.37.24" class="wp-image-688" title="股票投資組合系列（一） 59"></figure></div>



<p><br>其中，<br><em>r*</em>​​&nbsp;是報酬率（return）<br>\mathbb{P}P&nbsp;是策略庫中的所有策略（portfolio）<br><em>r<sub>p</sub></em>​​&nbsp;是 p 策略一段時間的報酬率<br><em>w<sub>p</sub></em>​​&nbsp;是 p 策略一段時間的權重，也就是我們投資多少比例的資產於策略p<br>其中我們限定&nbsp;<em>∑w<sub>p</sub></em>​​=1&nbsp;，<br>因為我們想以比例呈現，也就是一塊大餅分給不同的策略p的比例而已。</p>



<p>也可以把上述公式用向量表示：<br><img loading="lazy" width="96" height="19" src="" alt="" title="股票投資組合系列（一） 60"><img loading="lazy" width="96" height="19" src="" alt="" title="股票投資組合系列（一） 60"></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="165" height="66" src="http://34.96.136.135/wp-content/uploads/2020/07/Screenshot-2020-07-13-at-18.51.20.png" alt="Screenshot 2020 07 13 at 18.51.20" class="wp-image-690" title="股票投資組合系列（一） 62"></figure></div>



<p><br>這邊的小寫粗體w跟r就是代表向量的意思，<br>我們的目標就是找到一個&nbsp;<strong>w</strong>&nbsp;可以優化&nbsp;<em>r*</em>​​​​&nbsp;變得比較大！<br>這邊講的「優化」，是建立在假設「未來的報酬率」會跟「歷史報酬率」<em>r*</em>​​​​&nbsp;會是近似，<br>所以優化了<em>r*</em>​​ ​​就帶表優化了「未來的報酬率」（大部分都是這樣，但有些會不一樣）</p>



<p>但是這邊的「優化」不代表想要一味的最大化 <em>r*</em>​​​​，我們同時還希望風險降到最小！</p>



<h3 id="風險模型">風險模型</h3>



<p>跟報酬率模型不一樣，風險可以有很多種模型，因為風險本身就很難定義XD<br>有人說風險要看最大跌幅，有些人說要看獲利曲線的震幅（標準差），<br>有很多種，而且公式有點難，放上來很多人就會暈過去，<br>所以呢，我們這邊先假設風險模型是一個function，<em>h</em>(<strong>w</strong>)</p>



<p>我們的目標就是要找一個盡可能小的 <em>h</em>(<strong>w</strong>)</p>



<h3 id="同時比較報酬率跟風險">同時比較報酬率跟風險</h3>



<p>所以我們希望報酬率不僅要好，並且風險也要很低才行，報酬率跟風險的圖可以畫成這樣：<a href="https://www.finlab.tw/%E8%82%A1%E7%A5%A8%E6%8A%95%E8%B3%87%E7%B5%84%E5%90%88%E7%B3%BB%E5%88%97%EF%BC%88%E4%B8%80%EF%BC%89/returnrisk.gif"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="400" height="289" src="http://34.96.136.135/wp-content/uploads/2020/07/returnrisk.gif" alt="returnrisk" class="wp-image-691" title="股票投資組合系列（一） 63"></figure></div>



<p>Y軸就是剛剛算的 <em>r*</em> ​​(<strong>w</strong>)，而X軸就是 <em>h</em>(<strong>w</strong>)<br>我們可以把任意的投資商品畫在圖上，<br>例如：現金（cash）就是最沒有風險、但也最無法獲利的資產，所以位於圖中的左下角<br>或是：股票，風險較高，但潛在獲利也比較高，所以位於圖中右上角</p>



<p>我們要是可以找到一組在左上角的資產，該有多好？<br>代表此資產不但獲利高，且風險低，簡直是完美！<br>但可惜的是現實中，很難找到這種資產，怎麼辦？<br>我們自己來創造一個！我們將研發的策略當作是一種資產，並且放上這張圖中！<br>甚至，我們還可以利用&nbsp;<strong>w </strong>來組合不同的策略，產生靠近左上角的點！</p>



<h3 id="實做報酬率風險圖">實做報酬率風險圖</h3>



<p>首先呢，先選取我覺得比較滿意的幾個策略出來：<a href="https://www.finlab.tw/%E8%82%A1%E7%A5%A8%E6%8A%95%E8%B3%87%E7%B5%84%E5%90%88%E7%B3%BB%E5%88%97%EF%BC%88%E4%B8%80%EF%BC%89/eqs.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="707" height="432" src="http://34.96.136.135/wp-content/uploads/2020/07/eqs.png" alt="eqs" class="wp-image-693" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/eqs.png 707w, https://www.finlab.tw/wp-content/uploads/2020/07/eqs-300x183.png 300w" sizes="(max-width: 707px) 100vw, 707px" title="股票投資組合系列（一） 64"></figure></div>



<p>策略的名字都被換成「口」，因為中文顯示不出來呀XDD<br>（這樣也好，因為看名字就能知道該策略的手法）<br>我把報酬率換成指數，方便觀看，你可能會覺得這策略也太猛，而且沒有開任何槓桿<br>但大部分的策略都是2017年寫出來的，所以也不用覺得這很神，<br>說不定都是一些過擬合的策略XD</p>



<p>接下來，我們利用蒙地卡羅法，跑五萬組隨機的 <strong>w</strong>，<br>把每個組合產生的「報酬率」跟「風險」畫上來（只考慮2017年）：<a href="https://www.finlab.tw/%E8%82%A1%E7%A5%A8%E6%8A%95%E8%B3%87%E7%B5%84%E5%90%88%E7%B3%BB%E5%88%97%EF%BC%88%E4%B8%80%EF%BC%89/final.png"></a></p>



<figure class="wp-block-image size-large"><img loading="lazy" width="580" height="463" src="http://34.96.136.135/wp-content/uploads/2020/07/final-1.png" alt="final 1" class="wp-image-694" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/final-1.png 580w, https://www.finlab.tw/wp-content/uploads/2020/07/final-1-300x239.png 300w" sizes="(max-width: 580px) 100vw, 580px" title="股票投資組合系列（一） 65"></figure>



<p>這裡的Y軸對應到的就是 <em>r*</em> ​​(<strong>w</strong>)&nbsp;，也就是獲利<br>而X軸就是對應到 <em>h</em>(<strong>w</strong>)&nbsp;，也就是風險</p>



<p>彩色點點的部分，每一個點，是我們任意分配權重投資9個策略，產生的報酬率和風險<br>你就會發現，這些點只會出現在特定的範圍內，代表我們設定任何w，總會有碰到資產變化的極限，</p>



<p>另外，這些點點的顏色，代表了一種風險指標，同時結合了「報酬率」跟「風險」，名字叫做sharp ratio，<br>它的算法很簡單，就是直接&nbsp;<em>r*</em> ​​(<strong>w</strong>) / <em>h</em>(<strong>w</strong>)<br>由漸層的斜率可以看出來，sharp ratio 是一個可以幫我們找出「獲利大且風險小」的指標，<br>sharp ratio高的組合，對應到圖中，就是越綠的點（策略組合），剛好是在整張圖的左上方！</p>



<p>於是我們就可以找出兩個點（藍跟紅點），<br>其中一個是sharp最高的資產組合，另一個是風險最小的資產組合<br>這邊我們先不列出風險&nbsp;<em>h</em>(<strong>w</strong>)&nbsp;到底怎麼定義<br>只是給大家投資組合分析常用的一些套路，之後不外乎就是：</p>



<ul><li>修改報酬率模型&nbsp;<em>r*</em> ​​(<strong>w</strong>)</li><li>修正風險值模型&nbsp;<em>h</em>(<strong>w</strong>)</li><li>導出一個更好的公式，可以不用蒙地卡羅，直接算出類似藍點或紅點，也就是最佳化的投資組合</li></ul>



<p>我們之後會更具體的來講解這些方法，並實做看看是否有用！（先講結論：有點用）</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/%e8%82%a1%e7%a5%a8%e6%8a%95%e8%b3%87%e7%b5%84%e5%90%88%e7%b3%bb%e5%88%97%ef%bc%88%e4%b8%80%ef%bc%89/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">686</post-id>	</item>
		<item>
		<title>新年賀禮 &#8211; 投信跟盤法！</title>
		<link>https://www.finlab.tw/%e6%8a%95%e4%bf%a1%e8%b7%9f%e7%9b%a4%e6%b3%95%ef%bc%81/</link>
					<comments>https://www.finlab.tw/%e6%8a%95%e4%bf%a1%e8%b7%9f%e7%9b%a4%e6%b3%95%ef%bc%81/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 07:05:02 +0000</pubDate>
				<category><![CDATA[籌碼面]]></category>
		<category><![CDATA[投信]]></category>
		<category><![CDATA[歷史回測]]></category>
		<category><![CDATA[股票分析]]></category>
		<category><![CDATA[選股策略]]></category>
		<category><![CDATA[量化投資]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=596</guid>

					<description><![CDATA[大家好！新年快樂，很久沒有寫文章了，今天要介紹的是投信的跟隨買賣，算是2018年送給大家的新年賀禮！這是一個完整的策略，方法非常簡單，看完這篇就可以直接使用，手動操作該策略喔！]]></description>
										<content:encoded><![CDATA[
<p>大家好！新年快樂，很久沒有寫文章了，今天要介紹的是投信的跟隨買賣，算是2018年送給大家的新年賀禮！這是一個完整的策略，方法非常簡單，看完這篇就可以直接使用，手動操作該策略喔！<a href="https://www.finlab.tw/%E6%8A%95%E4%BF%A1%E8%B7%9F%E7%9B%A4%E6%B3%95%EF%BC%81/thumbnail.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="367" height="201" src="http://34.96.136.135/wp-content/uploads/2020/07/thumbnail-3.png" alt="thumbnail 3" class="wp-image-597" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-3.png 367w, https://www.finlab.tw/wp-content/uploads/2020/07/thumbnail-3-300x164.png 300w" sizes="(max-width: 367px) 100vw, 367px" title="新年賀禮 - 投信跟盤法！ 66"></figure></div>



<p>我趁著歐洲聖誕假期，跑去土耳其玩，土耳其真的很多商人，到處跟我裝熟、賣我東西，買了才發現不但品質差，價錢還是正常的好幾倍。他們的話術真的很強，去玩一定要小心。雖然被坑很多錢，但股票有賺一些XD，心沒有這麼痛。廢話不多說，開始介紹這個選股方法吧！</p>



<h3 id="投信就是基金">投信就是基金</h3>



<p>投信簡單說，就是我們口中的基金公司啦！很多人懶得自己投資，就將錢交給高手，讓他們去操盤。</p>



<p>但是基金公司的缺點，在於管理費用太高了，賺的錢都進了基金公司的口袋，假如你要將資產交給基金公司的話，最好是大金額，才能藉由談判，壓低手續和管理費。</p>



<p>假如你想要省下管理費，假如你不止想投資理財，也想投資自己的腦袋，那就常來看一下我們的文章吧！我們的目標就是想要讓大家用很低的成本，學會如何穩定的獲利。</p>



<h3 id="投信買賣資料">投信買賣資料</h3>



<p>台灣有很多獨特的數據，投信買賣數據就是台灣獨有的，證券交易所每天公布三大法人的當日買賣狀況，有外資、投信、自營商。</p>



<p>投信最重要的數據就是某支股票的當日總買賣張數，當某公司表現良好，基金公司通常會比散戶更快掌握狀況並買入，就會反映在這個數據上，我們就藉由這個原理，跟隨投信來買賣。</p>



<h3 id="策略思路">策略思路</h3>



<p>投信擁有投資人大筆的金額，所以假如公司的市值比較小，投信就可以操弄其股價，迫使股價上漲，並出場結算。所以我們選取市值較小，投信又買入的股票，當</p>



<ul><li>市值（百萬） &lt; 10000</li><li>投信當日買賣 &gt; 200 張</li></ul>



<p>我們買入該股30天。</p>



<p>以上的條件都可以用&nbsp;<a href="https://goodinfo.tw/StockInfo/StockList.asp?MARKET_CAT=%E8%87%AA%E8%A8%82%E7%AF%A9%E9%81%B8&amp;INDUSTRY_CAT=%E6%88%91%E7%9A%84%E6%A2%9D%E4%BB%B6&amp;FILTER_ITEM0=%E5%B9%B4%E5%BA%A6%E2%80%93ROE%28%25%29&amp;FILTER_VAL_S0=30&amp;FILTER_VAL_E0=&amp;FILTER_SHEET=%E5%B9%B4%E7%8D%B2%E5%88%A9%E8%83%BD%E5%8A%9B&amp;WITH_ROTC=F&amp;FILTER_QUERY=%E6%9F%A5++%E8%A9%A2" rel="noreferrer noopener" target="_blank">GoodInfo 股票篩選功能</a>&nbsp;來達成喔！</p>



<p>我們回測採用手續費6折，證交稅千分之三，由100萬當起始資金，平均分配到每日持有的標的。</p>



<h3 id="結果">結果</h3>



<p>我們針對所有的上市公司，當日發現符合條件，隔日以開盤價買進，30天後開盤價賣出！可以得出權益曲線，也就是你資產的增加幅度（獲利金額持續投資）<a href="https://www.finlab.tw/%E6%8A%95%E4%BF%A1%E8%B7%9F%E7%9B%A4%E6%B3%95%EF%BC%81/eq1.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="606" height="357" src="http://34.96.136.135/wp-content/uploads/2020/07/eq1-2.png" alt="eq1 2" class="wp-image-598" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/eq1-2.png 606w, https://www.finlab.tw/wp-content/uploads/2020/07/eq1-2-300x177.png 300w" sizes="(max-width: 606px) 100vw, 606px" title="新年賀禮 - 投信跟盤法！ 67"></figure></div>



<p>由圖可見，紅色的是策略，灰色的是大盤，這個策略在2008跟2011年的回檔都非常嚴重！但近五年的獲利超好，感覺投信的投資技巧有越來越進步的趨勢。<a href="https://www.finlab.tw/%E6%8A%95%E4%BF%A1%E8%B7%9F%E7%9B%A4%E6%B3%95%EF%BC%81/md.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="624" height="172" src="http://34.96.136.135/wp-content/uploads/2020/07/md-1.png" alt="md 1" class="wp-image-599" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/md-1.png 624w, https://www.finlab.tw/wp-content/uploads/2020/07/md-1-300x83.png 300w" sizes="(max-width: 624px) 100vw, 624px" title="新年賀禮 - 投信跟盤法！ 68"></figure></div>



<p>為什麼大盤回檔時，投信會很慘呢？由於法規規定投信持股要70% 以上，所以當金融海嘯時，無法退出市場，所以虧損是無可避免的。</p>



<h3 id="策略再優化">策略再優化</h3>



<p>既然這篇是新年賀禮，怎麼可能報酬率就只有這樣呢？我的讀者一定都知道，如何<a href="https://www.finlab.tw/%E9%81%8E%E6%BF%BE%E5%A4%A7%E7%9B%A4%E7%9A%84%E7%B0%A1%E5%96%AE%E6%96%B9%E6%B3%95%EF%BC%81/">避開大盤大跌</a>&nbsp;！假如你還沒看過那一篇的話，可以去看看！最近滿常用這個方法，有時候還滿好用的。</p>



<p>賣出條件（賣出所有持股）：</p>



<ul><li>大盤在均線下 且 均線比昨日低 （25日均線）</li></ul>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="612" height="357" src="http://34.96.136.135/wp-content/uploads/2020/07/eq2-2.png" alt="eq2 2" class="wp-image-600" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/eq2-2.png 612w, https://www.finlab.tw/wp-content/uploads/2020/07/eq2-2-300x175.png 300w" sizes="(max-width: 612px) 100vw, 612px" title="新年賀禮 - 投信跟盤法！ 69"></figure></div>



<p><a href="https://www.finlab.tw/%E6%8A%95%E4%BF%A1%E8%B7%9F%E7%9B%A4%E6%B3%95%EF%BC%81/eq2.png"></a><br>可以看到策略躲過了金融海嘯，且在金融海嘯一結束馬上啟動獲利！且14年獲利來到了16倍！</p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="612" height="161" src="http://34.96.136.135/wp-content/uploads/2020/07/ns2-1.png" alt="ns2 1" class="wp-image-601" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/ns2-1.png 612w, https://www.finlab.tw/wp-content/uploads/2020/07/ns2-1-300x79.png 300w" sizes="(max-width: 612px) 100vw, 612px" title="新年賀禮 - 投信跟盤法！ 70"></figure></div>



<p><a href="https://www.finlab.tw/%E6%8A%95%E4%BF%A1%E8%B7%9F%E7%9B%A4%E6%B3%95%EF%BC%81/ns2.png"></a><br>持股都還算滿多的，但有時候會瞬間歸0，是由於要避開大盤大跌時，一次性的全部賣出導致的。<a href="https://www.finlab.tw/%E6%8A%95%E4%BF%A1%E8%B7%9F%E7%9B%A4%E6%B3%95%EF%BC%81/md2.png"></a></p>



<div class="wp-block-image"><figure class="aligncenter size-large"><img loading="lazy" width="624" height="172" src="http://34.96.136.135/wp-content/uploads/2020/07/md2.png" alt="md2" class="wp-image-602" srcset="https://www.finlab.tw/wp-content/uploads/2020/07/md2.png 624w, https://www.finlab.tw/wp-content/uploads/2020/07/md2-300x83.png 300w" sizes="(max-width: 624px) 100vw, 624px" title="新年賀禮 - 投信跟盤法！ 71"></figure></div>



<p><br>最大虧損降低到-30％以內，算是滿優秀的！</p>



<h3 id="結論">結論</h3>



<p>到此為止，投信跟隨策略就算差不多了！我們利用了幾個概念：</p>



<ol><li>市值小的公司，較容易被投信操控</li><li>避開大盤大跌</li></ol>



<p>簡單的構成了這個策略，不但條件少，而且獲利效果是<strong>目前為止最好的</strong>，可以直接用GoodInfo或類似的選股軟體篩選持股。</p>



<h3 id="謝謝大家的支持！2018繼續努力！">謝謝大家的支持！2018繼續努力！</h3>



<p>部落格累積了很多留言，今天也一一回覆完了，有很多網友給我很好建議！之後都會最更詳細研究看看：</p>



<ul><li>凱利公式做資產配置</li><li>技術指標的回測模組</li><li>回測報表教學</li><li>營業現金流選股</li><li>外資跟隨買賣優化（有點難，還在想）</li></ul>



<p>假如大家有什麼感興趣的，想要我研究看看，都可以在下面留言喔！</p>



<p>祝大家2018投資順利！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/%e6%8a%95%e4%bf%a1%e8%b7%9f%e7%9b%a4%e6%b3%95%ef%bc%81/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">596</post-id>	</item>
	</channel>
</rss>
