<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Nova API Blog</title>
        <link>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog</link>
        <description>Nova API Blog</description>
        <lastBuildDate>Mon, 21 Oct 2024 03:14:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[結合 LINE Notify 實現停損停利]]></title>
            <link>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy</link>
            <guid>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy</guid>
            <pubDate>Mon, 21 Oct 2024 03:14:39 GMT</pubDate>
            <description><![CDATA[讀完本篇文，您將學會...]]></description>
            <content:encoded><![CDATA[<p>讀完本篇文，您將學會...</p>
<ul>
<li>結合 LINE Notify 接收停損停利通知</li>
<li>透過庫存個股進行停損停利實單演練</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="停損停利簡介">停損停利簡介<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#%E5%81%9C%E6%90%8D%E5%81%9C%E5%88%A9%E7%B0%A1%E4%BB%8B" class="hash-link" aria-label="Direct link to 停損停利簡介" title="Direct link to 停損停利簡介">​</a></h2>
<p>不知道大家在投資股票的過程中，是否也覺得賣股票比買股票還要困難很多？在主觀交易中，停損停利說起來相當容易，但真正執行時，容易因主觀判斷，而錯失賣出時機。因此，本篇文章將帶大家實作停損停利，透過程式交易來戰勝凹單的心魔！因考量到用戶可能會希望先以接收通知的方式確認策略可行性，因此本篇將介紹如何結合 LINE Notify 接收停損停利通知，並搭配庫存進行實單演練。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="事前準備">事前準備<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#%E4%BA%8B%E5%89%8D%E6%BA%96%E5%82%99" class="hash-link" aria-label="Direct link to 事前準備" title="Direct link to 事前準備">​</a></h2>
<p>在使用 LINE Notify 接收通知前，需先取得 LINE Notify 個人存取權杖 (Access Token)，可以透過以下步驟：</p>
<ol>
<li>登入 <a href="https://notify-bot.line.me/my/" target="_blank" rel="noopener noreferrer">Line-Notify-Bot</a></li>
<li>到發行存取權杖（開發人員用）點選發行權杖</li>
<li>填寫權杖名稱、選擇接收通知的聊天室，按下發行</li>
<li>點選複製，因 Token 不會再顯示，請記得留存該 Token</li>
</ol>
<p>示意圖如下：</p>
<p><img decoding="async" loading="lazy" alt="week8_01.png" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/week8_01-8fa18c093b1f141b05bb4d12b836f392.png" width="1462" height="495" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="策略執行">策略執行<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#%E7%AD%96%E7%95%A5%E5%9F%B7%E8%A1%8C" class="hash-link" aria-label="Direct link to 策略執行" title="Direct link to 策略執行">​</a></h2>
<p>準備好 LINE Token 後，我們廢話不多說，直接進入程式碼部分吧！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="step1-載入相關套件">step1. 載入相關套件<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#step1-%E8%BC%89%E5%85%A5%E7%9B%B8%E9%97%9C%E5%A5%97%E4%BB%B6" class="hash-link" aria-label="Direct link to step1. 載入相關套件" title="Direct link to step1. 載入相關套件">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 載入 API 套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> taishin_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> BSAction</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeInForce</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> PriceType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> MarketType</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 載入相關套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> math</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 載入 line-notify 套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> lineTool</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="step2-設定參數">step2. 設定參數<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#step2-%E8%A8%AD%E5%AE%9A%E5%8F%83%E6%95%B8" class="hash-link" aria-label="Direct link to step2. 設定參數" title="Direct link to step2. 設定參數">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">symbolId </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"6285"</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 取得股票代碼</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SP </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.2</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 訂定停利％數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">SL </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.1</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 訂定停損％數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 因考量讀者可能尚未開戶 or 目前無庫存可在這裡測試，可自行更改成本價</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">price_avg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">70</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">qty </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2000</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 2 張</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="step3-程式碼實作">step3. 程式碼實作<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#step3-%E7%A8%8B%E5%BC%8F%E7%A2%BC%E5%AF%A6%E4%BD%9C" class="hash-link" aria-label="Direct link to step3. 程式碼實作" title="Direct link to step3. 程式碼實作">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">StopProfitStrategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> symbol_id</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sp_ratio</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> sl_ratio</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 初始化交易 API 並取得 sdk object</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">_init_fugle_trade</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LINE_NOTIFY_TOKEN </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"INPUT_YOUR_LINE_TOKEN"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># INPUT_YOUR_LINE_TOKEN</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 設定交易標的（取庫存股票）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> symbol_id</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 設定停利比例</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sp_ratio </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sp_ratio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 設定停損比例</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sl_ratio </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sl_ratio</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># # 初始化庫存價格及成交量</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># self.price_avg = price_avg</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># self.qty = qty</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 最新價格</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 交易 API 設定檔的部分</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">_init_fugle_trade</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 登入</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sdk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        accounts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">login</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Your ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Password"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> accounts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sell</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> qty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> price_type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            buy_sell</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">BSAction</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Sell</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">PriceType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            symbol</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            quantity</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">qty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            time_in_force</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">TimeInForce</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ROD</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            order_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">OrderTyep</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            market_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">MarketType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Common   </span><span class="token comment" style="color:#999988;font-style:italic"># 現股賣出 的交易類別</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">sell_total_shares</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> qty </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 計算預計賣出張數 -&gt; 小數點無條件捨去</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            vol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> math</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">floor</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qty</span><span class="token operator" style="color:#393A34">/</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 市價、整股賣</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># self.sell(vol, 'Market', 'Common')</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 測試用、漲停賣(避免真的賣掉)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sell</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">vol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LimitUp'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'Common'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 若還有零股需再下零股單</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 賣出剩下的零股</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            odd_vol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> qty </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> vol</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">1000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> odd_vol </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># 跌停價、盤中零股賣</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># self.sell(odd_vol, 'LimitDown', 'IntradayOdd') # 零股預約單帶 Odd ，盤中零股帶 IntradayOdd</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># 測試用、漲停賣(避免馬上賣掉)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sell</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">odd_vol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LimitUp'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'IntradayOdd'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 零股預約單帶 Odd ，盤中零股帶 IntradayOdd</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 庫存不足一張時</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> qty </span><span class="token operator" style="color:#393A34">&lt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 跌停價、盤中零股賣</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># self.sell(qty, 'LimitDown', 'IntradayOdd') # 零股預約單帶 Odd ，盤中零股帶 IntradayOdd</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 測試用、漲停賣(避免馬上賣掉)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sell</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qty</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'LimitUp'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'IntradayOdd'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 零股預約單帶 Odd ，盤中零股帶 IntradayOdd</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 取得庫存 - 成交均價、成交股數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_inventoryInfo</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">try</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'get_inventoryInfo start'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 檢查庫存資料</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            inventories_list </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_inventories</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 取得指定的庫存股票</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            spec_symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'stk_no'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">==</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> inventories_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price_avg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">float</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">spec_symbol</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'price_avg'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 取得該股票庫存股數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            qty </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">int</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">spec_symbol</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">"cost_qty"</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'get_inventoryInfo done'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> price_avg</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> qty</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'get_inventoryInfo error: {}'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 取得最新報價</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_latest_price</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        json_data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">loads</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">json_data</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">==</span><span class="token string" style="color:#e3116c">"data"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'isTrial'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 避免用到試撮資料</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 更新目前價格</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'price'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'最新價格：'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run_strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">price_avg</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">==</span><span class="token string" style="color:#e3116c">"snapshot"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 盤後測試</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 更新目前價格</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'price'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'收盤價格：'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                   </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run_strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">price_avg</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle_disconnect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> code</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f'disconnect: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">code</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">, </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">message</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> price_avg</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 取庫存中，該股票的成本價及庫存股數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># self.price_avg, self.qty = self.get_inventoryInfo()</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># # 若您目前尚未有庫存可自行設置一個成本價（500元）及庫存股數（1000股）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># self.price_avg, self.qty = 500, 1000</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init_realtime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">marketdata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">websocket_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'message'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_latest_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"disconnect"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">handle_disconnect</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">subscribe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'channel'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'trades'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'symbol'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">run_strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> price_avg</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">try</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'get_run_strategy start!'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price </span><span class="token keyword" style="color:#00009f">is</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># 達到 停利條件 就進行平倉操作：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> price_avg</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sp_ratio</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic"># 平倉</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic"># self.sell_total_shares(qty)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    msg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'達到停利條件：</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">sp_ratio</span><span class="token string-interpolation interpolation operator" style="color:#393A34">*</span><span class="token string-interpolation interpolation number" style="color:#36acaa">100</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> %'</span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">'\n'</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                          </span><span class="token string" style="color:#e3116c">'賣出'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">'\n'</span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">'元'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"股"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic">#line notify 通知</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    lineTool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lineNotify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LINE_NOTIFY_TOKEN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">disconnect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 達條件後，中斷連線</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token comment" style="color:#999988;font-style:italic"># 達到 停損條件 就進行平倉操作：</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">elif</span><span class="token plain">  self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> price_avg</span><span class="token operator" style="color:#393A34">*</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sl_ratio</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic"># 平倉</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic"># self.sell_total_shares(qty)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic"># 預計回傳 line notify 通知的訊息</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    msg </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:#e3116c">f'達到停損條件：</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">sl_ratio</span><span class="token string-interpolation interpolation operator" style="color:#393A34">*</span><span class="token string-interpolation interpolation number" style="color:#36acaa">100</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> %'</span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">'\n'</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">\</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                          </span><span class="token string" style="color:#e3116c">'賣出'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">'\n'</span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token string" style="color:#e3116c">'元'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'\n'</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">qty</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"股"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token comment" style="color:#999988;font-style:italic"># 執行 line notify 通知</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    lineTool</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">lineNotify</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LINE_NOTIFY_TOKEN</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> msg</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">disconnect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 達條件後，中斷連線</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">else</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"尚未達到停損停利條件！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                    </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"----"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">except</span><span class="token plain"> Exception </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'get_run_strategy error: {}'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> e</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__main__'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    strategy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> StopProfitStrategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">symbolId</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SP</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> SL</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    strategy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">price_avg</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> qty</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>若該股票達到您設定的停損停利條件，即可至您選擇的聊天室查看該訊息，示意圖如下：</p>
<p><img decoding="async" loading="lazy" alt="week8_02.png" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/week8_02-39d52e1c235361b7a0ac09fd85932f57.png" width="746" height="890" class="img_ev3q"></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="結論">結論<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/SPSL-strategy#%E7%B5%90%E8%AB%96" class="hash-link" aria-label="Direct link to 結論" title="Direct link to 結論">​</a></h2>
<p>本篇文章帶大家了解如何實作基本的停損停利出場策略，並結合 LINE Notify 接收停損停利通知，搭配庫存個股進行停損停利的實作演練，希望結合個人化通知，幫助讀者漸進式地了解台新 API 的相關應用！另外，讀者也可以嘗試若再搭配分批出場該如何實作，快去試試吧！</p>
<p>下篇文章將會是停損停利的延伸應用，帶大家實作能夠因應市場變化而自動調整的進階版停損停利策略 - 移動停利停損，請大家敬請期待！</p>]]></content:encoded>
            <category>Python</category>
            <category>程式交易</category>
            <category>量化交易</category>
            <category>停損停利</category>
            <category>line Notify</category>
            <category>台股交易API</category>
            <category>程式交易實戰系列</category>
            <category>行情 v1.0</category>
        </item>
        <item>
            <title><![CDATA[【程式交易實戰】從零開始建置股票當沖策略（內含策略 sample code）]]></title>
            <link>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy</link>
            <guid>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy</guid>
            <pubDate>Mon, 21 Oct 2024 03:14:39 GMT</pubDate>
            <description><![CDATA[歡迎來到 程式交易實戰 ，若還不了解程式交易可以參考 此文章 !]]></description>
            <content:encoded><![CDATA[<p>歡迎來到 <strong>程式交易實戰</strong> ，若還不了解程式交易可以參考 <a href="https://blog.fugle.tw/what-is-programmatic-trading/" target="_blank" rel="noopener noreferrer">此文章</a> !
我們現在就來談談交易策略架構以及如何實作當沖策略吧！</p>
<p>讀完本篇文，您將學會...</p>
<ul>
<li>熟悉交易策略的組成 - 指標、訊號、方法</li>
<li>開發出簡單的當沖策略：開盤買 / 收盤賣</li>
<li>開發出進階的當沖策略：ORB 策略</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="交易策略的組成---指標訊號方法">交易策略的組成 - 指標、訊號、方法<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy#%E4%BA%A4%E6%98%93%E7%AD%96%E7%95%A5%E7%9A%84%E7%B5%84%E6%88%90---%E6%8C%87%E6%A8%99%E8%A8%8A%E8%99%9F%E6%96%B9%E6%B3%95" class="hash-link" aria-label="Direct link to 交易策略的組成 - 指標、訊號、方法" title="Direct link to 交易策略的組成 - 指標、訊號、方法">​</a></h2>
<p>一個完整的量化交易策略是由「指標」、「訊號」、「方法」所組成，假設我們想要在「股價向上突破 5 日均線時買進」，那指標就是「 5 日均線」，訊號是「向上突破」，方法則是「買進」等買賣操作。如下圖所示：</p>
<p><img decoding="async" loading="lazy" alt="week1_01" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/week1_01-09f38bf76345547ce9ed777531b051f3.png" width="1789" height="1002" class="img_ev3q"></p>
<p><strong>策略通常是為了達成目標而制定的</strong>，再舉個更生活化的例子，若今天想要在門票開賣時搶購演唱會門票；目標是「買到演唱會門票」，所以為了達成這個目的，我們需要制定一個策略來達成，而這個策略按照上面的例子可能會是「一刻不差的在開賣第一時刻要按下購票 CTA 按鈕」。</p>
<p>所以假設張惠妹演唱會在 2022 年 9 月 1 日 00:00 在 KKTIX 開賣，那指摽是「開賣時間：2022 年 9 月 1 日 00:00 」，訊號是「到達開賣時間」，方法就是「按下購票按鈕」。看似很簡單的事件流程，但在量化交易的世界裡，這些都是可以做修改、驗證及分析的，在往後的課程裡我們會更具體的介紹策略開發的流程以及分析方法。</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="如何實作">如何實作<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy#%E5%A6%82%E4%BD%95%E5%AF%A6%E4%BD%9C" class="hash-link" aria-label="Direct link to 如何實作" title="Direct link to 如何實作">​</a></h2>
<p>廢話不多說，直接進入實作的部分吧！首先會需要先準備環境，若您尚未申請台新交易 API，可參考 <a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/docs/trading/prepare">事前準備</a>。</p>
<p>若已完成申請，可直接執行以下 code 進行登入</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> taishin_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> BSAction</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeInForce</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> PriceType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> MarketType</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 登入</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sdk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">accounts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">login</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Your ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Password"</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="開發簡單的當沖策略---開盤買收盤賣">開發簡單的當沖策略 - 開盤買/收盤賣<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy#%E9%96%8B%E7%99%BC%E7%B0%A1%E5%96%AE%E7%9A%84%E7%95%B6%E6%B2%96%E7%AD%96%E7%95%A5---%E9%96%8B%E7%9B%A4%E8%B2%B7%E6%94%B6%E7%9B%A4%E8%B3%A3" class="hash-link" aria-label="Direct link to 開發簡單的當沖策略 - 開盤買/收盤賣" title="Direct link to 開發簡單的當沖策略 - 開盤買/收盤賣">​</a></h3>
<p>當登入完成後，就可以進行當沖策略開發的部分囉！</p>
<p>我們以曾經紅極一時的長榮（<a href="https://www.fugle.tw/ai/2603" target="_blank" rel="noopener noreferrer">2603.tw</a>）這檔股票作為範例，但在開發當沖策略前，您也需要留意自身有無當沖權限，另外也需查詢該檔股票是否可以當沖哦！我們可以透過 <a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/docs/trading/library/python/trade/MarginQuota"><code>MarginQuota</code></a> 來確認該股票是否有當沖權限的狀態，程式碼如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 取得行情權限</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init_realtime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用行情 API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">restStock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">marketdata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rest_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 確認您是否有當沖權限 </span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">user_dayTrade_status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">s_mark</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2603"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 須先確認該股票是否可以先買後賣</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol_canDayBuySell </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> restStock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">intraday</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">symbol</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'canBuyDayTrade'</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>確認有當沖權限及股票狀態可行後，我們直接實作一個簡單的策略：開盤買進、收盤賣出！</p>
<p>為了盡可能達成目的，我們需要...</p>
<ol>
<li>開盤時買進，要在 09:00:00 以市價買進。</li>
<li>收盤時賣出，要在 13:25:00 以跌停價賣出。</li>
</ol>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 使用相關套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> datetime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> time</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 用來記錄部位狀態</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 確認是否有當沖權限：Y -&gt; 已開啟先買後賣的當沖權限、B -&gt; 已開啟先買後賣、先賣後買的當沖權限</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> user_dayTrade_status </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'Y'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'B'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"您目前無法進行先買後賣的當沖操作！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 須確認該檔股票是否可以當沖</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> symbol_canDayBuySell </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"您選擇的股票無法進行先買後賣操作，請換檔股票試試！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 首先我們必須要隨時檢查目前的時間是否是這兩個時間點</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">while</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 時間是9點</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">9</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">9</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> position </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> Order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            buy_sell</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> BSAction</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Buy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">PriceType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Market</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 市價買進</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            symbol</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            quantity</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            market_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">MarketType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Common</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            order_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">OrderType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Stock</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 已經買進，避免重複下單</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> position </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># position 為 0 指沒有部位、position 為 1 指有部位</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 已經到收盤時間 且 有部位</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">26</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> position </span><span class="token operator" style="color:#393A34">!=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> OrderObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            buy_sell</span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> BSAction</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Sell</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">PriceType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LimitDown</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 跌停賣出</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            symbol</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            quantity</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            market_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">MarketType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Common</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            order_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">OrderType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DayTradingSell</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 為現股當沖賣出，因此以交易類別來說需要設定為現股當沖賣（DayTradingSell）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 已經賣出，部位歸零</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">break</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="theme-admonition theme-admonition-caution admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>caution</div><div class="admonitionContent_BuS1"><p>請注意！！
若您使用 Colab 進行實作，因 Colab server 的時間與本機端時間可能不一致，因此您須自行調整開收盤時間！</p></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="進階當沖策略的前哨站---接收即時報價">進階當沖策略的前哨站 - 接收即時報價<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy#%E9%80%B2%E9%9A%8E%E7%95%B6%E6%B2%96%E7%AD%96%E7%95%A5%E7%9A%84%E5%89%8D%E5%93%A8%E7%AB%99---%E6%8E%A5%E6%94%B6%E5%8D%B3%E6%99%82%E5%A0%B1%E5%83%B9" class="hash-link" aria-label="Direct link to 進階當沖策略的前哨站 - 接收即時報價" title="Direct link to 進階當沖策略的前哨站 - 接收即時報價">​</a></h3>
<p>接下來我們試著開發進階一些的當沖策略，因策略會需要逐筆檢查觸發價格，所以需要使用到即時報價，富果除了提供 Http API 串接外，也提供了 Websocket 報價服務，以下先演示如何透過 Websocket 取得最新報價：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 取得最新報價</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">_on_new_price</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    json_data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">loads</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 查看整股行情</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">==</span><span class="token string" style="color:#e3116c">"data"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'isTrial'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 避免用到試撮資料</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 更新目前價格</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        now_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'price'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">now_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">create_ws_quote</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    stock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">marketdata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">websocket_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"message"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> _on_new_price</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">subscribe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'channel'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'trades'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token string" style="color:#e3116c">'symbol'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> symbol</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__main__'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    create_ws_quote</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"2330"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="開發進階的當沖策略---orb-策略">開發進階的當沖策略 - ORB 策略<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy#%E9%96%8B%E7%99%BC%E9%80%B2%E9%9A%8E%E7%9A%84%E7%95%B6%E6%B2%96%E7%AD%96%E7%95%A5---orb-%E7%AD%96%E7%95%A5" class="hash-link" aria-label="Direct link to 開發進階的當沖策略 - ORB 策略" title="Direct link to 開發進階的當沖策略 - ORB 策略">​</a></h3>
<p>收到即時報價資訊後，即可開始開發進階的當沖策略囉！</p>
<p>我們今天就來介紹一個相當經典的順勢當沖策略 - ORB 策略，著名著作《短線交易密訣》的作者 Larry Williams 就曾以 ORB 策略拿下世界期貨交易大賽冠軍。</p>
<p>ORB 的定義有許多種，一種是以開盤第一根K棒的高低點定義為 Opening Range，待第一根K棒收完後就開始判斷訊號，突破第一根 K 棒的高點就順勢做多，跌破第一根 K 棒的低點就順勢做空；另一種為當天的開盤價加減某一個比例分別作為做多、做空的訊號觸發價格，而這個比例也是我們可以做為量化研究的目標之一。假設我們發現每日的波動會有連續性，昨日波動 3% 今日就會波動 3% 以上，就可以將昨日的波動值設定為這個比例，當隔日的股價突破 3% 時就順勢做多，並且在收盤時出場。</p>
<p>本文先以第二種版本進行實作，以開盤價 +3% 作為買進依據，在收盤前若有部位則會進行賣出操作；套用上述的交易策略架構，指標就是「開盤價 +3%」，訊號是「向上突破該價位」，方法則是「買進操作」。在未來的課程中將會介紹如何取得歷史資料，屆時也可以實現前一段舉例以昨日波動度做為參考比例的想法。
程式碼如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> json</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> time</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> datetime</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 載入交易 API 相關套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> taishin_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> Order</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> BSAction</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> TimeInForce</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> PriceType</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> MarketType</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">class</span><span class="token plain"> </span><span class="token class-name">ORB_Strategy</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 預計賣出時間</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    SELL_TIME </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">time</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">25</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__init__</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> orb_percent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk </span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">accounts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">_init_fugle_trade</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orb_percent </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> orb_percent </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">100</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">str</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">open_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token comment" style="color:#999988;font-style:italic"># 交易 API 設定檔的部分</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">_init_fugle_trade</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 登入</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        sdk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        accounts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">login</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Your ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Password"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> accounts</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">__place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> action</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> price_type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> order_type</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        order </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> OrderObject</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            buy_sell</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">BSAction</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">price_type</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            price</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">''</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            symbol</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            quantity</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            market_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">MarketType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Common</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            order_type</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">order_type</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">order</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">check_trade_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        user_day_trade_status </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">s_mark</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 須先確認您是否有當沖權限</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> user_day_trade_status </span><span class="token keyword" style="color:#00009f">not</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'Y'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token string" style="color:#e3116c">'B'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"您目前無法進行先買後賣的當沖操作！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">restStock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">marketdata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rest_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 須先確認該股票是否可以先買後賣</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        symbol_can_day_trade </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">restStock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">intraday</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">ticker</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">symbol</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'canBuyDayTrade'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token comment" style="color:#999988;font-style:italic"># 須先確認該股票是否可以先買後賣當沖，若為 True 代表可以先買後賣當沖，會開始執行策略</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> symbol_can_day_trade </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">False</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">raise</span><span class="token plain"> Exception</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"您選擇的股票無法進行先買後賣操作，請換檔股票試試！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">get_open_price</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">open_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">restStock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">intraday</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">quote</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'openPrice'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">run_buy_strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        json_data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">loads</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">message</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'event'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"data"</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token punctuation" style="color:#393A34">{</span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'isTrial'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token boolean" style="color:#36acaa">None</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 取最新成交價</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            now_price </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'price'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token comment" style="color:#999988;font-style:italic"># 策略判斷</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">position </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">and</span><span class="token plain"> now_price </span><span class="token operator" style="color:#393A34">&gt;=</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">open_price </span><span class="token operator" style="color:#393A34">*</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">1</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">+</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">orb_percent</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">__place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BSAction</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Buy</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> PriceType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Market</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Common</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 以市價買進</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">position </span><span class="token operator" style="color:#393A34">+=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">                </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"達開盤價 + </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">orb_percent</span><span class="token string-interpolation interpolation operator" style="color:#393A34">*</span><span class="token string-interpolation interpolation number" style="color:#36acaa">100</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">%  條件：已掛漲停買進 </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">symbol</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> 一張！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">handle_error</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f'error: </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">error</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c">'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">calculate_wait_seconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> target_time</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        now </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">now</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        target_datetime </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">datetime</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">combine</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">now</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">date</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> target_time</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        delta </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> target_datetime </span><span class="token operator" style="color:#393A34">-</span><span class="token plain"> now </span><span class="token comment" style="color:#999988;font-style:italic"># 計算當下與預定賣出時間的時間差</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">return</span><span class="token plain"> </span><span class="token builtin">max</span><span class="token punctuation" style="color:#393A34">(</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> delta</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">total_seconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">run_sell_strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        time</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">calculate_wait_seconds</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">SELL_TIME</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain">  </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">position </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">__place_order</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">BSAction</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">Sell</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> PriceType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">LimitDown</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> OrderType</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">DayTradingSell</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string-interpolation string" style="color:#e3116c">f"即將收盤，已掛跌停賣出 </span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">{</span><span class="token string-interpolation interpolation">self</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">.</span><span class="token string-interpolation interpolation">symbol</span><span class="token string-interpolation interpolation punctuation" style="color:#393A34">}</span><span class="token string-interpolation string" style="color:#e3116c"> 一張！"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    </span><span class="token keyword" style="color:#00009f">def</span><span class="token plain"> </span><span class="token function" style="color:#d73a49">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init_realtime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">marketdata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">websocket_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'message'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run_buy_strategy</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">connect</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">on</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"error"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">handle_error</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">subscribe</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">{</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'channel'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'trades'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            </span><span class="token string" style="color:#e3116c">'symbol'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">symbol</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        </span><span class="token punctuation" style="color:#393A34">}</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        self</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">run_sell_strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:#393A34">==</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'__main__'</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    orb_strategy </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ORB_Strategy</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'2603'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    orb_strategy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">check_trade_status</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    orb_strategy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get_open_price</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    orb_strategy</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">main</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="結語">結語<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/daytrade-strategy#%E7%B5%90%E8%AA%9E" class="hash-link" aria-label="Direct link to 結語" title="Direct link to 結語">​</a></h2>
<p>本週課程我們學到量化交易的基本組成包含「指標」、「訊號」、「方法」，在未來也可以更加活用此架構，並在這個基礎上開發出更能適應市場變化的策略！我們也實際操作了台新行情、交易 API，幫助讀者更了解程式的基本架構，方便後續進行策略的延伸。</p>
<p>ORB 策略是一個可以簡單也可以複雜的動能策略，除了進場的波動比例可以調整外，我們也可以分析及優化「訊號」的部分，例如當波動首次超過比例時先不要進場，待數次折返、突破後再做進場追價，相關的行為都將是我們可以分析的素材，讀者也可以在主觀交易時仔細觀察，在未來學習到回測方法時就可以驗證想法，或許能夠開發出優秀的 ORB 策略！</p>
<p>看更多實戰文章請至<a href="https://developer.fugle.tw/blog/" target="_blank" rel="noopener noreferrer">富果開發者實例應用</a></p>]]></content:encoded>
            <category>Python</category>
            <category>程式交易</category>
            <category>量化交易</category>
            <category>當沖策略</category>
            <category>動能交易策略</category>
            <category>ORB 策略</category>
            <category>台股即時行情</category>
            <category>台股交易API</category>
            <category>程式交易實戰系列</category>
        </item>
        <item>
            <title><![CDATA[策略績效度量的方法（上）]]></title>
            <link>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1</link>
            <guid>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1</guid>
            <pubDate>Mon, 21 Oct 2024 03:14:39 GMT</pubDate>
            <description><![CDATA[歡迎來到 程式交易實戰 的第二堂課，上堂課我們學習到交易策略的基本組成以及簡單的當沖策略，但將想法轉換成程式碼後，我們還需要透過回測驗證及調整，才能夠確保策略的可行性，進而提升實單交易的信心。那到底該如何評估策略是否適合我們呢？]]></description>
            <content:encoded><![CDATA[<p>歡迎來到 <strong>程式交易實戰</strong> 的第二堂課，上堂課我們學習到交易策略的基本組成以及簡單的當沖策略，但將想法轉換成程式碼後，我們還需要透過回測驗證及調整，才能夠確保策略的可行性，進而提升實單交易的信心。那到底該如何評估策略是否適合我們呢？</p>
<p>讀完本篇文，您將學會...</p>
<ul>
<li>熟悉衡量策略績效的方法：報酬率、勝率、賺賠比、獲利因子</li>
<li>實作當沖策略的績效回測</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="如何衡量策略績效">如何衡量策略績效<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E5%A6%82%E4%BD%95%E8%A1%A1%E9%87%8F%E7%AD%96%E7%95%A5%E7%B8%BE%E6%95%88" class="hash-link" aria-label="Direct link to 如何衡量策略績效" title="Direct link to 如何衡量策略績效">​</a></h2>
<p>衡量策略績效的方法有許多，通常會關心策略的「獲利」、「風險」、「交易週期」等數據，本篇文章將介紹獲利評估部分，包含：報酬率、勝率、賺賠比、獲利因子等基礎衡量策略的指標，並依序說明。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="報酬率">報酬率<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E5%A0%B1%E9%85%AC%E7%8E%87" class="hash-link" aria-label="Direct link to 報酬率" title="Direct link to 報酬率">​</a></h3>
<p>獲利是投資人最直接的評估面向，「報酬率」通常是第一個被檢視的指標，為一筆交易中所得到的損益和投入的本金相除得出的結果，其公式如下：</p>
<p>報酬率 =  所得淨利 / 投入本金</p>
<p>報酬率可以幫助我們了解策略在一段固定時間產生獲利的效率為何，當需要比較其他不同週期、不同策略的報酬率時，我們會將其年化，方便檢視策略結果。但不論是報酬率或是年化報酬率都只能反應「開始」和「結束」兩個時間點資金淨值成長幅度，我們無法了解資金在其中變化的過程。舉例來說：</p>
<p>小婷使用了一個策略在過去三年中將本金從 100 萬變成 300 萬，報酬率 200%，十分優秀吧？
但我們看了資金變化的紀錄發現，第一年她就賺了 1000 萬，然後後兩年賠了 700 萬，也就是獲利回吐了 70%，那我們還會覺得這個策略是好的嗎？</p>
<p>由這個情境我們可以知道，報酬率無法完全反映出策略的好壞，必須搭配其他指標一起評估，才能確保策略的可行性！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="勝率">勝率<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E5%8B%9D%E7%8E%87" class="hash-link" aria-label="Direct link to 勝率" title="Direct link to 勝率">​</a></h3>
<p>勝率可以表現出一個交易策略在每次交易時獲利的機率為何，其公式如下：</p>
<p>勝率 =  獲利次數 / 總交易次數</p>
<p>我們設想一個情境，如果有一個策略宣稱「當沖勝率 90%」，那這個策略應該很棒吧？</p>
<p>每天買每天賺，十次只輸一次呢！ 但萬一這十次交易中，前九次都贏了 1 萬元、最後一次輸 20 萬，總虧損是 11 萬元。
由此情境可以發現，高勝率不代表高報酬，更無法透過單一指標反應策略好壞！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="賺賠比賠率">賺賠比（賠率）<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E8%B3%BA%E8%B3%A0%E6%AF%94%E8%B3%A0%E7%8E%87" class="hash-link" aria-label="Direct link to 賺賠比（賠率）" title="Direct link to 賺賠比（賠率）">​</a></h3>
<p>由上一個例子可以發現勝率不是一個絕對重要的指標，我們也可以觀察賺賠比，也就是賠率，其公式如下：</p>
<p>賺賠比 =  交易平均獲利 / ｜交易平均虧損｜</p>
<p>假設有一個策略賺賠比是 5，就代表如果有虧損的情況發生，將平均虧損的值作為 1 個單位，有獲利的情況產生時，平均可以賺 5 個單位。但我們發現，此邏輯沒有考量到虧損、獲利的「次數」；假設獲利的次數很少，虧損的次數很多，看似較高的賺賠比，實際上的報酬卻是虧損的。</p>
<p>舉一組賺賠比為 5 的損益為例：
-100, -100, -100, -100, <strong>500</strong>, -100, -100, -100, -100, -100</p>
<p>最後結算發現損益金額虧損 400 元 ，由此可知，即使是高賺賠比，也未必是個可以賺錢的好策略，但策略結果為高賺賠比同時勝率也較高時，會是一個相當不錯的策略。</p>
<p>我們可以從中了解，勝率與賺賠比有著互補的關係：</p>
<ul>
<li>當勝率較高（&gt; 60%）時，若賺賠比為 1 左右，高機率會產生不錯的策略</li>
<li>當勝率較低（&lt; 40%）時，需要有高賺賠比 (&gt; 3) ，才有機會產生不錯的策略</li>
</ul>
<p>因此，將賺賠比與上一小節的勝率一起搭配，能夠更容易評估策略好壞！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="獲利因子">獲利因子<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E7%8D%B2%E5%88%A9%E5%9B%A0%E5%AD%90" class="hash-link" aria-label="Direct link to 獲利因子" title="Direct link to 獲利因子">​</a></h3>
<p>獲利因子是評估策略品質非常重要的指標！分子是損益紀錄中獲利的總和；分母則是虧損的總和(取絕對值)。可以把它想成「如果我今天賠了一塊錢，我可以賺回多少錢！」，通常獲利因子越高越好，公式如下：</p>
<p>獲利因子 =  獲利總和 / ｜虧損總和｜</p>
<p>以這個損益紀錄做為舉例：
-10, 20, -5, 30, -10, 20, -5, -5, -10, 20</p>
<ul>
<li>勝率：40% = (4/10)</li>
<li>平均賺：22.5 = (20+30+20+20)/4</li>
<li>平均賠：7.5 = (10+5+10+5+5+10)/6</li>
<li>賺賠比：3 = 22.5/7.5</li>
<li>獲利因子：2 = (20+30+20+20)/(10+5+10+5+5+10)</li>
</ul>
<p>獲利因子通常越高越理想，以上述為例，即使勝率不到一半但賺賠比有 3 且獲利因子達到 2，這就代表每輸 1 元，就會賺回 2 元。經由這個例子可以發現，低勝率也可能有高獲利因子；因此獲利因子是能夠反應策略品質的重要指標之一！</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="實作策略績效---以開盤買收盤賣為例">實作策略績效 - 以開盤買收盤賣為例<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E5%AF%A6%E4%BD%9C%E7%AD%96%E7%95%A5%E7%B8%BE%E6%95%88---%E4%BB%A5%E9%96%8B%E7%9B%A4%E8%B2%B7%E6%94%B6%E7%9B%A4%E8%B3%A3%E7%82%BA%E4%BE%8B" class="hash-link" aria-label="Direct link to 實作策略績效 - 以開盤買收盤賣為例" title="Direct link to 實作策略績效 - 以開盤買收盤賣為例">​</a></h2>
<p>根據另一篇<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/">當沖策略 - 開盤買收盤賣</a> 範例
我們現在就透過富果提供的歷史股價資料 <a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/docs/market-data/http-api/historical/candles">Candles API</a> 來回測結果如何吧！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="資料準備">資料準備<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E8%B3%87%E6%96%99%E6%BA%96%E5%82%99" class="hash-link" aria-label="Direct link to 資料準備" title="Direct link to 資料準備">​</a></h3>
<p>在回測之前，我們需要先載入相關套件以及輸入行情 API Token，方便後續程式碼的運行！</p>
<p>我們延續上週的範例，選擇長榮 (<a href="https://www.fugle.tw/ai/2603" target="_blank" rel="noopener noreferrer">2603.tw</a>) 這檔標的，回測時間為 2022 年 8 月的所有交易日，程式碼如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 載入相關套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> taishin_sdk </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> TaishinSDK</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> numpy </span><span class="token keyword" style="color:#00009f">as</span><span class="token plain"> np</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 設定相關參數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2603"</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">start_date </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2022-08-01"</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 選擇資料起始日期</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">end_date </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"2022-08-31"</span><span class="token plain">  </span><span class="token comment" style="color:#999988;font-style:italic"># 選擇資料結束日期</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 透過自己的行情 API key 取得歷史資料</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sdk </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> TaishinSDK</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">accounts </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">login</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"Your ID"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Password"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Path"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"Your Cert Password"</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 取得行情權限</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">init_realtime</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">accounts</span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 使用行情 API</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">stock </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sdk</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">marketdata</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">rest_client</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">stock </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 取得歷史資料</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">history_options </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">{</span><span class="token string" style="color:#e3116c">"symbol"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> symbol</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"from"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> start_date</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"to"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> end_date</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">"timeframe"</span><span class="token punctuation" style="color:#393A34">:</span><span class="token string" style="color:#e3116c">"D"</span><span class="token punctuation" style="color:#393A34">}</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">historical_data </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> stock</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">historical</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">candles</span><span class="token punctuation" style="color:#393A34">(</span><span class="token operator" style="color:#393A34">**</span><span class="token plain">history_options</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="績效指標計算">績效指標計算<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E7%B8%BE%E6%95%88%E6%8C%87%E6%A8%99%E8%A8%88%E7%AE%97" class="hash-link" aria-label="Direct link to 績效指標計算" title="Direct link to 績效指標計算">​</a></h3>
<p>取得歷史資料後，我們在每個交易日以開盤價買進一張並於收盤價賣出進行回測，指標計算已考量交易成本，程式碼如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 損益金額  = 計算開盤買收盤賣的價差 * 1張</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">profit_loss </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token builtin">round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'close'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'open'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> historical_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 以手續費 2.8 折、交易稅減半來計算</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trade_fee </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.001425</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">0.28</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trade_tax </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.003</span><span class="token operator" style="color:#393A34">/</span><span class="token number" style="color:#36acaa">2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 交易成本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trade_cost </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token builtin">round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'close'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token operator" style="color:#393A34">+</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'open'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">1000</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">trade_fee</span><span class="token operator" style="color:#393A34">+</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'close'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">1000</span><span class="token operator" style="color:#393A34">*</span><span class="token plain">trade_tax</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">historical_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 所得淨利 = 損益金額 - 交易成本</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">profit_loss_record </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">np</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_loss</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">np</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">trade_cost</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">tolist</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 投入本金</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">buy_cost </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token builtin">round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'open'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">1000</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> historical_data</span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'data'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>我們透過上述的程式碼找到「所得淨利」以及「投入本金」後，即可計算出每筆交易的報酬率囉！</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 記錄每筆報酬率（已考量交易成本）</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">return_record </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">np</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_loss_record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> np</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">array</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">buy_cost</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">tolist</span><span class="token punctuation" style="color:#393A34">(</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 將報酬率簡化為小數點第四位內</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">return_record </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">map</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x</span><span class="token punctuation" style="color:#393A34">:</span><span class="token builtin">round</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">x</span><span class="token operator" style="color:#393A34">*</span><span class="token number" style="color:#36acaa">100</span><span class="token punctuation" style="color:#393A34">,</span><span class="token number" style="color:#36acaa">2</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">return_record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">return_record</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Response Example</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 每筆交易的報酬率</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">1.03</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.34</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.34</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.08</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">3.38</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.3</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.58</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.94</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">0.33</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.08</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.15</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">3.15</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.25</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.13</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.19</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.72</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.62</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.88</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.63</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.5</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.02</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.5</span><span class="token punctuation" style="color:#393A34">]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>上述結果是每筆交易日期由新到舊排序的報酬率。計算完報酬率後，我們接著透過「所得淨利」來計算「勝率」、「賺賠比」、「獲利因子」！</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 勝率</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 先篩選損益大於 0 的次數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">profit_list </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> profit_loss_record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 勝率 = 損益大於 0 的次數 / 交易總數</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">win_rate </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_loss_record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"勝率："</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">win_rate</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 賺賠比</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 篩選損益小於 0 的結果</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">loss_list </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">list</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">filter</span><span class="token punctuation" style="color:#393A34">(</span><span class="token keyword" style="color:#00009f">lambda</span><span class="token plain"> x </span><span class="token punctuation" style="color:#393A34">:</span><span class="token plain"> x </span><span class="token operator" style="color:#393A34">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> profit_loss_record</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 賺賠比 = 平均賺 / 平均賠</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">odds </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">loss_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token operator" style="color:#393A34">/</span><span class="token builtin">len</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">loss_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"賺賠比："</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">odds</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 獲利因子</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 獲利因子 = 賺總和 / 賠總和</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">profit_factor </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">profit_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">/</span><span class="token plain"> </span><span class="token builtin">abs</span><span class="token punctuation" style="color:#393A34">(</span><span class="token builtin">sum</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">loss_list</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">print</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">"獲利因子"</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">profit_factor</span><span class="token punctuation" style="color:#393A34">)</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>Response Example</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 長榮（2603.tw）回測結果</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">勝率：</span><span class="token number" style="color:#36acaa">39.13</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">%</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">賺賠比：</span><span class="token number" style="color:#36acaa">0.91</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">獲利因子：</span><span class="token number" style="color:#36acaa">0.59</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>若以長榮這檔股票來說，勝率 &lt; 50%、賺賠比 &lt; 1、獲利因子 &lt; 1，很顯然此策略還有很大的優化空間！但千萬別灰心，研發一個好的當沖策略本來就不是太容易，我們換一檔最近 <a href="https://blog.fugle.tw/2022-m31-technology/" target="_blank" rel="noopener noreferrer">關鍵報告</a> 研究的標的 - M31 (<a href="https://www.fugle.tw/ai/6643" target="_blank" rel="noopener noreferrer">6643.tw</a>) 試試：</p>
<p>Response Example</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># M31 (6643.tw）回測結果</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># 每筆交易的報酬率</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">[</span><span class="token number" style="color:#36acaa">8.25</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.68</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.94</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">4.28</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.27</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.74</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.14</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.89</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">3.8</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">3.2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">2.79</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.87</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">5.46</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">10.38</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">6.79</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">1.26</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">4.41</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.16</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">0.57</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.23</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.98</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">1.22</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">-</span><span class="token number" style="color:#36acaa">2.15</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">勝率：</span><span class="token number" style="color:#36acaa">56.52</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">%</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">賺賠比：</span><span class="token number" style="color:#36acaa">1.56</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">獲利因子：</span><span class="token number" style="color:#36acaa">2.03</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p>從 Response Example 發現， M31 這檔股票近期相當適合使用此策略，我們也可以從中了解單一策略難以適用於所有標的，因此後續課程也會帶大家學習如何精進策略的部分，您也可以動手試試您手上庫存的個股或嘗試其他交易策略，回測看看結果如何！</p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="結語">結語<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-1#%E7%B5%90%E8%AA%9E" class="hash-link" aria-label="Direct link to 結語" title="Direct link to 結語">​</a></h2>
<p>本週課程我們學習到策略評估指標的計算方法、意義、盲點，可以發現衡量策略會根據不同風險屬性的交易者而產生不同的衡量基準：</p>
<ul>
<li>若您是個能夠承受一兩次大賺但無數次小賠的交易者，那就不太需要參考勝率，可以將重心聚焦在獲利因子上。</li>
<li>若您希望每筆交易盡量都能獲利時，那高勝率且賺賠比為 1 左右的策略，就相當適合您！</li>
</ul>
<p>未來的課程我們也將圍繞在優化指標的方法及嘗試更多不同的策略，讀者可將策略中使用的指標視為一個一個積木，或許將不同指標堆疊在一起產生出的訊號會比只使用一種更加穩固！</p>
<p>下堂課，我們將帶大家認識市場上更多進階的衡量策略績效指標以及回測常見的波段交易策略，請大家持續鎖定，敬請期待！</p>
<p>若想了解更多評估績效的指標，也可參考 <a href="https://blog.fugle.tw/programmatic-trading-performance/" target="_blank" rel="noopener noreferrer">【關鍵報告】程式交易 Part 2：如何評估策略績效？</a></p>]]></content:encoded>
            <category>Python</category>
            <category>量化交易</category>
            <category>回測指標</category>
            <category>策略衡量</category>
            <category>策略評估</category>
            <category>策略績效</category>
            <category>程式交易實戰系列</category>
            <category>行情 v1.0</category>
        </item>
        <item>
            <title><![CDATA[策略績效度量的方法（下）]]></title>
            <link>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2</link>
            <guid>https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2</guid>
            <pubDate>Mon, 21 Oct 2024 03:14:39 GMT</pubDate>
            <description><![CDATA[歡迎來到 程式交易實戰 的第三堂課，還記得上週學到衡量策略績效的方法嗎？本堂課會繼續介紹衡量策略績效的方法，但會比較著重在衡量「風險」以及「交易週期」的部分。]]></description>
            <content:encoded><![CDATA[<p>歡迎來到 <strong>程式交易實戰</strong> 的第三堂課，還記得上週學到衡量策略績效的方法嗎？本堂課會繼續介紹衡量策略績效的方法，但會比較著重在衡量「風險」以及「交易週期」的部分。
另外，也將帶大家揭開坊間常見技術指標的回測績效！</p>
<p>讀完本篇文，您將學會...</p>
<ul>
<li>熟悉衡量策略績效的方法：最大回檔、夏普比率、與大盤比較</li>
<li>熟悉波段交易策略：均線策略、布林通道策略、 MACD 策略</li>
<li>實作波段策略的績效回測</li>
</ul>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="如何衡量策略績效">如何衡量策略績效<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E5%A6%82%E4%BD%95%E8%A1%A1%E9%87%8F%E7%AD%96%E7%95%A5%E7%B8%BE%E6%95%88" class="hash-link" aria-label="Direct link to 如何衡量策略績效" title="Direct link to 如何衡量策略績效">​</a></h2>
<p>上週文章經由幾個情境的引導，我們了解報酬率並不是唯一的參考指標，過程中資金的變化也十分重要，
因為實單交易時，我們不一定能夠承受自己的真金白銀在交易過程中有這麼大的虧損，所以除了報酬率外，我們也需要能夠反應過程的評估指標。廢話不多說，馬上介紹以下指標給大家參考：</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="最大回檔-max-drawdown-mdd">最大回檔 (Max Drawdown, MDD)<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E6%9C%80%E5%A4%A7%E5%9B%9E%E6%AA%94-max-drawdown-mdd" class="hash-link" aria-label="Direct link to 最大回檔 (Max Drawdown, MDD)" title="Direct link to 最大回檔 (Max Drawdown, MDD)">​</a></h3>
<p>MDD 是量化交易中會特別重視的指標，主要目的是讓交易者能夠先預期此策略的虧損性，了解此策略在過去所隱藏的風險，進而分配合適的資金來執行策略。</p>
<p>說明圖例如下：</p>
<p><img decoding="async" loading="lazy" alt="week3_01" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/mdd-0ba3cb1ff922219a4f87960e5b9d04a5.jpg" width="1239" height="777" class="img_ev3q"></p>
<p>假設有一策略的初始資金為 1000，在達到紅線時資金為 1600，隨後持續下跌到最低點時為 1100，
產生的 MDD 為 (1100/1600-1)*100% = -31.25%</p>
<p>有了以上數據，我們即可自行評估，若使用此策略，是否能夠冷靜地在虧損 30% 後還持續持有，等待後續走勢的反轉呢？</p>
<p>如果最大回檔已超出您平常可承擔的範圍，很可能會導致您未來面對虧損時無法冷靜、忠實的執行這個策略，建議您需降低資金在此策略的投入比例！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="夏普比率sharpe-ratio">夏普比率（Sharpe ratio）<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E5%A4%8F%E6%99%AE%E6%AF%94%E7%8E%87sharpe-ratio" class="hash-link" aria-label="Direct link to 夏普比率（Sharpe ratio）" title="Direct link to 夏普比率（Sharpe ratio）">​</a></h3>
<p>除了 MDD 之外，夏普比率也是一個能夠協助我們評估交易過程資金變化的重要指標之一，公式如下：</p>
<p>夏普比率 =  年化（每日）報酬率 - 無風險利率 / 每筆報酬率之標準差</p>
<p>夏普比率反映在一定的波動（風險）下，可以得到的報酬。 在同樣的風險下，夏普比率較高的策略會有較高的報酬；換句話說，在同樣的報酬下，夏普比率高的策略會承擔較低的風險。</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="與大盤比較">與大盤比較<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E8%88%87%E5%A4%A7%E7%9B%A4%E6%AF%94%E8%BC%83" class="hash-link" aria-label="Direct link to 與大盤比較" title="Direct link to 與大盤比較">​</a></h3>
<p>除了以上指標，大盤也是一個相當重要的參考依據之一！通常當我們得到一個策略的回測結果，我們也會和大盤走勢相比較，假設回測結果差於大盤許多，代表此策略相對沒那麼有意義（不如 buy and hold 0050 等大盤型 ETF 跟著台股市場走），交易付出了許多精力又需承受了交易的緊張感，勢必得獲得比 0050 更優秀的報酬來當作目標吧？</p>
<p>下圖點出兩種交易者的風險及他們所承受的心理壓力，若最後的終點沒有比較高，那何必這麼辛苦呢？所以與大盤報酬比較也是十分重要的。</p>
<p><img decoding="async" loading="lazy" alt="week3_02" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/Holding-1409184d2106ab8d88b9f63ba3d31604.jpg" width="400" height="231" class="img_ev3q"></p>
<p>source: <a href="https://en.bitcoinwiki.org/wiki/Hodl" target="_blank" rel="noopener noreferrer">https://en.bitcoinwiki.org/wiki/Hodl</a></p>
<p>因此 <strong>報酬與夏普比率高於大盤且 MDD 低於大盤，就是我們正在追求的策略！</strong></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="實作策略績效---回測常見的波段策略">實作策略績效 - 回測常見的波段策略<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E5%AF%A6%E4%BD%9C%E7%AD%96%E7%95%A5%E7%B8%BE%E6%95%88---%E5%9B%9E%E6%B8%AC%E5%B8%B8%E8%A6%8B%E7%9A%84%E6%B3%A2%E6%AE%B5%E7%AD%96%E7%95%A5" class="hash-link" aria-label="Direct link to 實作策略績效 - 回測常見的波段策略" title="Direct link to 實作策略績效 - 回測常見的波段策略">​</a></h2>
<p>前兩篇文章已經介紹了當沖策略以及回測當沖策略的績效表現，接著要帶大家了解市場常見的波段策略績效到底是如何呢？</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="均線策略">均線策略<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E5%9D%87%E7%B7%9A%E7%AD%96%E7%95%A5" class="hash-link" aria-label="Direct link to 均線策略" title="Direct link to 均線策略">​</a></h3>
<p>在市場上我們時常聽到投顧老師常說「X日均線、X日均線黃金交叉買進！」，我們就來驗證一下投顧老師的真實性，看看這樣的交易策略在歷史的交易上是否能夠真的獲利呢？</p>
<p>為了驗證這個策略，我們需要開始撰寫程式來進行回測，而回測又需要大量齊全的歷史資料，對於初入量化交易的讀者們來說應該都十分困擾，幸好 <a href="https://ai.finlab.tw/" target="_blank" rel="noopener noreferrer">Finlab 回測平台</a> 已經幫我們準備好相當齊全的回測工具了！本文章的回測程式將以 Finlab 平台展示，讀者們也可以去體驗看看唷！</p>
<p>均線代表的是週期內股價的趨勢，若將多週期的均線做排列可以幫助我們判斷整體的趨勢是屬於「多頭」、「空頭」或是「盤整」階段。均線也可被視為是過去一段時間內投資人買進的「平均成本」，若股價保持在均線的上方，代表在週期內買進的投資人多為獲利的狀態，所以均線可能會發揮支撐的作用；相反的，若股價保持在均線的下方，代表在週期內的投資人多為虧損的狀態，當股價上漲至均線時很可能會有投資人些微認賠賣出而有「解套賣壓」，使得股價又下跌。</p>
<p>簡單解釋均線代表的意義後，我們就知道為什麼常會有人說黃金交叉買進、死亡交叉賣出了，因為他們分別表示著一段可能發生「多頭」、「空頭」行情的起點，以下我們就以「5 日線與 10 日線黃金交叉買進、5 日線與 60 日（季）線死亡交叉賣出」並延續前面幾堂課的測試標的選擇長榮 (<a href="https://www.fugle.tw/ai/2603" target="_blank" rel="noopener noreferrer">2603.tw</a>) 作為範例：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 安裝相關套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">!pip install finlab</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">!pip install talib</span><span class="token operator" style="color:#393A34">-</span><span class="token plain">binary </span><span class="token comment" style="color:#999988;font-style:italic"># 若您尚未安裝 TA-Lib 計算技術指標的套件，建議您先安裝</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token comment" style="color:#999988;font-style:italic"># 載入相關套件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> finlab </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> data</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">from</span><span class="token plain"> finlab</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">backtest </span><span class="token keyword" style="color:#00009f">import</span><span class="token plain"> sim</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">close</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'price:收盤價'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ma5 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">indicator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'SMA'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resample</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'D'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> timeperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">5</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ma10 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">indicator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'SMA'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resample</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'D'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> timeperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">10</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">ma60 </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">indicator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'SMA'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resample</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'D'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> timeperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">60</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">entries </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ma5 </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ma10  </span><span class="token comment" style="color:#999988;font-style:italic"># 進場條件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> ma60 </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> ma5    </span><span class="token comment" style="color:#999988;font-style:italic"># 出場條件</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'2603'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain">     </span><span class="token comment" style="color:#999988;font-style:italic"># 可換成其他個股或多檔個股</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> entries</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hold_until</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">exits</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">report </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">position</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> upload</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> mae_mfe_window </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">'均線策略範例'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token comment" style="color:#999988;font-style:italic"># 查看視覺化回測結果</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trade_record </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> report</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">trades </span><span class="token comment" style="color:#999988;font-style:italic"># 可查看透過此策略的逐筆交易紀錄</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="week3_MA" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/ma_strategy-6fdfd42f76ea540da44176b4a0ad7681.png" width="1797" height="372" class="img_ev3q">
上圖顯示均線策略模擬買賣長榮的回測結果，我們從中發現雖然近兩年的報酬明顯優於大盤，但夏普值只有 0.4 代表當承受 1% 風險時，只能得到 0.4% 的報酬； MDD 也高達 75.5%，若您從過去持續追隨此策略的過程中，須先承受 75.5% 的虧損，才有機會在近兩年獲得優於大盤的報酬，這其實對投資人來說相當不容易，多少人在不斷虧損時，就開始自我檢視甚至是捨棄掉此交易策略了呢？</p>
<p>了解均線後，接著我們來認識加入統計概念的技術指標 - 布林通道！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="布林通道策略">布林通道策略<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E5%B8%83%E6%9E%97%E9%80%9A%E9%81%93%E7%AD%96%E7%95%A5" class="hash-link" aria-label="Direct link to 布林通道策略" title="Direct link to 布林通道策略">​</a></h3>
<p>布林通道（BBand）也是一個非常知名的指標，它結合了均線和標準差的概念進行交易，分為上軌、中軸、下軌等 3 條線。</p>
<ul>
<li>上軌線：壓力線，由中軌線 + 數倍標準差所形成</li>
<li>中軸線：數日均線</li>
<li>下軌線：壓力線，由中軌線 - 數倍標準差所形成</li>
</ul>
<p><img decoding="async" loading="lazy" alt="week3_03" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/BB-c61a9a34c8190b8c5dcb954be6fae27a.jpg" width="1220" height="538" class="img_ev3q"></p>
<p>布林通道策略分為逆勢交易與順勢交易：</p>
<ul>
<li>
<p>逆勢交易策略</p>
<p>逆勢策略有個前提假設是認為「股價會在一定區間內震盪」，當股價到達上軌線代表股價接近超漲很可能會回檔；當股價到達下軌線代表股價接近超跌很可能會反彈。所以逆勢策略的研究重點為尋找「震盪的範圍」，它可能可以透過統計股價在一段期間內波動的分布或是以某些指標作為判斷方法。</p>
</li>
<li>
<p>順勢交易策略</p>
<p>富果直送的 &lt; <a href="https://blog.fugle.tw/how-to-use-program-trading/" target="_blank" rel="noopener noreferrer">技術指標介紹</a> &gt; 曾提到，當大趨勢發生時，股價往往會偏離原有的軌道區間；因此當股價突破上軌線時順勢買進，當股價跌破下軌線時順勢賣出，作為跟隨趨勢的策略操作邏輯。</p>
</li>
</ul>
<p>以下使用 20 日（月）線和 2 倍標準差等參數作為布林通道順勢策略的範例，讀者在了解基本概念後，也立即動手試試吧！</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">close</span><span class="token operator" style="color:#393A34">=</span><span class="token plain">data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'price:收盤價'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">upperband</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> middleband</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> lowerband </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">indicator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'BBANDS'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resample</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'D'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nbdevup</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> nbdevdn</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">2.0</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> timeperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">20</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">entries </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> close </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> upperband  </span><span class="token comment" style="color:#999988;font-style:italic"># 收盤價大於上軌線</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> lowerband </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> close    </span><span class="token comment" style="color:#999988;font-style:italic"># 收盤價小於下軌線</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'2603'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> entries</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hold_until</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">exits</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">report </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">position</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> upload</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> mae_mfe_window</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'布林通道範例'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trade_record </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> report</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">trades </span><span class="token comment" style="color:#999988;font-style:italic"># 可查看透過此策略的逐筆交易紀錄</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="week3_04" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/bb_strategy-6fd848281ea9dc571ae2b7240a551b87.png" width="1790" height="343" class="img_ev3q">
回測結果顯示，與均線策略相比，此標的較適合布林通道順勢策略，但 MDD 61.7% 也不算低，也須留意自身是否能承受此虧損！</p>
<h3 class="anchor anchorWithStickyNavbar_LWe7" id="macd-策略">MACD 策略<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#macd-%E7%AD%96%E7%95%A5" class="hash-link" aria-label="Direct link to MACD 策略" title="Direct link to MACD 策略">​</a></h3>
<p>MACD 指標也是市場上投資人常用的指標之ㄧ，「 MACD 黃金交叉、柱體翻紅」等都是被時常拿來做為交易訊號使用，MACD 指標也分為 3 個子項：</p>
<ul>
<li>快線：兩條不同週期的 EMA 之差</li>
<li>慢線：任意週期的快線 EMA</li>
<li>MACD：（快線 - 慢線）* 2</li>
</ul>
<p>MACD 可協助投資人判斷目前股價的狀態為何，若快線和慢線出現黃金交叉，通常代表預期發生一段上漲行情；若快線和慢線出現死亡交叉，則代表預期有一段下跌行情。</p>
<p>若以上為真實發生的情況，那我們即可將此訊號作為買賣依據，採取「黃金交叉買進，死亡交叉賣出」策略作為範例如下：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">close </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">get</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'price:收盤價'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">MACD</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> MACDsignal</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> MACDhist </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> data</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">indicator</span><span class="token punctuation" style="color:#393A34">(</span><span class="token string" style="color:#e3116c">'MACD'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> resample</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'D'</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> fastperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">12</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> slowperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">26</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">signalperiod</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">9</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">entries </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> MACD </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> MACDsignal</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">exits </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> MACDsignal </span><span class="token operator" style="color:#393A34">&gt;</span><span class="token plain"> MACD</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">symbol </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">[</span><span class="token string" style="color:#e3116c">'2603'</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">position </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> entries</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">hold_until</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">exits</span><span class="token punctuation" style="color:#393A34">)</span><span class="token punctuation" style="color:#393A34">[</span><span class="token plain">symbol</span><span class="token punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">report </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> sim</span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain">position</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">upload</span><span class="token operator" style="color:#393A34">=</span><span class="token boolean" style="color:#36acaa">True</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain">mae_mfe_window</span><span class="token operator" style="color:#393A34">=</span><span class="token number" style="color:#36acaa">40</span><span class="token punctuation" style="color:#393A34">,</span><span class="token plain"> name</span><span class="token operator" style="color:#393A34">=</span><span class="token string" style="color:#e3116c">'MACD'</span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">trade_record </span><span class="token operator" style="color:#393A34">=</span><span class="token plain"> report</span><span class="token punctuation" style="color:#393A34">.</span><span class="token plain">trades</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg viewBox="0 0 24 24" class="copyButtonIcon_y97N"><path fill="currentColor" d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg viewBox="0 0 24 24" class="copyButtonSuccessIcon_LjdS"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div>
<p><img decoding="async" loading="lazy" alt="week3_05" src="https://ml-fugle-api.masterlink.com.tw/FugleSDK/assets/images/macd_strategy-9fa8b1131753994fe325b57f7fccbf0d.png" width="1795" height="370" class="img_ev3q">
回測結果顯示，一樣有 MDD 稍大的問題。但對於波動較大的股票，您可以試試加入停損機制，在損失固定比例時先認賠出場，或許能大幅降低 MDD！</p>
<p>推薦延伸閱讀：<a href="https://blog.fugle.tw/how-to-use-program-trading/" target="_blank" rel="noopener noreferrer">【關鍵報告】想用程式自動下單，需要了解哪些常見技術指標與原理？</a></p>
<h2 class="anchor anchorWithStickyNavbar_LWe7" id="結語">結語<a href="https://ml-fugle-api.masterlink.com.tw/FugleSDK/blog/strategy-measurement-2#%E7%B5%90%E8%AA%9E" class="hash-link" aria-label="Direct link to 結語" title="Direct link to 結語">​</a></h2>
<p>本週課程我們認識了量化交易中最常用來評估風險的指標包含「夏普比率」、「最大回檔」，能夠讓投資人預先評估資金的變化率是否能夠接受，並可以藉此進一步調整策略或是資金分配比例。另外，我們也實作了 3 種常見的技術指標以及了解其原理與意義。下一步，讀者可以透過 Finlab 回測平台更方便地進行參數修改或將不同指標疊加做成新的訊號來進行回測，快去試試吧！</p>]]></content:encoded>
            <category>Python</category>
            <category>量化交易</category>
            <category>回測指標</category>
            <category>策略衡量</category>
            <category>策略評估</category>
            <category>波段策略</category>
            <category>程式交易實戰系列</category>
        </item>
    </channel>
</rss>