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

<channel>
	<title>AI看股票 &#8211; FinLab</title>
	<atom:link href="https://www.finlab.tw/category/ai%E7%9C%8B%E8%82%A1%E7%A5%A8/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.finlab.tw</link>
	<description>深入淺出的量化投資，讓你在在茫茫股海中，找到專屬於自己的投資方法</description>
	<lastBuildDate>Wed, 08 Jan 2025 06:34:39 +0000</lastBuildDate>
	<language>zh-TW</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.0.9</generator>

<image>
	<url>https://www.finlab.tw/wp-content/uploads/2020/07/favicon.png</url>
	<title>AI看股票 &#8211; FinLab</title>
	<link>https://www.finlab.tw</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">179699571</site>	<item>
		<title>Qlib 與 FinLab 整合，展現 AI 選股的神蹟。</title>
		<link>https://www.finlab.tw/qlib-finlab-implementation-source-code/</link>
					<comments>https://www.finlab.tw/qlib-finlab-implementation-source-code/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Mon, 06 Jan 2025 15:47:50 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[VIP限定]]></category>
		<category><![CDATA[機器學習]]></category>
		<category><![CDATA[歷史回測]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[選股策略]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=6410</guid>

					<description><![CDATA[雖然 FinLab 支援 Qlib 很久了，但一直沒有好好的跟大家介紹如何使用，於是乎，最近中小股票真的表現令 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<figure class="wp-block-image size-large"><img width="1024" height="585" src="https://www.finlab.tw/wp-content/uploads/2025/01/image-1-1024x585.png" alt="image 1" class="wp-image-6412" srcset="https://www.finlab.tw/wp-content/uploads/2025/01/image-1-1024x585.png 1024w, https://www.finlab.tw/wp-content/uploads/2025/01/image-1-300x171.png 300w, https://www.finlab.tw/wp-content/uploads/2025/01/image-1-768x439.png 768w, https://www.finlab.tw/wp-content/uploads/2025/01/image-1-1536x878.png 1536w, https://www.finlab.tw/wp-content/uploads/2025/01/image-1.png 1792w" sizes="(max-width: 1024px) 100vw, 1024px" title="Qlib 與 FinLab 整合，展現 AI 選股的神蹟。 1"></figure>



<p>雖然 FinLab 支援 Qlib 很久了，但一直沒有好好的跟大家介紹如何使用，於是乎，最近中小股票真的表現令人窒息，所以就好好做研究，相信總會時來運轉的。台股權值股與中小型股差異，來到20年來最大，台積電創新高之際，已經有很多股票跌破年線了，老實說，虧很多嗎？是還好，但就是很悶，心情不受影響是不可能的，然而人生在世，就是來體驗這些喜怒哀樂，就讓我們繼續努力，看結果如何，雖然很煩，但是我還是對於未來非常樂觀！</p>



<h1>Qlib</h1>



<p>Qlib 是由微軟開源的量化投資工具庫，專注於基於機器學習的投資研究。它提供了資料處理、策略建模、回測及評估的一站式解決方案。</p>



<h1>Qlib 在 FinLab 中的應用</h1>



<p>Qlib 的演算法有非常多前人研究的心血，不是我們能夠短時間比擬的，所以要站在巨人的肩膀上，才能事半功倍！Qlib 的最大特點，就是在於</p>



<p>1. 特徵的建構 </p>



<p>2. 模型的多樣選擇</p>



<p>基於以上兩點，你都可以透過 FinLab package 將它們給接入進來使用。然而我覺得 Qlib 架構比較難與其它的生態系或 Package 整合，因為整個框架以程式系統來說，是比較封閉，沒辦法與傳統的 sklearn，或是 lgb、xgb 整合，所以才需要使用 FinLab 將其解放。</p>



<h1>Qlib vs FinLab</h1>



<p>Qlib 是通用型的 package，所以特徵都是使用價格來製作，而 FinLab 本身支援台股多樣的資料與指標，所以延伸的部分非常多！歡迎將以下的功能當成基礎版本，自己加入更多特徵來增進模型的運測能力！</p>



<h1>安裝</h1>



<p>接下來，將會使用 Colab 來進行設定，但以下範例需要 Colab Pro 版本，才能順利運行，因為 RAM 的需求太大了。假如各位沒有買 Colab 付費版，也可以在自己的主機上試試看，初次安裝，需要有以下的套件：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">!pip install finlab &gt; log.txt
!pip install ta-lib-bin &gt; log.txt
!pip install catboost &gt; log.txt</code></pre>



<p>上面的程式中，安裝 talib 的方法，是使用 ta-lib-bin，是 colab 上特別的安裝方法，假如你是在桌機上使用，要用</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">conda install conda-forge::ta-lib</code></pre>



<p>來取代。</p>



<h1>安裝 Qlib</h1>



<p>安裝 Qlib 的方式，有很多種，一種是直接將 github 上的最新版本下載下來安裝：</p>



<pre class="wp-block-code"><code lang="bash" class="language-bash">!git clone https://github.com/microsoft/qlib.git
%cd qlib
!make install
!pip install .
%cd ..</code></pre>



<p>要注意，以上的程式碼是在 terminal 中使用，不是 python 語法喔！</p>



<h1>製作特徵</h1>



<p>我們可以使用 qlib 內建的功能，產生出158種，或是360種不同的價格訊號，只需要三行即可完成：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.ml import qlib as q


q.init()
q.dump()
f158 = q.alpha("Alpha158")</code></pre>



<p>然而這樣的資料量，實在是太大了，所以我們可以將資料的頻率改成「週」，大約可以減少80％的資料量，這樣的訓練方式，勉強能夠在 Colab Pro 上執行（50GB RAM）。假如是 alpha360 資料集，基本上會需要上百GB，就請有這樣硬體能力的玩家自行上手了！</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.ml import label as mll
from finlab.ml import feature as mlf

features = mlf.combine({
    'qlib': f158,
}, resample='W')
labels = mll.return_percentage(features.index, period=2)

is_train = features.index.get_level_values('datetime') &lt; '2020-01-01'</code></pre>



<p>接下來，我們發現，f158之中，有一個特徵都是 NaN（也就是空值），我們必須要將它刪除：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">features = features.drop('VWAP0', axis=1)</code></pre>



<p>目前原因不明，應該還有一些 BUG 需要釐清，也可以利用 `mlf.combine` 自行計算補上 VWAP 的資料。</p>



<h1>訓練模型</h1>



<p>訓練模型的環節，FinLab 提供一個超級好用的功能</p>



<pre class="wp-block-code"><code class="">model_templates = q.get_models()</code></pre>



<p>就可以將 qlib 所有的模型導入，並且直接用來訓練：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import gc
import numpy as np
import pickle
from finlab.ml import qlib as q

model_templates = q.get_models()
is_train = features.index.get_level_values('datetime') &lt; '2020-01-01'


model_path = './models.pkl'

if os.path.isfile(model_path):
  with open(model_path, 'rb') as f:
    models = pickle.load(f)
else:
  models = {}


for name, Model in model_templates.items():
    print(name)

    if name in models:
      continue

    if name == 'DNNModel':
      continue

    try:
      X_train = features.loc[is_train]
      y_train = labels.loc[is_train]
      model = Model()
      model.fit(X_train, y_train)

    except:
      notna = X_train.replace([np.inf, -np.inf], np.nan).notna().all(axis=1) &amp; y_train.replace([np.inf, -np.inf], np.nan).notna()
      X_train = X_train.loc[notna]
      y_train = y_train.loc[notna]
      model = Model()
      model.fit(X_train, y_train)


    with open(f'models.pkl', 'wb') as f:
      pickle.dump(models, f)

    models[name] = model

    gc.collect()</code></pre>



<p>訓練的過程中，可能訓練到一半 RAM 會掛掉，所以每次訓練好新的模型，程式會將所有模型都儲存起來，方便下一次直接調用。訓練時，會將 training data 自動切出 validation data，來確保訓練時避免 overfitting。</p>



<h1>測試</h1>



<p>最後我們可以回測看看模型得效果如何：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import pickle
import numpy as np

model_path = './models.pkl'

if os.path.isfile(model_path):
  with open(model_path, 'rb') as f:
    models = pickle.load(f)


ys = {}

for name, model in models.items():

  try:
    y = model.predict(features[~is_train])
    ys[name] = y
  except:
    y = model.predict(features[~is_train].replace([np.inf, -np.inf], np.nan).fillna(0))
    ys[name] = y

from finlab.backtest import sim
import matplotlib.pyplot as plt
from finlab import data

reports = {}
for name, y in ys.items():
  print(name)
  with data.universe('TSE_OTC'):
    close = data.get('price:收盤價')
    report = sim(y[close.notna()].is_largest(20), resample='M', upload=False)
    reports[name] = report
    report.creturn.plot(label=name)

plt.legend()
plt.show()</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="543" height="407" src="https://www.finlab.tw/wp-content/uploads/2025/01/image.png" alt="image" class="wp-image-6411" srcset="https://www.finlab.tw/wp-content/uploads/2025/01/image.png 543w, https://www.finlab.tw/wp-content/uploads/2025/01/image-300x225.png 300w" sizes="(max-width: 543px) 100vw, 543px" title="Qlib 與 FinLab 整合，展現 AI 選股的神蹟。 2"></figure>



<p>其實效果算是滿不錯的，實單上，經過更多的調教，我的經驗，會比當前的成果更好，有興趣的玩家可以多多嘗試！其中一些策略回測甚至可以有 40％到50％的平均年報酬率。</p>



<p>話說最近 AI 模型，這幾個月的表現可能都不太好，然而換一種想法，就是當前可能不太適合使用 AI 模型吧～不代表它以後都沒效果，而是時運不佳的關係，反而讓我的心裡有點釋懷。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="937" src="https://www.finlab.tw/wp-content/uploads/2025/01/image-2-1024x937.png" alt="image 2" class="wp-image-6413" srcset="https://www.finlab.tw/wp-content/uploads/2025/01/image-2-1024x937.png 1024w, https://www.finlab.tw/wp-content/uploads/2025/01/image-2-300x275.png 300w, https://www.finlab.tw/wp-content/uploads/2025/01/image-2-768x703.png 768w, https://www.finlab.tw/wp-content/uploads/2025/01/image-2.png 1464w" sizes="(max-width: 1024px) 100vw, 1024px" title="Qlib 與 FinLab 整合，展現 AI 選股的神蹟。 3"></figure>



<p>由上表可知，我們可以選擇 LightGBM 模型來選股，效果最好。</p>



<p></p>



<p>以下示範一個年平均報酬 +50%的策略，這絕對是價值數萬元的程式碼，就這麼隨便的放在這邊讓大家取用，請你跟我說，在世界上的哪一個角落，可以找到這麼神乎其技的AI模型選股績效？找不到吧！只好請大家繼續支持 FinLab，讓我們可以活下去，謝謝：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">y = ys['LGBModel']

with data.universe('TSE_OTC'):

  close = data.get('price:收盤價')
  vol = data.get('price:成交股數')
  pos = y[((vol.average(20) &gt; 200_000)) &amp; (close &gt;= close.rolling(10).max())].is_largest(10)
  report = sim(pos, resample='M', upload=False)
  report.display()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="994" src="https://www.finlab.tw/wp-content/uploads/2025/01/image-3-1024x994.png" alt="image 3" class="wp-image-6414" srcset="https://www.finlab.tw/wp-content/uploads/2025/01/image-3-1024x994.png 1024w, https://www.finlab.tw/wp-content/uploads/2025/01/image-3-300x291.png 300w, https://www.finlab.tw/wp-content/uploads/2025/01/image-3-768x746.png 768w, https://www.finlab.tw/wp-content/uploads/2025/01/image-3-1536x1491.png 1536w, https://www.finlab.tw/wp-content/uploads/2025/01/image-3.png 1574w" sizes="(max-width: 1024px) 100vw, 1024px" title="Qlib 與 FinLab 整合，展現 AI 選股的神蹟。 4"></figure>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/qlib-finlab-implementation-source-code/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6410</post-id>	</item>
		<item>
		<title>揭開 OpenFE 在量化交易中的神秘面紗：高效自動化特徵生成的原理與實踐</title>
		<link>https://www.finlab.tw/openfe-auto-gene-feature/</link>
					<comments>https://www.finlab.tw/openfe-auto-gene-feature/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Sat, 14 Sep 2024 19:45:55 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[FinLab 量化平台]]></category>
		<category><![CDATA[PYTHON財經]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[VIP限定]]></category>
		<category><![CDATA[程式交易]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=6315</guid>

					<description><![CDATA[量化交易的核心在於數據分析和模型建構，而特徵工程是連接原始數據與模型性能的關鍵環節。隨著數據規模和複雜度的增加，手動特徵工程變得越來越困難且耗時。OpenFE（Open Feature Engineering）作為一個高效的自動化特徵生成工具，為量化交易中的特徵工程提供了全新的解決方案。本文將詳細介紹 OpenFE 的原理，並探討其在量化交易中的應用。]]></description>
										<content:encoded><![CDATA[
<p>量化交易的核心在於數據分析和模型建構，而特徵工程是連接原始數據與模型性能的關鍵環節。隨著數據規模和複雜度的增加，手動特徵工程變得越來越困難且耗時。OpenFE（Open Feature Engineering）作為一個高效的自動化特徵生成工具，為量化交易中的特徵工程提供了全新的解決方案。本文將詳細介紹 OpenFE 的原理，並探討其在量化交易中的應用。</p>



<h2>一、OpenFE 簡介</h2>



<p>OpenFE 是一個針對表格數據的自動化特徵生成框架，具有以下優勢：</p>



<ul><li>高效性：支持並行計算，能夠快速生成大量候選特徵。</li><li>易用性：僅需幾行代碼即可完成特徵生成和數據轉換。</li><li>豐富的操作符：涵蓋23種有用且有效的操作符，用於生成候選特徵。</li><li>多任務支持：適用於二分類、多分類和回歸任務。</li><li>自動處理缺失值和類別型特徵：無需手動處理數據中的缺失值和類別型特徵。</li></ul>



<p>OpenFE 的有效性已在多個公共數據集上得到驗證，甚至在 IEEE-CIS Fraud Detection Kaggle 比賽中，使用 OpenFE 生成的特徵配合簡單的 XGBoost 模型，擊敗了99.3%的參賽團隊。</p>



<h2>OpenFE 原理</h2>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="492" src="https://www.finlab.tw/wp-content/uploads/2024/09/image-1024x492.png" alt="image" class="wp-image-6316" srcset="https://www.finlab.tw/wp-content/uploads/2024/09/image-1024x492.png 1024w, https://www.finlab.tw/wp-content/uploads/2024/09/image-300x144.png 300w, https://www.finlab.tw/wp-content/uploads/2024/09/image-768x369.png 768w, https://www.finlab.tw/wp-content/uploads/2024/09/image-1536x737.png 1536w, https://www.finlab.tw/wp-content/uploads/2024/09/image.png 1762w" sizes="(max-width: 1024px) 100vw, 1024px" title="揭開 OpenFE 在量化交易中的神秘面紗：高效自動化特徵生成的原理與實踐 5"><figcaption>OpenFE 示意圖</figcaption></figure>



<p>這是 OpenFE（Open Feature Engineering）的演算法示意圖，該演算法旨在自動化特徵工程的過程。以下是主要步驟的介紹與講解：</p>



<ul><li>資料集 (dataset)：<ul><li>首先，將資料集分為數值型特徵 (numerical features)與類別型特徵 (categorical features)。</li><li>數值型特徵包含連續數值資料，如價格、溫度等；類別型特徵則包含分類資料，如性別、地區等。</li></ul></li><li>模型 (model)：<ul><li>原始數據會被餵入模型進行訓練，並生成預測結果 (predictions)。這裡的模型可以是任何機器學習模型，如決策樹、隨機森林等。</li></ul></li><li>算子 (operators)：<ul><li>對數值與類別特徵應用一系列算子進行組合與轉換，這些算子包括基本的數學運算（加、減、乘、除）、統計運算（最小值、最大值）、以及更複雜的操作（如 Combine、GroupBy 等）。這些操作生成候選特徵集 (candidate feature set)。</li></ul></li><li>FeatureBoost：<ul><li>經過算子轉換後的候選特徵集會通過FeatureBoost進行評估與篩選，旨在提升模型性能。這裡的<strong>評估 (Evaluation)</strong>包括特徵的重要性分析，<strong>修剪 (pruning)和屬性分析 (attribution)</strong>則用於移除不重要或重複的特徵。</li></ul></li><li>加入最重要特徵 (add top-ranked features)：<ul><li>最後，經過篩選後的頂級特徵將被重新加入模型中，以進行下一輪的訓練和優化。</li></ul></li></ul>



<p>此流程中的關鍵步驟是將特徵自動化生成並經過多次篩選與優化，最終提升模型的預測能力，並減少人工進行特徵工程的工作量。</p>



<h2>程式實做</h2>



<h3>安裝相關套件</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">!pip install finlab &gt; log.txt
!pip install ta-lib-bin &gt; log.txt
!pip install openfe &gt; log.txt</code></pre>



<p>這部分安裝所需的套件：</p>



<ul><li><strong><code>finlab</code></strong>：提供台灣股市數據及特徵工程模組的工具包。</li><li><strong><code>ta-lib-bin</code></strong>：一個技術分析函數庫，專門處理金融數據。</li><li><strong><code>openfe</code></strong>：用於自動化特徵工程的套件。</li></ul>



<h3>下載資料並且定義函數</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.ml import feature as mlf
from finlab import data

cap = data.get('etl:market_value') # 市值
vol = data.get('price:成交股數')    # 成交量
close = data.get('price:收盤價')    # 收盤價
benchmark = data.get('benchmark_return:發行量加權股價報酬指數').squeeze()  # 大盤</code></pre>



<ul><li>cap：市場價值（市值）。</li><li>vol：成交股數。</li><li>close：收盤價。</li><li>benchmark：台灣加權股價報酬指數，作為市場基準。</li></ul>



<pre class="wp-block-code"><code lang="python" class="language-python">avg = lambda n: close / close.average(n)
conv = lambda n: (close / close.shift(n) - 1) * (benchmark / benchmark.shift(n) - 1)
sub = lambda n: (close / close.shift(n) - 1) - (benchmark / benchmark.shift(n) - 1)
bch = lambda n: (close.notna()) * (benchmark / benchmark.shift(n) - 1)
std = lambda n: close.pct_change().rolling(n).std().rank(axis=1, pct=True)</code></pre>



<p>定義多個特徵生成函數：</p>



<ul><li>avg：計算移動平均。</li><li>conv：計算收盤價和基準指數的轉換率。</li><li>sub：收盤價與基準之間的差異</li><li>bch：基準變動。</li><li>std：波動率。</li></ul>



<h3>生成特徵</h3>



<p>這段程式碼生成一系列新的特徵，並將其按周頻率重新取樣：</p>



<p>包括交易量、移動平均、基準相關差異、波動率等特徵：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">features = mlf.combine({
    'vol': vol.average(20),
    'avg5': avg(5),
    'avg20': avg(20),
    'avg60': avg(60),
    'avg120': avg(120),
    'avg250': avg(250),

    'sub5': sub(5),
    'sub10': sub(10),
    'sub20': sub(20),
    'sub60': sub(60),
    'sub120': sub(120),

    'bch5': bch(5),
    'bch10': bch(10),
    'bch20': bch(20),
    'bch60': bch(60),
    'bch120': bch(120),

    'conv5': conv(5),
    'conv10': conv(10),
    'conv20': conv(20),
    'conv60': conv(60),
    'conv120': conv(120),

    'std5': std(5),
    'std20': std(20),
    'std60': std(60),
    'cap': cap
}, resample='W')</code></pre>



<h3>計算預測標籤</h3>



<p>利用 <code>finlab.ml.label</code> 計算超額報酬，取樣頻率為 4 週：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.ml import label as mll

labels = mll.excess_over_mean(features.index, resample='4W')</code></pre>



<h3>去除缺失，切割訓練與測試集</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">is_train = features.index.get_level_values('datetime') &lt; '2021-01-01'
notna = (features.isna().sum(axis=1) == 0) &amp; (labels.notna())
train_x = features.loc[is_train &amp; notna]
train_y = labels.loc[is_train &amp; notna]
test_x = features.loc[~is_train &amp; notna]
test_y = labels.loc[~is_train &amp; notna]</code></pre>



<h3>使用 OpenFE 進行特徵工程</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">%%capture
from openfe import OpenFE, transform

n_jobs = 4

ofe = OpenFE()
features2 = ofe.fit(data=train_x.reset_index(drop=True),
                   label=train_y.reset_index(drop=True),
                   n_jobs=n_jobs,verbose=False, n_data_blocks=128, min_candidate_features=100)

train_x2, test_x2 = transform(train_x.reset_index(drop=True),
                            test_x.reset_index(drop=True),
                            features2, n_jobs=1)
train_x2.index = train_y.index
test_x2.index = test_y.index
</code></pre>



<p>使用 OpenFE 進行特徵工程，透過自動化生成更多特徵：</p>



<ul><li>ofe.fit：在訓練資料上進行特徵生成。</li><li>transform：對訓練和測試集進行轉換，應用新生成的特徵。</li></ul>



<h3>比對效果，擇優</h3>



<pre class="wp-block-code"><code lang="python" class="language-python">from openfe import OpenFE, tree_to_formula, transform
import numpy as np

new_features = []
for i, feature in enumerate(ofe.new_features_list):
  formula = tree_to_formula(feature)
  f_series = feature.calculate(features)

  notna = f_series.notna() &amp; labels.notna()
  ic = np.corrcoef(f_series[notna].values, labels[notna].values)[0][1]

  print(i, formula, ic)
  new_features.append((formula, ic))</code></pre>



<p>將自動生成的特徵轉換為公式，並計算每個特徵與標籤的相關係數（IC），記錄每個特徵及其IC值。</p>



<h3>顯示結果</h3>



<p>最終輸出顯示了篩選後的特徵及其與標籤之間的相關係數 (IC, Information Coefficient)，並進行排序。以下是最終輸出的部分：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import pandas as pd
pd.DataFrame(new_features).sort_values(1)</code></pre>



<pre class="wp-block-code"><code class="">負向相關特徵 - 其 IC 為負，代表該特徵與股價成負相關

residual(close120)	-0.033315
(avg5-conv20)	-0.027197
(avg5-conv10)	-0.022775
(avg5-conv5)	-0.019866
(bch20*conv20)	-0.019637

正向相關特徵 - 其 IC 為正，代表該特徵與股價成正相關

min(conv20,conv120)	0.013777
(sub10*bch20)	0.021785
min(conv20,conv60)	0.022378
round(conv120)	0.025027
(bch60/cap)	0.026309</code></pre>



<h3>結果分析</h3>



<ul><li><strong>正相關特徵</strong>：<ul><li><code>(bch60/cap)</code>：IC 值為 0.026309，這個特徵表示基準60期變動率與市值之間的比值，這是最具正向預測能力的特徵，能夠幫助識別相對市值較小但基準表現相對強勁的股票。</li><li><code>round(conv120)</code>：IC 值為 0.025027，代表120期轉換率的四捨五入值，這也是一個有助於預測的正相關特徵，代表轉換率變動具有一定預測力。</li><li><strong>其他</strong>：如 <code>min(conv20,conv60)</code> 和 <code>sub10*bch20</code> 這些特徵也展示了正相關，雖然相關性稍低，但仍對預測有幫助。</li></ul></li><li><strong>負相關特徵</strong>：<ul><li><strong><code>residual(close120)</code></strong>：IC 為 -0.033315，這是與收盤價120期相關的殘差，表明該特徵與收益有負相關性。換句話說，這類股票的表現可能會較差。</li><li><strong>其他負相關特徵</strong>如 <code>(close5-conv20)</code> 和 <code>(close5-conv10)</code> 顯示收盤價與轉換率之間的關係可能不利於預測，這些特徵可能代表潛在的虧損或價格波動的風險。</li></ul></li></ul>



<h3>策略實做</h3>



<p>有了上述的新的因子，創建了一個特徵 f，它是基於 bch(60)（60 期基準變動率）與 cap（市值）的比值，表示相對於市值的基準變動。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">from finlab.dataframe import FinlabDataFrame
from finlab import backtest

f = bch(60) / cap
pos = f.is_largest(100)

r = backtest.sim(pos, resample='4W', upload=False)
r.display()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="1011" src="https://www.finlab.tw/wp-content/uploads/2024/09/image-1-1024x1011.png" alt="image 1" class="wp-image-6317" srcset="https://www.finlab.tw/wp-content/uploads/2024/09/image-1-1024x1011.png 1024w, https://www.finlab.tw/wp-content/uploads/2024/09/image-1-300x296.png 300w, https://www.finlab.tw/wp-content/uploads/2024/09/image-1-768x758.png 768w, https://www.finlab.tw/wp-content/uploads/2024/09/image-1.png 1390w" sizes="(max-width: 1024px) 100vw, 1024px" title="揭開 OpenFE 在量化交易中的神秘面紗：高效自動化特徵生成的原理與實踐 6"><figcaption>歷史報酬</figcaption></figure>



<h2>延伸討論與結論</h2>



<p>本次我們探討了如何利用 OpenFE 進行自動化特徵工程，並運用 Finlab 平台的工具進行金融數據處理與回測。OpenFE 是一個強大的自動化特徵工程工具，它可以從原始數據生成許多複合特徵，並經過篩選來提升模型的預測準確性。其核心流程包括特徵生成、預測、評估、修剪以及重要特徵的篩選，從而減少人工操作的負擔。</p>



<p>透過程式碼的實現，我們首先導入並安裝了所需的套件，包括 finlab、ta-lib-bin、openfe。接著，利用 Finlab 提取台灣股市的數據如市值、成交股數、收盤價以及基準指數，並定義了多個自訂的特徵生成函數，例如移動平均、轉換率、差異和波動率等。這些特徵被結合成一個週期性重取樣的特徵集。</p>



<p>隨後，我們利用 OpenFE 進一步自動化生成新特徵，並根據與標籤的相關性進行篩選。透過相關係數的計算，篩選出對預測最有用的特徵。在經過排序後，最終選出與標籤具有最高正相關的特徵，如 (bch60/cap)。</p>



<p>在回測部分，我們基於所選出的特徵進行了一個簡單的選股策略。利用 bch(60) 與 cap 的比值，選出比值最大的 100 支股票，並使用 Finlab 的 backtest 模組進行回測，設定每 4 週進行一次重取樣，最終展示回測結果，為策略效益提供直觀的分析。</p>



<p>透過這一整套流程，無論是 OpenFE 的特徵生成與篩選，還是 Finlab 的數據處理與回測功能，都展示了其強大的工具性與靈活性，能夠幫助使用者在金融數據分析與量化策略開發中事半功倍。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/openfe-auto-gene-feature/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">6315</post-id>	</item>
		<item>
		<title>僅用財報製作 30% 年報酬的美股多空對沖策略</title>
		<link>https://www.finlab.tw/financial-report-strategy-long-short/</link>
					<comments>https://www.finlab.tw/financial-report-strategy-long-short/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Sat, 07 Oct 2023 13:40:25 +0000</pubDate>
				<category><![CDATA[股票策略]]></category>
		<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[FinLab 量化平台]]></category>
		<category><![CDATA[Python新手教學]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[歷史回測]]></category>
		<category><![CDATA[程式交易]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=5806</guid>

					<description><![CDATA[本文中產生了 1000 組多空財務指標，並且利用財務指標進行多空對沖策略，回測績效高達年報酬 30%！在全球資 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>本文中產生了 1000 組多空財務指標，並且利用財務指標進行多空對沖策略，回測績效高達年報酬 30%！在全球資本市場中，美國股市佔據著不可忽視的地位，其規模與活躍度長期以來都是全球最領先的。尤其在科技、金融和消費等多個重要行業，美股市場都匯聚了眾多具有全球影響力的領先企業。對投資者而言，深入了解並善用財務指標來分析和評估美股市場的投資機會，是提高投資效益、降低投資風險的重要手段。FinLab 網站中有一個 <a href="https://ai.finlab.tw/strategyview/?uid=TJN4FDuqrwU8DML7DAjUYFIMutp2&amp;sid=%E8%B2%A1%E5%A0%B1%E6%8C%87%E6%A8%9920%E5%A4%A7" target="_blank" rel="noopener">財報 20 大的選股</a> 策略，是否能夠用在美股之中呢？效果如何呢？就讓我們來研究研究。</p>



<h2>美股策略研究簡單嗎？</h2>



<p>財務指標是反映企業經營狀況、財務健康和投資價值的重要工具。透過財務指標的分析，我們可以更加清晰地理解企業的盈利能力、資產負債狀態、營運效率以及現金流狀況，從而作出更為理性和科學的投資決策。然而當前美股已經有非常多的量化交易團隊與機構從中找尋超額報酬，所以我們在實驗中，發現並沒有像是台股一樣簡單做得出好策略。</p>



<h2>台股美股的差異？</h2>



<p>台股一般來說，我們用均線濾網就可以很有效的篩選股票，用 EPS 一定是要找 EPS 每季上升的的股票標的。然而在美股竟然發生一百八十度的轉變，例如，美股跟台股在均線的使用上，幾乎是完全相反，也就是很容易有均線回歸，漲多了就跌回去的狀況發生。而創新高的 EPS 不要以為接下來股價也會創新高，因為當天股價可能都已經反應完畢了，甚至過度反應而導致超漲。</p>



<h2>美股的財報指標還有用嗎？</h2>



<p>這就是這篇文章想要來探討的，我們使用 quandl 所有的美股指標，來預測看看究竟是否有能力做出不錯的策略。假如你是 VIP 會員，可以參考我們的財務指標 20 大策略，並且嘗試換成美股版本喔！</p>



<h2>資料分析</h2>



<p>首先，我們先取得想要來研究的資料，由於資料授權的問題，目前只能在  <a href="https://ai.finlab.tw" target="_blank" rel="noopener">finlab平台</a> 上進行程式的撰寫，不過我們近期想到一些方法來避免授權問題，當前請大家不要使用 colab ，而是直接用網頁版來執行，不然會無法運行喔！可以透過以下的程式碼拿到你想要的財報指標，我們以四種財報指標為例：</p>



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

menu = """非控制股權	data.get('us_fundamental:accoci')	float	
資產總額	data.get('us_fundamental:assets')	float	
流動資產	data.get('us_fundamental:assetsc')	float	
非流動資產	data.get('us_fundamental:assetsnc')	float	
"""

with data.us_universe('Common Stock'):
    code = menu.split('\t')[1::3]
    name = [n.replace('\n', '') for n in menu.split('\t')[0::3]]
    for n, c in zip(name, code):
        dfs[n] = eval(c)</code></pre>



<p>接下來，我們想要進行資料處理，讓財報資料做斜率、取變異等方法，提取出可能有效的資料：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">
new_feat_dfs = {}

for fname, df in dfs.items():

    if df.dtypes[0] != 'float64':
        continue

    print(fname)

    avg2 = df.average(2)
    avg4 = df.average(4)
    new_feat_dfs[fname + '_avg2'] = avg2
    new_feat_dfs[fname + '_avg4'] = avg4
    new_feat_dfs[fname + '_diff4'] = df / df.shift(4)
    new_feat_dfs[fname + '_1_avg4'] = df / avg4
    new_feat_dfs[fname + '_avg2_avg4'] = avg2 / avg4
    new_feat_dfs[fname + '_avg2_diff4'] = avg2 / avg2.shift(4)
    new_feat_dfs[fname + '_avg4_diff4'] = avg4 / avg4.shift(4)
    new_feat_dfs[fname + '_df_max4'] = df / df.rolling(4).max()
    new_feat_dfs[fname + '_df_max8'] = df / df.rolling(8).max()


feat_dfs = {**dfs, **new_feat_dfs}

with data.us_universe('Common Stock'):
    feat_dfs['money_flow'] = data.get('us_price:close') * data.get('us_price:volume')

del new_feat_dfs</code></pre>



<p>然而我們也不知道這些資料，效果究竟如何，所以可以利用機器學習的方式進行 feature 分析：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">from finlab.ml import feature

features = feature.combine(feat_dfs, resample='Q')

# 過濾成交量太小的股票
features = features[features['money_flow'] > 1e7]
features.head()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="362" src="https://www.finlab.tw/wp-content/uploads/2023/10/image-3-1024x362.png" alt="image 3" class="wp-image-5807" srcset="https://www.finlab.tw/wp-content/uploads/2023/10/image-3-1024x362.png 1024w, https://www.finlab.tw/wp-content/uploads/2023/10/image-3-300x106.png 300w, https://www.finlab.tw/wp-content/uploads/2023/10/image-3-768x272.png 768w, https://www.finlab.tw/wp-content/uploads/2023/10/image-3.png 1328w" sizes="(max-width: 1024px) 100vw, 1024px" title="僅用財報製作 30% 年報酬的美股多空對沖策略 7"><figcaption>資料整理成機器學習中的特徵格式</figcaption></figure>



<p>除了有這些財報的特徵外，我們也必須知道這些數值會如何影響將來的股價，所以我們可以將上圖每一個橫軸所對映的未來長跌幅給計算出來，並且計算相關性 <code>corr</code> 假如 1 代表正相關，該數值高意味著未來會上漲，假如是 -1 就代表負相關，數值高反而意味著未來會跌：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">from finlab.ml import label

labels = label.return_percentage(features.index, period=60, trade_at_price='open')

corr = features.corrwith(labels).dropna().sort_values()</code></pre>



<p>雖然給大家的例子中只有一小部分的資料，但我們自己實驗是產生了 1000 組不同的財報數值。我們只想要提取有用的資料，將其他沒用的資料過濾。也就是我們想找高度相關，或高度負相關的特徵，來進行股票的預測：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">print(corr.head(10))
print(corr.tail(10))</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="531" height="554" src="https://www.finlab.tw/wp-content/uploads/2023/10/image-4.png" alt="image 4" class="wp-image-5808" srcset="https://www.finlab.tw/wp-content/uploads/2023/10/image-4.png 531w, https://www.finlab.tw/wp-content/uploads/2023/10/image-4-288x300.png 288w" sizes="(max-width: 531px) 100vw, 531px" title="僅用財報製作 30% 年報酬的美股多空對沖策略 8"><figcaption>最負相關，最正相關</figcaption></figure>



<p>上圖發現一些有趣的現象，我們挑最低負相關，與最高相關的來說明。</p>



<h2>市值衝吧！</h2>



<p>在這個實驗中，「市值_1_avg4」是最高度相關的，其代表的運算方式，是「市值 / 近四季的平均市值」。為什麼近四季市值增加越多，代表未來報酬率越好呢？若一家公司近期的營運表現優於過去，其市值可能會上升，從而使得「市值 / 近四季的平均市值」的比例增加。這也反映了市場對公司未來盈利能力的信心增強。</p>



<h2>小心獲利太多啦！</h2>



<p>在上圖當中，營收_max4 是最負相關的資訊，代表此數值越高，未來股價越危險，潛在隱含可能營收會有均值回歸的效應產生，導致股價下跌。</p>



<h2>數據所代表的含意，跟常識不符合時，如何是好？</h2>



<p>當然聽數據的呀！因為金融市場裡並沒有什麼常識可言，以常識來說期貨原油結算應該是正的？（但曾經發生負的狀況）。以常識來說，股價漲太高應該不要再追了（但在台股完全就是要追上去，實驗與實際都如此證明）。為什麼常識不管用？因為在一個效率市場下，任何所謂的「常識」都會被機構交易者各種套利，例如一個常識： ROE 高是好股票，所以當公司發布時，大家知道這個常識而瞬間買入此股票，造成必須要去比拼高頻交易，看誰買的早，就能用比較低的價格買到，才能比別人更早去交易這個「常識」，但對於我這種慢半拍的人來說，當我發現這家公司很好時，股價已經反映了財報，所以這個「常識」就不符合當前科技技術橫行的市場了。雖然速度比不贏別人，那就只好去探勘一些「反常識」，「反常識」沒有人做，所以也是有很多潛在的獲利機會！但是反常識也很容易因為數據處理、探勘的方式不正確，而意外的被產生出來，所以有好的資料驗證步驟，是非常重要的，不過有點離題，我們接著繼續來做策略。</p>



<h2>去除相似的資料</h2>



<p>在上圖中我們可以看到「市值_1_avg4」以及「市值_df_max4」，其實這兩筆資料是用類似的方法來計算的，雖然都很重要，但只要用其中一種即可，沒必要兩個都用，可以把其中一筆換成其他更有意義的數據，所以我們可以驗證 features 財報數據間的相關性，將相關性高的財報數據給剔除，留下比較有代表性的即可：</p>



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

cor_matrix = features[corr.index].corr().abs()
upper_tri = cor_matrix.where(np.triu(np.ones(cor_matrix.shape),k=1).astype(bool))
to_drop = [column for column in upper_tri.columns if any(upper_tri[column] > 0.8)]

long_names = corr[corr.index.isin(to_drop)].tail(30)
short_names = corr[corr.index.isin(to_drop)].head(30)</code></pre>



<p>上面程式碼中， 我們找到 long_names 以及 short_names 代表與未來價格高度正相關的指標，以及高度負相關的指標。我們將這些指標對於每個股票去評分，並且加總起來：</p>



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

score = sum([feat_dfs[f].rank(axis=1, pct=True).fillna(0) for f in long_names.index])
short_score = sum([feat_dfs[f].rank(axis=1, pct=True).fillna(0) for f in short_names.index])

score = score.index_str_to_date()
short_score = short_score.index_str_to_date()</code></pre>



<p>就可以得到每個股票的總分了！最後將總分最高的股票做多、最低的股票做空，就可以獲得更穩定的報酬率：</p>



<pre class="wp-block-code"><code lang="python" class="language-python line-numbers">import numpy as np
from finlab.dataframe import FinlabDataFrame


with data.us_universe('Common Stock'):
    close = data.get('us_price:close')
    vol = data.get('us_price:volume')

    cond1 = (close * vol).average(60) > 1e7
    cond2 = vol > 5000
    
    cond = cond1 * cond2 * (close.notna())
    pos = (FinlabDataFrame(score-short_score) * cond).is_largest(10).astype(int) * 2
    neg_pos = (FinlabDataFrame(score-short_score) * cond).is_smallest(20).astype(int)

    pos *= close.pct_change().rolling(20).std()
    neg_pos *= close.pct_change().rolling(20).std()

    pos /= pos.sum(axis=1)
    neg_pos /= neg_pos.sum(axis=1)

    total_pos = pos - neg_pos
    
    r0 = backtest.sim(total_pos, resample='W', position_limit=0.1)</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="479" src="https://www.finlab.tw/wp-content/uploads/2023/10/image-5-1024x479.png" alt="image 5" class="wp-image-5809" srcset="https://www.finlab.tw/wp-content/uploads/2023/10/image-5-1024x479.png 1024w, https://www.finlab.tw/wp-content/uploads/2023/10/image-5-300x140.png 300w, https://www.finlab.tw/wp-content/uploads/2023/10/image-5-768x359.png 768w, https://www.finlab.tw/wp-content/uploads/2023/10/image-5.png 1150w" sizes="(max-width: 1024px) 100vw, 1024px" title="僅用財報製作 30% 年報酬的美股多空對沖策略 9"><figcaption>美股策略實做</figcaption></figure>



<p>不過這個策略滿奇怪的，2020年以前都不太會賺，雖然也沒賠太多錢（相較於純做多的策略）但我自己個人會有點忍受不了這麼多年的績效平平，可能還有改進的空間，假如讀者知道為什麼2020 年前後會有這麼大的差異，歡迎留言或在 Discord 跟我們一起討論！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/financial-report-strategy-long-short/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">5806</post-id>	</item>
		<item>
		<title>低波動本益成長比策略 &#124; MAE_MFE 機器學習選股</title>
		<link>https://www.finlab.tw/low_volatility_stratgy_by_mae_mfe_ml/</link>
					<comments>https://www.finlab.tw/low_volatility_stratgy_by_mae_mfe_ml/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Mon, 07 Nov 2022 23:33:00 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[FinLab 量化平台]]></category>
		<category><![CDATA[VIP文章]]></category>
		<category><![CDATA[基本面分析]]></category>
		<category><![CDATA[技術面]]></category>
		<category><![CDATA[籌碼面]]></category>
		<category><![CDATA[選股策略]]></category>
		<category><![CDATA[Kmeans]]></category>
		<category><![CDATA[MAE_MFE]]></category>
		<category><![CDATA[PEG]]></category>
		<category><![CDATA[scikit-learn]]></category>
		<category><![CDATA[VIP限定]]></category>
		<category><![CDATA[低波動]]></category>
		<category><![CDATA[台股]]></category>
		<category><![CDATA[本益成長比]]></category>
		<category><![CDATA[機器學習]]></category>
		<category><![CDATA[決策樹]]></category>
		<category><![CDATA[混淆矩陣]]></category>
		<category><![CDATA[融資使用率]]></category>
		<category><![CDATA[進場波動]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3687</guid>

					<description><![CDATA[有時我們有了初始策略輪廓，寫出來發現年化報酬率不錯，但夏普率不高、最大回撤率過大，若拿去實戰，持有歷程會遇上信心考驗，績效跳動範圍也大。有沒有辦法讓策略能夠報酬率更高、波動更低？

本篇範例會利用基礎的機器學習演算法 Kmeans 分群 mae_mfe 指標，製作決策樹使用的 Labels，優化原本的"本益成長比"策略，示範 scikit-learn 搭配 finlab 模組是多麼強大又簡單！]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size">有時我們有了初始策略輪廓，寫出來發現年化報酬率不錯，但夏普率不高、最大回撤率過大，若拿去實戰，持有歷程會遇上信心考驗，績效跳動範圍也大。有沒有辦法讓策略能夠報酬率更高、波動更低？ 但選股條件那麼多，單因子策略不停去 try error 組合很沒效率，這時就是&#8221;機器學習選股&#8221;的優勢，高效分析影響性大的特徵。<br>很多人對如何將機器學習應用到投資領域很有興趣，但實作要怎麼設計？用報酬率當Label真的好嗎？太難的演算法又看不懂或難消化，到底怎麼辦？<br>本篇範例會利用基礎的機器學習演算法 Kmeans 分群 mae_mfe 指標，製作決策樹使用的 Labels，優化原本的&#8221;本益成長比&#8221;策略，示範 scikit-learn 搭配 finlab 模組是多麼強大又簡單！</p>



<h2>選定待優化的策略</h2>



<p class="has-medium-font-size"><a href="https://www.finlab.tw/finlab-tw-stock-peg-strategy/">進化後的本益比｜本益成長比選股策略</a> 一文中用簡單的單因子回歸產生一個簡潔卻有效的選股策略。為了製造比較多的回測樣本，我們將之前的策略調成每月選取20檔標的。<br><strong>留意本篇的測試資料結果可能隨著資料集增長而產生差異，回測僅供參考。</strong><br>回測年化報酬率23%是不錯的水準，夏普率勉強優於大盤的0.9，但最大回撤率蠻高的，報酬率曲線震盪有點劇烈，好幾次回檔30%，實戰的持有過程肯定會備受考驗，可以加上哪些條件解決波動的問題呢？</p>



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

pe = data.get('price_earning_ratio:本益比')
rev = data.get('monthly_revenue:當月營收')
rev_ma3 = rev.average(3)
rev_ma12 = rev.average(12)
營業利益成長率 = data.get('fundamental_features:營業利益成長率').deadline()
peg = (pe/營業利益成長率)
cond1 = rev_ma3/rev_ma12 &gt; 1.1
cond2 = rev/rev.shift(1) &gt; 0.9

cond_all = cond1 &amp; cond2
result = peg*(cond_all)
position = result[result&gt;0].is_smallest(20).reindex(rev.index_str_to_date().index, method='ffill')


report = sim(position=position,name="本益成長比", fee_ratio=1.425/1000/3,upload=True,mae_mfe_window=30,position_limit=0.05)
report.display()</code></pre>



<figure class="wp-container-2 wp-block-gallery-1 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="645" data-id="4735" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.19.18-1024x645.png" alt="截圖 2022 10 30 下午9.19.18" class="wp-image-4735" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.19.18-1024x645.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.19.18-300x189.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.19.18-768x483.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.19.18.png 1390w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 10"></figure>
</figure>



<p class="has-medium-font-size"><br></p>



<h2>製作波動性 Labels </h2>



<p class="has-medium-font-size">給對的學習目標很重要！選擇比努力更重要！<br>一般機器學習選股策略使用報酬率做 label ，但演算法只會判斷報酬率的賺賠高低，並沒有辦法學習波動特性，若給定的 label 一開始就有所限制，再怎麼學也是無法跳脫只追求高報酬的風險。 </p>



<h3>MAE &amp; MFE</h3>



<p class="has-medium-font-size"><a href="https://www.finlab.tw/display_mae_mfe_analysis/">揭開策略的波動面紗｜MAE&amp;MFE分析圖組使用指南</a> 一文中解釋了 MAE 與 MFE 的可幫助我們分析策略波動和基本應用，我們可以輕鬆由FinLab模組中的<a href="https://doc.finlab.tw/reference/analysis/#finlab.analysis.Report.get_trades" target="_blank" rel="noopener"> <code>report.get_trades()</code></a> 取得策略標的持有歷程的 MAE 與 MFE 與其他交易資料。<a href="https://doc.finlab.tw/reference/analysis/#finlab.analysis.Report.display_mae_mfe_analysis" target="_blank" rel="noopener"> <code>report.display_mae_mfe_analysis()</code></a> 則可顯示波動率分析圖組，幫助我們觀察波動分佈。</p>



<figure class="wp-container-4 wp-block-gallery-3 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1200" height="1200" data-id="4729" src="https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1.png" alt="newplot 1" class="wp-image-4729" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1.png 1200w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1-300x300.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1-1024x1024.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1-150x150.png 150w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1-768x768.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/newplot-1-600x600.png 600w" sizes="(max-width: 1200px) 100vw, 1200px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 11"></figure>
</figure>



<p class="has-medium-font-size"><br>從上圖中的 GMFE / MAE 子圖可以發現波動分佈分為三塊：</p>



<ul class="has-medium-font-size"><li>最多聚集的一塊是在左下角小賺小賠的標的。</li><li>策略獲利的標的有些是「高 GMFE 低 MAE (往上高波動、往下低波動)」，給我們帶來極高獲利，這在趨勢策略較常出現，是我們想保留的。</li><li>虧損的標的大多是 「低 GMFE 高 MAE  (往下高波動、往上低波動)」的族群，有些標的持有紀錄還有 -50% 以上不利跌幅，這些會影響到策略的波動穩定度，是我們想淘汰的拖油瓶。</li></ul>



<p class="has-medium-font-size">若能用MAE &amp; MFE 取代報酬率作為 label，就可以讓模型學習判斷波動度與報酬率，若三個分群有特徵共通性，那之後做機器學習可能可找到有效分類 「高 GMFE 低 MAE 」 與 「低 GMFE 高 MAE」的特徵。</p>



<h3>Kmeans 分群</h3>



<p class="has-medium-font-size">如何界定「高 GMFE 低 MAE 」與 「低 GMFE 高 MAE 」 ？<br>這時<a href="https://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html" target="_blank" rel="noopener">非監督學習演算法Kmeans</a>就可以粉墨登場，幫我們去做分群的動作，讓模型自動幫我們藉由 GMFE 低 MAE 兩項特徵分出三個群集。<br><strong>注意分群給的數字具有隨機性！</strong>比如「高 GMFE 低 MAE 」可能分類標註為1，下次執行跳為2。<br>在模型訓練前，因用有少數大幅獲利與多數群集分太開，先使用 <code>from sklearn.preprocessing import StandardScaler</code> 將資料做正規化，將資料傳入 Kmeans 分群，並將結果繪圖呈現分佈。<br>我們把預設值 y_pred 放入原本的 trade dataframe，設為 group，就完成 label 標記了，輸出結果可以發現 Kmeans 成功幫我們分出三個顏色區塊。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

from sklearn.preprocessing import StandardScaler

def scale_data(data):
    scaler = StandardScaler().fit(data)
    X_scaled = scaler.transform(data)
    return X_scaled

scale_mae = scale_data(trades['mae'].values.reshape(-1, 1))
scale_gmfe = scale_data(trades['gmfe'].values.reshape(-1, 1))


plt.figure(figsize = (8, 8))
random_state = 100
X = np.hstack((scale_mae,scale_gmfe))
y_pred = KMeans(n_clusters=3,random_state=random_state).fit_predict(X)

scatter = plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.legend(*scatter.legend_elements())
plt.title("mae_gmfe kmeans")
plt.xlabel("mae")
plt.ylabel("gmfe")</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="942" height="855" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.00.52.png" alt="截圖 2022 10 30 下午9.00.52" class="wp-image-4731" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.00.52.png 942w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.00.52-300x272.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.00.52-768x697.png 768w" sizes="(max-width: 942px) 100vw, 942px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 12"></figure>



<p class="has-medium-font-size">為了讓模型更專注於「高 GMFE 低 MAE 」與 「低 GMFE 高 MAE 」 的學習，只保留 group 為1、2 (藍綠點) 的部分，我們把白點的區塊視為不影響大局的雜訊，藍色和綠色的點才是影響策略波動的關鍵</p>



<pre class="wp-block-code"><code lang="python" class="language-python">cluster_trades = trades.copy()
cluster_trades['group'] = y_pred
cluster_trades['stock_id'] = cluster_trades['stock_id'].apply(lambda s:s[:s.index(' ')])
ana_targets = cluster_trades[cluster_trades['group'].isin([1,2])]
ana_targets = ana_targets.reset_index().set_index(['stock_id', 'entry_sig_date'])</code></pre>



<p class="has-medium-font-size"></p>



<h2>決策樹-探索低波動因子</h2>



<p class="has-medium-font-size">標注完了 label 後，就可以進行下一步，尋找有沒有選股條件能辨識label ，這就要換監督式學習登場。這部分的程式主要參考 <a href="https://hahow.in/courses/5b9d3a6dca498a001e917383/discussions" target="_blank" rel="noopener">Python 理財：打造自己的 AI 股票理專課程</a>  單元 3-7-隨機森林選股策略實作，因資料量級較小，把隨機森林換成決策樹。</p>



<h3>製作 Features</h3>



<p class="has-medium-font-size">將想測試的資料或可能的低波動因子並成 dataframe 準備進入模型訓練，特徵可以使用 <a href="https://ai.finlab.tw/database" target="_blank" rel="noopener">Finlab 資料庫</a> 取得，並將資料以 2019 年為分界點，切成訓練及測試資料集。</p>



<figure class="wp-block-image"><img alt=""/></figure>



<h3>模型測試結果</h3>



<p class="has-medium-font-size">將資料集套入 sklearn 決策樹，驗證目標為label=1的集群(低 GMFE 高 MAE )，若找到機率越高，能有效躲避波動。<br>測試結果放入 <a href="https://www.ycc.idv.tw/confusion-matrix.html" target="_blank" rel="noopener">confusion-matrix</a> 驗證結果，抓出「低 GMFE 高 MAE 」的準確度達75%，預測45(34+11) 次內有34次正確。<br>指標意義詳見～<a href="https://medium.com/nlp-tsupei/precision-recall-f1-score%E7%B0%A1%E5%96%AE%E4%BB%8B%E7%B4%B9-f87baa82a47" target="_blank" rel="noopener">Precision, Recall, F1-score簡單介紹</a>。<br></p>



<pre class="wp-block-code"><code lang="python" class="language-python">import pandas as pd
from sklearn import metrics
from sklearn.tree import DecisionTreeClassifier

label = ana_targets[ana_targets['mae']&gt; ana_targets['gmfe']]['group'].values[0]
features_name = list(features.keys())
cf = DecisionTreeClassifier(max_depth=3)
cf.fit(dataset_train[features_name], dataset_train['group'] ==label)


prediction = cf.predict(dataset_test[features_name])
confusion_matrix = metrics.confusion_matrix(dataset_test['group'] == label, prediction)
tn, fp, fn, tp = confusion_matrix.ravel()
confusion_matrix = np.array([[tp, fp],[fn, tn]])


print('f1 score:',metrics.f1_score(dataset_test['group'] == label, prediction))
print('precision score(p):',metrics.precision_score(dataset_test['group'] == label, prediction))
print('recall score(p):',metrics.recall_score(dataset_test['group'] == label, prediction))


plt.figure(figsize=(10, 6))
sns.set(font_scale=2)

ax = sns.heatmap(confusion_matrix, annot=True, cmap='Blues')
ax.set_title('Confusion Matrix with labels\n\n');
ax.set_xlabel('Actual Values')
ax.set_ylabel('Predicted Values');

## Ticket labels - List must be in alphabetical order
ax.xaxis.set_ticklabels(['True','False'])
ax.yaxis.set_ticklabels(['True','False'])

## Display the visualization of the Confusion Matrix.
plt.show()
</code></pre>



<figure class="wp-container-6 wp-block-gallery-5 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="954" data-id="4866" src="https://www.finlab.tw/wp-content/uploads/2022/11/截圖-2022-11-13-下午7.16.34-1024x954.png" alt="截圖 2022 11 13 下午7.16.34" class="wp-image-4866" srcset="https://www.finlab.tw/wp-content/uploads/2022/11/截圖-2022-11-13-下午7.16.34-1024x954.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/11/截圖-2022-11-13-下午7.16.34-300x280.png 300w, https://www.finlab.tw/wp-content/uploads/2022/11/截圖-2022-11-13-下午7.16.34-768x716.png 768w, https://www.finlab.tw/wp-content/uploads/2022/11/截圖-2022-11-13-下午7.16.34.png 1422w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 13"></figure>
</figure>



<p></p>



<h3>因子重要性</h3>



<p class="has-medium-font-size"><code>from sklearn.tree import plot_tree</code>  可繪製出決策樹的機器學習選股決策流程，最上頭的X[8]為&#8217;融資使用率&#8217;，使用33.6當數值分界點，X序列等同features_name排序。<br><code>cf.feature_importances_</code>  可得知重要因子的影響性分數。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="751" src="https://www.finlab.tw/wp-content/uploads/2022/10/下載-1-1024x751.png" alt="下載 1" class="wp-image-4733" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/下載-1-1024x751.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/下載-1-300x220.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/下載-1-768x563.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/下載-1.png 1130w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 14"><figcaption>決策樹分類流程</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="409" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.10.47-1024x409.png" alt="截圖 2022 10 30 下午9.10.47" class="wp-image-4734" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.10.47-1024x409.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.10.47-300x120.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.10.47-768x307.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.10.47-1536x613.png 1536w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.10.47.png 2034w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 15"></figure>



<p class="has-medium-font-size"></p>



<h3>優化測試</h3>



<p class="has-medium-font-size">參考 features_name 、 plot_tree 設定條件數值，加入條件到原本的策略，檢測能否優化。<br>檔數、部位上限、週期設定不變，只加上選股條件。數據會因資料集擴增而有差異，僅供參考。</p>



<h4 class="has-medium-font-size">低融資使用率</h4>



<p class="has-medium-font-size">加入 (融資使用率 &lt;= 34) 條件。</p>



<figure class="wp-container-8 wp-block-gallery-7 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="690" data-id="4737" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.26.22-1024x690.png" alt="截圖 2022 10 30 下午9.26.22" class="wp-image-4737" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.26.22-1024x690.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.26.22-300x202.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.26.22-768x518.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.26.22.png 1383w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 16"></figure>
</figure>



<h4 class="has-medium-font-size">低進場波動率</h4>



<p class="has-medium-font-size">加入 ( entry_volatility &lt;= 0.032) 條件。</p>



<figure class="wp-container-10 wp-block-gallery-9 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="701" data-id="4738" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.29.17-1024x701.png" alt="截圖 2022 10 30 下午9.29.17" class="wp-image-4738" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.29.17-1024x701.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.29.17-300x205.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.29.17-768x526.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.29.17.png 1385w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 17"></figure>
</figure>



<h4 class="has-medium-font-size"> </h4>



<h4 class="has-medium-font-size">低融資使用率 ＆ 低進場波動率<br></h4>



<figure class="wp-container-12 wp-block-gallery-11 wp-block-gallery has-nested-images columns-default is-cropped">
<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="692" data-id="4736" src="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.24.29-1024x692.png" alt="截圖 2022 10 30 下午9.24.29" class="wp-image-4736" srcset="https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.24.29-1024x692.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.24.29-300x203.png 300w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.24.29-768x519.png 768w, https://www.finlab.tw/wp-content/uploads/2022/10/截圖-2022-10-30-下午9.24.29.png 1387w" sizes="(max-width: 1024px) 100vw, 1024px" title="低波動本益成長比策略 | MAE_MFE 機器學習選股 18"></figure>
</figure>



<h4 class="has-medium-font-size"><br></h4>



<h3>回測分析</h3>



<p class="has-medium-font-size">單因子中「低融資使用率」效果最強，明顯提升「夏普率」，「最大回撤率」則變動不大。可能代表原本的策略蠻多虧損或大幅低檔震盪的源在選到高融資使用率的股票，這類股票通常是市場的大波動熱門股，持有者偏向短線操作，很不穩定。<br><br>「低進場波動度」雖然讓「年化報酬率」減少，但是「夏普率」和「最大回撤率」提升效果比「低融資使用率」更優。低進場波動度代表買入時波動穩定，比較不會碰上已漲一大段的飛天股之後的乖離過大修正，若之後要加上停損條件，也比較不會在持有初期頻繁停損被洗出場。<br><br>「低融資使用率」若與「低進場波動度」因子結合，「夏普率」 從原先策略的 0.9 拉升到1.5，「最大回撤率」降到 -17% 的水準，明顯優化回撤波動。幾乎每一年回測都是正報酬穩定度明顯提升。</p>



<h2>結論</h2>



<p class="has-medium-font-size">這樣的優化策略思路是不是很有趣呢？藉由多元 label 的設定，讓機器學習能考慮多方面去強化策略，只用 scikit learn 最基本的機器學習演算法，非監督式學習與監督式的雙流分工，就能讓優化策略的流程省時省力，趕緊來試試用機器學習選股讓策略更上一層樓吧～<br><a href="https://colab.research.google.com/drive/1Sag1kIoHY2TDXJWWbugRIz1Mq8BcCi2f?usp=sharing" target="_blank" rel="noopener">colab 範例檔</a><br><a href="https://ai.finlab.tw/strategyview/?uid=TJN4FDuqrwU8DML7DAjUYFIMutp2&amp;sid=%E4%BD%8E%E6%B3%A2%E5%8B%95%E6%9C%AC%E7%9B%8A%E6%88%90%E9%95%B7%E6%AF%94" target="_blank" rel="noopener">低波動本益成長比策略部署</a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/low_volatility_stratgy_by_mae_mfe_ml/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3687</post-id>	</item>
		<item>
		<title>Qlib-巨人級的AI量化投資平台</title>
		<link>https://www.finlab.tw/qlib-intro/</link>
					<comments>https://www.finlab.tw/qlib-intro/#respond</comments>
		
		<dc:creator><![CDATA[Ben]]></dc:creator>
		<pubDate>Fri, 10 Jun 2022 05:15:44 +0000</pubDate>
				<category><![CDATA[生產力]]></category>
		<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[Github]]></category>
		<category><![CDATA[Qlib]]></category>
		<category><![CDATA[量化投資套件]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3669</guid>

					<description><![CDATA[常有人詢問FinLab如何取得AI量化交易學習資源以持續精進？

今天來介紹科技巨頭「微軟」在 Github 佛心開源的 Python AI 導向的量化投資框架～Qlib (Github)，從資料流(美、中股市)、建模流程、策略風控數據分析應有盡有，一條龍處理量化投資的工作。]]></description>
										<content:encoded><![CDATA[
<p class="has-medium-font-size">常有人詢問FinLab如何取得AI量化交易學習資源以持續精進？<br>除了 Google Scholar 看論文，Github 更是寶庫，下對關鍵字 ( ex:algorithmic-trading,quantitative-trading )，找對開源者能站在巨人的肩膀上，節省開發的時間並發現新世界。<br>今天來介紹科技巨頭「微軟」佛心開源的 Python AI 導向的量化投資框架～<a href="https://github.com/microsoft/qlib" target="_blank" rel="noopener">Qlib (Github)</a>，從資料流(美、中股市)、建模流程、策略風控數據分析應有盡有，一條龍處理量化投資的工作。</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="598" src="https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18-1024x598.png" alt="截圖 2022 06 10 下午12.44.18" class="wp-image-3670" srcset="https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18-1024x598.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18-300x175.png 300w, https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18-768x448.png 768w, https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18-1536x897.png 1536w, https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18-1200x700.png 1200w, https://www.finlab.tw/wp-content/uploads/2022/06/截圖-2022-06-10-下午12.44.18.png 1715w" sizes="(max-width: 1024px) 100vw, 1024px" title="Qlib-巨人級的AI量化投資平台 19"></figure>



<h2>Qlib 特色</h2>



<h3>AI 演算法模型</h3>



<p class="has-medium-font-size">Qlib 最有價值的地方在降低了使用 AI 演算法的門檻，目前套件有十幾個AI演算法在股票交易下的應用範例，許多都是新穎的演算法，內容深度高。模型程式都已模組化，只要調整資料格式和參數。<br>不少Self-attention的架構，乾貨滿滿，像是TRA (Temporal Routing Adaptor) 將LSTM做延伸，讓模型去學習多策略風格，捕捉近期市場主流門派。</p>



<p class="has-medium-font-size">Github上除了提供程式碼，也附上相關paper在qlib/examples/benchmarks中，資源整理的很充分，供開發者參考，除了輕鬆 Fork外，也可以精進演算法內涵。</p>



<h3>特徵資料集</h3>



<p class="has-medium-font-size">AI 訓練的第一步是準備特徵資料集，要生成好的特徵並沒想像容易。可能䢎開發者多為中國人有關，Qlib 基於中國股市 (滬深300) 建構 Alpha360 and Alpha158 兩種資料集範例，可參考<a href="https://github.com/microsoft/qlib/blob/main/qlib/contrib/data/handler.py" target="_blank" rel="noopener">官方程式</a>來生成特徵集。</p>



<h3>Workflow 架構</h3>



<p class="has-medium-font-size">workflow layer處理模型的訓練與回測過程，尋找獲利因子Alpha和風險因子，之後進入資產配置、選股、下單的決策階段。<br>另一個好用的是的Recoder流程管理器，用來管理與儲存紀錄模型的訓練過程、結果。AI模型有時訓練時間長，不能及時的看到結果，有時還有其他原因中斷訓練，那此時可使用Recoder恢復並繼續之前的訓練，不需要從頭開始。<br></p>



<h2>結論</h2>



<p class="has-medium-font-size">Qlib Framework 架構值得 作為 FinLab 下一代的開發參考，尤其是ML WorkFlow 的部分是目前FinLab平台比較欠缺的，或是將台股資料應用到 Qlib 模型也值得來整合。<br><br>一個好的repo，除了 Star 和 Fork 數，commit history 也是指標，更新頻率看起來有積極維護，持續補充新的模型和技術進來，值得追蹤～<br></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/qlib-intro/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3669</post-id>	</item>
		<item>
		<title>機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具</title>
		<link>https://www.finlab.tw/python-machine-learning-bitcoin-feature-engineering/</link>
					<comments>https://www.finlab.tw/python-machine-learning-bitcoin-feature-engineering/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 11 May 2022 05:30:26 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[BTC]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[機器學習]]></category>
		<category><![CDATA[比特幣]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[量化投資]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3520</guid>

					<description><![CDATA[這篇文章用機器學習實作能獲利的 BTCUSDT 交易模型，使用 Tunta 優化特徵，獲得更好的交易預測能力， [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>這篇文章用<a href="https://www.finlab.tw/category/ai%e7%9c%8b%e8%82%a1%e7%a5%a8/">機器學習</a>實作能獲利的 <a href="https://www.finlab.tw/category/%e5%8a%a0%e5%af%86%e8%b2%a8%e5%b9%a3/">BTCUSDT</a> 交易模型，使用 Tunta 優化特徵，獲得更好的交易預測能力，會有機器學習範例講解。現在的機器學習，已經越來越複雜，一個能夠實戰的模型，最好是有數百甚至是上千個 features。然而這麼多 features，並不是常人用手工一個個產生出來的，必須要大量的仰賴自動化生成。例如像是 Numerai 平台，最近更新的 <a href="https://forum.numer.ai/t/super-massive-data-release-deep-dive/4053" target="_blank" rel="noopener">features 數量都已經破千了</a>，代表更多的 features 確實會對於訓練模型有所幫助。</p>



<p>Numerai 提供股票的 features，由資料科學家（我們）訓練模型並產生結果，上傳後匯聚成最後的權重，來控制對沖基金的部位。我們沒辦法知道每檔股票的名稱，所以沒辦法用 Numerai 的 features 來做交易，但我們上傳到平台上，假如績效好的話，Numerai 會額外給我們加密貨幣 NMR 當作獎勵，雖然 Numerai 是很棒的練兵的地方，但是由於要用 Stake NMR 加密貨幣才能獲利，而且 NMR 的價格波動會導致獲利的風險偏高。所以還是自己做交易比較實在，想要機器學習自學，就看這篇吧！</p>



<p>那要怎麼樣產生出上千個 features 呢？好在用 Python 製作 features 是很簡單的，只要用常見的 Packages 像是 Talib 或 pandas_ta ，加上參數的變化，就可以隨機產生出很多的 features。但困難在於，做了好幾千個 features，究竟哪些是重要的呢？假如用了沒意義的 features，反而混淆訓練結果，造成模型的績效效果不好。</p>



<h2>Tuneta 介紹</h2>



<p>介紹給大家 <a class="rank-math-link" href="https://github.com/jmrichardson/tuneta/tree/53960a8d83cec586a3d91e2667dcf0f364522533" target="_blank" rel="noopener">Tuneta</a> 這個工具可以幫我們最佳化技術指標的參數。它有以下幾個功能：</p>



<ol><li>支援 <a href="https://www.finlab.tw/python-%e7%b0%a1%e5%96%ae158%e7%a8%ae%e6%8a%80%e8%a1%93%e6%8c%87%e6%a8%99%e8%a8%88%e7%ae%97/">Talib</a>、Pandas_ta、finta，這三種不同的函式庫，有統一的接口，你再也不用擔心不同函式庫整合的問題。</li><li>針對每種技術指標，可以最佳化參數，讓產生出來的 feature 跟 lable 之間有最高的 correlation</li><li>並不是使用一般的 Pearson correlation coefficient 來判斷，而是使用一種叫做 distance correlation 的判斷機制，就算是非線性的關係也會被納入考慮。</li><li>使用 KNN 將搜尋的參數分群 Cluster，然後針對每一個 Cluster 找出中心點，這個作法可以找到參數高原。</li><li>產生每個 features 後，支援 sklearn 的 pipeline 格式，可以快速的引入當前的項目之中，點也不費力。</li></ol>



<h2>Tuneta 的效果</h2>



<p>以下是 Tuneta 做機器學習例子，加入我自己的機器學習系統中，確實對於 Model 的判斷有顯著的增長，並且使用 feature importance 分析，這些 tuneta 產生的 feature 確實分數都滿高的：</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="974" height="455" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-8.png" alt="image 8" class="wp-image-3551" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-8.png 974w, https://www.finlab.tw/wp-content/uploads/2022/05/image-8-300x140.png 300w, https://www.finlab.tw/wp-content/uploads/2022/05/image-8-768x359.png 768w" sizes="(max-width: 974px) 100vw, 974px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 20"><figcaption>機器學習 LightGBM 特徵重要性分析</figcaption></figure>



<p>機器學習深度學習，我覺得在做交易時比較少用到。比較常使用的是傳統 treebase 的模型，而非神經網路。我覺得這個 Package 的缺點在於，有時候我們會需要重複的指標當作 features，例如「sma(10)」和「sma(60)」，但是它只能幫我們產生出單個技術指標的最佳解。不過經過驗證，產生出來的 features，確實效果都還不錯！接下來我們就真的來建構一個模型吧！</p>



<h2>實驗設計</h2>



<p>機器學習python實作，我們使用 pandas_ta 的 default 參數，將所有 pandas_ta 的技術指標計算出來。另外對比 tuneta 優化後產生的技術指標，比較兩個模型的預測結果，並且用回測來驗證是否能真正幫助到獲利。</p>



<p>使用 colab 來建構統一的環境，方便大家還原實驗的結果。首先我們要先來下載 tuneta，但除了 tuneta 以外，還要有歷史資料，可以安裝 finlab-crypto 來獲得。</p>



<pre title="環境架設" class="wp-block-code"><code lang="bash" class="language-bash line-numbers">!pip install finlab-crypto -q
!wget http://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
!tar -xzvf ta-lib-0.4.0-src.tar.gz
%cd ta-lib
!./configure --prefix=/usr
!make
!make install
!pip install Ta-Lib
!pip install -U tuneta
!pip uninstall numpy --yes
!pip install numpy</code></pre>



<h2>下載歷史資料和 feature 建構</h2>



<p>安裝了所需的 Package ，就可以來下載歷史資料：</p>



<pre title="下載歷史資料" class="wp-block-code"><code lang="python" class="language-python line-numbers">from finlab_crypto import crawler

ohlcv = crawler.get_all_binance('BTCUSDT', '4h')
ohlcv.head()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="242" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-1-1024x242.png" alt="image 1" class="wp-image-3530" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-1-1024x242.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/05/image-1-300x71.png 300w, https://www.finlab.tw/wp-content/uploads/2022/05/image-1-768x182.png 768w, https://www.finlab.tw/wp-content/uploads/2022/05/image-1.png 1133w" sizes="(max-width: 1024px) 100vw, 1024px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 21"><figcaption>下載BTC歷史資料</figcaption></figure>



<h3>使用 Pandas_ta 產生 features</h3>



<p>接下來我們先用 pandas_ta 自動產生出預設的技術指標，當作對照組：</p>



<pre title="產生技術指標的 features" class="wp-block-code"><code lang="python" class="language-python line-numbers">import pandas_ta as ta
ohlcv.ta.strategy("Momentum")

default_features = ohlcv.iloc[:, 11:]
ohlcv = ohlcv.iloc[:, :11]
default_features.head()</code></pre>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="325" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-2-1024x325.png" alt="image 2" class="wp-image-3531" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-2-1024x325.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/05/image-2-300x95.png 300w, https://www.finlab.tw/wp-content/uploads/2022/05/image-2-768x244.png 768w, https://www.finlab.tw/wp-content/uploads/2022/05/image-2.png 1043w" sizes="(max-width: 1024px) 100vw, 1024px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 22"><figcaption>產生出 features</figcaption></figure>



<h3>使用 Tuneta 產生 features</h3>



<p>接下來我們用 tuneta 產生實驗組，眼尖的人會發現我是用 tta，也就是 talib 函式庫來產生 features，你也可以用 pta，也就是 pandas_ta 函式庫。但是在 colab 上要跑很久，所以我擅自改成 tta。在這邊實驗有點不完備，但留給大家自行發揮。</p>



<pre title="tuneta 產生 features" class="wp-block-code"><code lang="python" class="language-python line-numbers">from tuneta.tune_ta import TuneTA

train_test_split = '2021-1-1'

X1 = ohlcv.loc[:train_test_split].iloc[:-8]
y1 = (ohlcv.close.shift(-2) / ohlcv.close).loc[:train_test_split].iloc[:-8]

tt = TuneTA(n_jobs=4, verbose=True)
tt.fit(X1, y1,
    indicators=['tta'],
    ranges=[(2, 30)],
    trials=100,
    early_stop=20,
)
tt.prune()
print(tt.report())

tt_features = tt.transform(ohlcv)
tt_features.tail()</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="578" height="524" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-3.png" alt="image 3" class="wp-image-3532" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-3.png 578w, https://www.finlab.tw/wp-content/uploads/2022/05/image-3-300x272.png 300w" sizes="(max-width: 578px) 100vw, 578px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 23"><figcaption>tuneta 產生出來的 feature 和相關性分析</figcaption></figure>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="258" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-4-1024x258.png" alt="image 4" class="wp-image-3533" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-4-1024x258.png 1024w, https://www.finlab.tw/wp-content/uploads/2022/05/image-4-300x76.png 300w, https://www.finlab.tw/wp-content/uploads/2022/05/image-4-768x194.png 768w, https://www.finlab.tw/wp-content/uploads/2022/05/image-4.png 1249w" sizes="(max-width: 1024px) 100vw, 1024px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 24"></figure>



<p>最後我們來比較兩種不同的 feature 做出來的效果。像是一般的方法訓練即可。</p>



<h2>模型訓練</h2>



<pre title="模型建構" class="wp-block-code"><code lang="python" class="language-python line-numbers">import lightgbm as lgb

# generate training data
X1_train, y1_train = default_features.loc[:train_test_split].iloc[:-8], ohlcv.close.pct_change(-2).loc[:train_test_split].iloc[:-8]
X2_train, y2_train = tt_features.loc[:train_test_split].iloc[:-8], ohlcv.close.pct_change(-2).loc[:train_test_split].iloc[:-8]

# train
model1 = lgb.LGBMRegressor()
model1.fit(X1_train, y1_train)

model2 = lgb.LGBMRegressor()
model2.fit(X2_train, y2_train)

# test and predict
X1_test, y1_test = default_features.loc[train_test_split:], ohlcv.close.pct_change(-2).loc[train_test_split:]
X2_test, y2_test = tt_features.loc[train_test_split:], ohlcv.close.pct_change(-2).loc[train_test_split:]

y1 = pd.Series(model1.predict(X1_test), X1_test.index)
y2 = pd.Series(model2.predict(X2_test), X2_test.index)</code></pre>



<p>最後我們來看一下究竟效果如何，可以用真實報酬跟預測結果的相關性來比較，越高代表越好。下面的實驗中，我們可以看到對照組的模型 ( model2 ) 比實驗組好很多。</p>



<pre title="比較兩個模型的相關性" class="wp-block-code"><code lang="python" class="language-python line-numbers">import pandas as pd

pd.DataFrame({'real': y1_test, 'pred': y1}).corr().iloc[1,0], pd.DataFrame({'real': y2_test, 'pred': y2}).corr().iloc[1,0]</code></pre>



<pre class="wp-block-preformatted">(0.007258040702236883, 0.02274027435611208)</pre>



<hr class="wp-block-separator has-css-opacity"/>



<p>最後我們可以做一個簡單的回測，試試看用這兩個模型做交易，績效會有什麼不一樣。首先，要決定進場的時機，將模型預測的分布顯示出來：</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="798" height="426" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-5.png" alt="image 5" class="wp-image-3534" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-5.png 798w, https://www.finlab.tw/wp-content/uploads/2022/05/image-5-300x160.png 300w, https://www.finlab.tw/wp-content/uploads/2022/05/image-5-768x410.png 768w" sizes="(max-width: 798px) 100vw, 798px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 25"><figcaption>模型預測分布</figcaption></figure>



<p>有了上圖，就可以設計進場時機，為預測結果大於 0.04 時進場8小時。接下來撰寫回測模擬：</p>



<pre title="回測" class="wp-block-code"><code lang="python" class="language-python line-numbers">y1_test[y1 &gt; 0.04].add(1).cumprod().plot()
y2_test[y2 &gt; 0.04].add(1).cumprod().plot()</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="507" height="340" src="https://www.finlab.tw/wp-content/uploads/2022/05/image-6.png" alt="image 6" class="wp-image-3535" srcset="https://www.finlab.tw/wp-content/uploads/2022/05/image-6.png 507w, https://www.finlab.tw/wp-content/uploads/2022/05/image-6-300x201.png 300w" sizes="(max-width: 507px) 100vw, 507px" title="機器學習 Python 做比特幣交易，如何找到好的特徵？增進模型的有效工具 26"></figure>



<p>上圖的回測結果中，綠色為實驗組，比對照組的報酬率顯著上升不少。</p>



<h4>小節</h4>



<p>由以上的實驗，可以證明對於 feature ，使用 Tuneta 參數優化是非常有效的。現在行情不好，大家可以趁現在默默耕耘，等時機到的時候，馬上就賺回來了！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/python-machine-learning-bitcoin-feature-engineering/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3520</post-id>	</item>
		<item>
		<title>Finlab 量化平台徵稿活動得獎作品 營業利益率選股-安正</title>
		<link>https://www.finlab.tw/finlab_submit2/</link>
					<comments>https://www.finlab.tw/finlab_submit2/#respond</comments>
		
		<dc:creator><![CDATA[安 正]]></dc:creator>
		<pubDate>Sun, 13 Feb 2022 12:58:00 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[徵稿活動]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3301</guid>

					<description><![CDATA[營業利益率選股 原理 營收 (Revenue) 是一間公司「做多少生意」的指標，然而做多少生意不表示賺多少錢， [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 id="營業利益率選股">營業利益率選股</h2>



<h3 id="原理">原理</h3>



<p><strong>營收 (Revenue)</strong> 是一間公司「做多少生意」的指標，然而做多少生意不表示賺多少錢，營收再高也不代表賺更多的錢，中間還要扣除銷貨成本得到的<strong>營業毛利 (Gross profit)</strong>，營業毛利扣掉費用後得到的<strong>營業利益 (Operating profit)</strong>，而後還有營業外支出，利息與所得稅等等，東扣西扣最後才是代表轉多少錢的指標<strong>稅後淨利 (Net income)</strong>。</p>



<p>先不論一間公司在外面做多少生意，繳多少利息與所得稅等等這些支出，衡量公司賺錢真本事的剩下營業毛利與營業利益這兩個指標。而營業毛利取決於行業類別，例如航運與鋼鐵業，毛利平均 10% 左右；晶圓代工與光學鏡頭，毛利平均在 40% 以上，難以用一個數字去衡量所有公司的好壞。而營業利益表是一間公司控管費用的能力，更能代表這間公司營運能力。</p>



<h3 id="計算營業利益率">計算營業利益率</h3>



<p>營業利益率 = 營業利益 / 營業收入合計</p>



<p>使用 <strong>Finlab API</strong>：</p>



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

operating_income = data.get('financial_statement:營業收入淨額')
operating_profit = data.get('financial_statement:營業利益')
operating_profit_ratio = (operating_profit / operating_income) * 100
</code></pre>



<p>其中：<br><code>operating_income</code>： 營業收入合計<br><code>operating_profit</code>： 營業利益<br><code>operating_profit_ratio</code>： 營業利益率</p>



<h3 id="如何評估營業利益率">如何評估營業利益率</h3>



<p>了解營業利益是評估一間公司營運能力的基礎之後，希望找出營業利益穩定成長，若沒有穩定成長，至少要穩定，因此考慮到季與季之間不能下跌過大。</p>



<p>再來，營業利益率若長期都是負值，再怎麼穩定也是枉然。</p>



<p>因此，對以下條件進行量化：</p>



<ol><li class="">營業利益率連續 <code>seasons</code> 季，下跌不超過某個數值 <code>drop</code>，認為是穩定。</li><li class="">營業利益率連續 <code>seasons</code> 季都是正值。</li></ol>



<p>以上的 <code>seasons</code> 與 <code>drop</code> 都是變數。</p>



<p>先把要量化的公式寫出來：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">condition1 = (((operating_profit_ratio - operating_profit_ratio.shift(1)) / 
           abs(operating_profit_ratio.shift(1))).rolling(seasons-1).min()) * 100 &gt; drop
condition2 = operating_profit_ratio.rolling(seasons).min() &gt; 0

position = condition1 &amp; condition2
</code></pre>



<p>上式計算出連續 <code>seasons</code> 個季度，季與季之間的變化百分比(例如近 4 季就有 3 次變化)至少高於某個數值 <code>drop</code>。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">def get_return_by_seasons(seasons):
  ret = {}
  return_dataset = {}
  for drop in range(-50, 10, 10):
    condition1 = (((operating_profit_ratio - operating_profit_ratio.shift(1)) / 
           abs(operating_profit_ratio.shift(1))).rolling(seasons-1).min()) * 100 &gt; drop
    condition2 = operating_profit_ratio.rolling(seasons).min() &gt; 0

    position = condition1 &amp; condition2
    
    report = backtest.sim(position.loc['2014':], resample="M", upload=False)
    return_series = report.creturn
    return_dataset['seasons'] = seasons
    return_dataset[f"{drop}"] = report.creturn
  return_dataset = pd.DataFrame(return_dataset)
  return return_dataset

return_season_df = pd.concat([get_return_by_seasons(s) for s in [8, 7, 6, 5, 4, 3, 2]])
</code></pre>



<p>上面程式碼分別回測連續 2 到連續 8 個季度，季與季之間變化幅度大於 <code>-50%, -40%, -30%, -20%, -10%, 0%</code> 的情形，使用 <strong>plotly express</strong> 模組，繪製如下：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">import plotly.express as px

fig = px.line(return_season_df, facet_row='seasons', height=1000, title='operating profit ratio backtest')
fig.show()
</code></pre>



<figure class="wp-block-image"><img src="https://i.imgur.com/NMSWGv8.png" alt="NMSWGv8" title="Finlab 量化平台徵稿活動得獎作品 營業利益率選股-安正 27"></figure>



<p>觀察到，<code>season = 4</code> 的圖表，較能看出一字排開的現象，表示近 4 季(3 次變化)，可以明顯地區分出各下跌百分比。且報酬率以季與季變化大於 0% 最好。</p>



<p>放大顯示：</p>



<figure class="wp-block-image"><img src="https://i.imgur.com/MSzf1kE.png" alt="MSzf1kE" title="Finlab 量化平台徵稿活動得獎作品 營業利益率選股-安正 28"></figure>



<h3 id="營業利益率-vs-股價">營業利益率 v.s. 股價</h3>



<p>有了上述的基礎之後，再來想要知道可否運用較少的資金，也就是選擇股價較低但滿足上述條件的公司買入，取得較高的報酬。<br>因此進一步將股價區分，對不同股價區間的公司作回測，得到最終到報酬率的柱狀圖如下：</p>



<pre class="wp-block-code"><code lang="python" class="language-python">close = data.get('price:收盤價')

def get_return_by_percentage(drop):
  condition1 = (((operating_profit_ratio - operating_profit_ratio.shift(1)) / abs(operating_profit_ratio.shift(1))).rolling(3).min()) * 100 &gt; drop
  condition2 = operating_profit_ratio.rolling(4).min() &gt; 0

  price_range = np.arange(0, 120, 10)
  ret = []
  for s,e in zip(price_range, price_range[1:]):
    condition3 = (close &gt; s) &amp; (close &lt; e)
    position = condition1 &amp; condition2 &amp; condition3
    r = backtest.sim(position.loc['2014':], resample="M", upload=False)
    return_series = r.creturn
    ret.append({'%':drop, 'price_range':f"{round(s,1)}-{round(e,1)}", 'return':return_series[-1]})
  df = pd.DataFrame(ret)
  return df

return_percentage_df = pd.concat([get_return_by_percentage(percentage) for percentage in [-50, -40, -30, -20, -10, -5, 0, 5, 10]])
</code></pre>



<figure class="wp-block-image"><img src="https://i.imgur.com/IWxIwZB.png" alt="" title="Finlab 量化平台徵稿活動得獎作品 營業利益率選股-安正 29"></figure>



<p>看起來符合預期，在營業利益率季與季之間變化大於 5% 的族群中(倒數第二欄柱狀圖表)，股價介於 30~40 間的公司報酬率最好，代表著有機會以較低的資金取得較好的報酬。</p>



<p>將績效曲線繪製出來如下：</p>



<figure class="wp-block-image"><img src="https://i.imgur.com/H3z9V5V.png" alt="H3z9V5V" title="Finlab 量化平台徵稿活動得獎作品 營業利益率選股-安正 30"></figure>



<h3 id="進一步過濾：好中選好">進一步過濾：好中選好</h3>



<p>只是選擇營業利益穩定的中低股價公司就有不錯的報酬，是否可以進一步過濾出更好的股票呢？</p>



<p>嘗試加入以下兩個條件試試：</p>



<ol><li class="">這季營益率大於上季 ⇒</li></ol>



<p>經營能力變好。 近三月營收平均大於近十二月營收平均 ⇒</p>



<ol><li class="">最近營收成長。</li></ol>



<p>回測績效如下：</p>



<figure class="wp-block-image"><img src="https://i.imgur.com/dSUTkGg.png" alt="dSUTkGg" title="Finlab 量化平台徵稿活動得獎作品 營業利益率選股-安正 31"></figure>



<p>結果也進一步地提升績效，看起來是個不錯的策略。</p>



<h2 id="後續探討">後續探討</h2>



<ul><li class="">試圖加入技術指標或其他濾網</li><li class="">使用其他指標來對營業利益率的分類：<br>有些資本密集的公司(晶圓代工)，由於股本較大，公司本身對費用控管能力較好，卻屬於中低股價。因此本篇用股價區間來區分難免有些偏頗。<br>希望可以改用其他指標(本益比、股價淨值比 …)，找出資本較小，卻有優異的營運管理能力的公司，在股價相對低點買入，以期獲得更好的報酬。</li></ul>



<h2 id="Colab-範例程式碼"><a href="https://colab.research.google.com/drive/1Fx7NoJHHICHSXMJ2_Ny6x6ien1UpPeLs?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">Colab 範例程式碼</a></h2>



<hr class="wp-block-separator"/>



<p><strong><a href="https://hackmd.io/" target="_blank" rel="noreferrer noopener"></a></strong> 28</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/finlab_submit2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3301</post-id>	</item>
		<item>
		<title>Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀</title>
		<link>https://www.finlab.tw/finlab_submit1/</link>
					<comments>https://www.finlab.tw/finlab_submit1/#respond</comments>
		
		<dc:creator><![CDATA[陳 士謀]]></dc:creator>
		<pubDate>Wed, 09 Feb 2022 12:58:00 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[徵稿作品]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=3270</guid>

					<description><![CDATA[AI選股策略介紹 機器學習是現今人工智慧(AI)浪潮下的代表性技術，將機器學習演算法應用至股市交易是本次研究著 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h1>AI選股策略介紹</h1>



<p>機器學習是現今人工智慧(AI)浪潮下的代表性技術，將機器學習演算法應用至股市交易是本次研究著重的重點，目的是探討在台灣股市中同時使用技術面和籌碼面的資料來訓練機器學習模型並預測交易訊號會有怎樣的表現，希望能找出籌碼面資料與技術面資料哪一個更為重要的答案。</p>



<p>本次機器學習模型的任務是迴歸，迴歸各標的未來一周的報酬率分布，由於各標的報酬率範圍落差極大，所以在製作標籤時對周報酬率採取了排名運算，並將其縮放至0～1，因此模型預測出來的數值也會介於0～1之間，若數值偏向0表示未來ㄧ周模型認為該標的上漲機會低；反之，若數值偏向1表示未來一周模型認為該標的上漲機會高。</p>



<p>因此，交易策略的使用方式便是每周從數百檔標的中取出預測值最高的一檔做為買入訊號，每次買入後持有時間固定為一周，若本周最高的一檔和上周的相同則不做任何操作，若不同則先將上周的標的清倉，再買入本周預測數值最高的標的。</p>



<h1>資料</h1>



<h2>標的池</h2>



<p>從Finlab獲取所有台灣股市標的（含股票、ETF等），並限定標的需要在2013/01/05以前就有價格資料，再扣除一些價格有缺失值的標的後，剩下標的池近700檔。</p>



<h2>訓練、驗證、測試資料切分<br></h2>



<p>從Finlab獲取上述標的池的股價資料，從2013/01年至2021/12年，由於2013-2014年的資料在計算特徵時使用了移動窗格，會出現缺失值，因此在計算完特徵後將前面的缺失值刪除，留下了2014年至2019年近六年的資料做為訓練資料；此外，2020一整年做為驗證資料、2021年至今做為測試資料。<br></p>



<h2>技術面特徵</h2>



<p>技術面特徵泛指各種使用開高低收量其中一種以上的數據計算而成的特徵。</p>



<p>首先，從Finlab獲取上述標的池的開高低收價格資料，再用這些資料作為材料計算各種技術面特徵。其中包含一日報酬率取對數、年化波動率、GitHub 上著名計算技術指標套件Ta-Lib裡的大多數技術指標，裡面包含MACD、RSI、K線型態等共100多個技術指標欄位，由於程式碼繁雜、篇幅過長，故不在此詳列。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="193" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片.png" alt="圖片" class="wp-image-3273" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-300x96.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 32"></figure>



<h2>籌碼面特徵</h2>



<p>資料源為Finlab，包含三大法人進出、上市櫃合計、上市櫃外資、上市櫃外資及陸資、上市櫃外資自營商、上市櫃投信、上市櫃自營商自行買賣、避險、上櫃三大法人合計等數據。以下幾個買賣超數據由於各標的分布落差極大，所以特別使用rank將原數值轉換至0～1的數值放以便於模型學習。</p>



<p>資料源為Finlab，包含三大法人進出、上市櫃合計、上市櫃外資、上市櫃外資及陸資、上市櫃外資自營商、上市櫃投信、上市櫃自營商自行買賣、避險、上櫃三大法人合計等數據。以下幾個買賣超數據由於各標的分布落差極大，所以特別使用rank將原數值轉換至0～1的數值放以便於模型學習。</p>



<pre class="wp-block-code"><code lang="python" class="language-python">data.get('institutional_investors_trading_all_market_summary:買賣超').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:外陸資買賣超股數(不含外資自營商)').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:外資自營商買賣超股數').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:投信買賣超股數').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:自營商買賣超股數(自行買賣)').rank(pct=True, axis=1)
data.get('institutional_investors_trading_summary:自營商買賣超股數(避險)').rank(pct=True, axis=1)
</code></pre>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="193" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-1.png" alt="圖片 1" class="wp-image-3274" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-1.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-1-300x96.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 33"></figure>



<h2>預測標籤</h2>



<p>模型預測的數值為未來一周報酬率的分布。標籤計算方式為先計算每周報酬率，再平移一周變成未來一周報酬率，最後將各標的報酬率做排名，並縮放至0~1，此數值可以做為區分未來一周報酬率的分布情形，若有一檔標的數值偏向0表示未來一周該標的有偏低的報酬率；若有一檔標的數值偏向1表示未來一周該標的有偏高的報酬率。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="84" height="384" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-2.png" alt="圖片 2" class="wp-image-3278" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 34"></figure>



<h2>資料處理</h2>



<p>將上述所有資料計算完成後，使用date日期或是ticker股票代號做為鍵來merge各種資料，並將X和y整合進一個大DataFrame。最終，缺失值統一以0填補。</p>



<h1>模型</h1>



<h2>模型訓練</h2>



<p>本次使用的模型為CatBoost Regressor，CatBoost與XGBoost、LightGBM齊名三大決策樹巨頭模型，特色在於對多維度的類別特徵能做更有效的提取。使用CPU訓練1000回合並使用驗證資料衡量訓練的優劣後，RMSE從0.2838迅速下降至0.2627，並在第九十六回合就達到了最低的RMSE。</p>



<p></p>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="85" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-3.png" alt="圖片 3" class="wp-image-3279" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-3.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-3-300x42.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 35"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="128" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-4.png" alt="圖片 4" class="wp-image-3280" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-4.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-4-300x64.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 36"></figure>



<h2>特徵重要性</h2>



<p>由模型的特徵重要性圖表可以看到，BOP、DIV、K線型態、上櫃自營商，這幾種指標是模型認為滿重要的指標。雖然技術面指標佔據了模型重要性的前幾名，但根據圖表也能發現有不少關於籌碼面的欄位在模型學習上起到了不小的作用，表明籌碼面的數據確實可以互補眾多技術指標無法捕捉到的角度，也再次印證了機器學習流程中，特徵工程扮演著極為重要的角色。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="484" height="650" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-5.png" alt="圖片 5" class="wp-image-3281" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-5.png 484w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-5-223x300.png 223w" sizes="(max-width: 484px) 100vw, 484px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 37"></figure>



<h1>績效</h1>



<p>這裡將每周模型預測出來的數值分成4組分別進行回測，第一組為每周只購買模型預測數值最高的一檔，第二組為每周只購買模型預測數值最高的前兩檔，依此類推。</p>



<h2>AI 第一名 策略</h2>



<p>由下圖可以看到，2021年ㄧ年的表現可說是如過山車ㄧ般，從最高的近250%高點一路回撤至近期12月的86%左右，即使報酬雖然從高點到最後被腰斬，但整體大部分時間仍勝過大盤。</p>



<p>總體來說，這個策略報酬率雖然看似不錯，但風險與獲利穩定性不佳，推測其原因可能在於只買一檔，容錯性太低，模型若稍有錯誤該周就完全沒機會了，因此下面我們來看如果增加檔數會有怎樣的結果。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="184" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-6.png" alt="圖片 6" class="wp-image-3282" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-6.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-6-300x92.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 38"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="336" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-7.png" alt="圖片 7" class="wp-image-3283" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-7.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-7-300x167.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 39"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="445" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-8.png" alt="圖片 8" class="wp-image-3284" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-8.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-8-300x222.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 40"></figure>



<h2>AI 前兩名 策略</h2>



<p>加入第二名後，可以發現最大回撤從原本的60%下降至40%左右，雖然報酬率也有小幅下降，但整體Sharpe Ratio還是1.3，印證增加至前兩名確實可以達到分散風險的效果。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="184" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-9.png" alt="圖片 9" class="wp-image-3285" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-9.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-9-300x92.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 41"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="336" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-10.png" alt="圖片 10" class="wp-image-3286" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-10.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-10-300x167.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 42"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="448" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-11.png" alt="圖片 11" class="wp-image-3287" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-11.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-11-300x223.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 43"></figure>



<h2>AI 前四名 策略</h2>



<p>加入第二名有效，那再加一些呢？如果換成前四名，可以看到最大回撤更是進一步地降低至20%左右，雖然報酬率再次下降，但整體穩定度提升了許多，不再發生獲利大回吐的情況，Sharpe Ratio也增加至1.4，為目前最優的一個策略。</p>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="184" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-12.png" alt="圖片 12" class="wp-image-3288" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-12.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-12-300x92.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 44"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="333" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-13.png" alt="圖片 13" class="wp-image-3289" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-13.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-13-300x166.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 45"></figure>



<figure class="wp-block-image size-full"><img loading="lazy" width="602" height="452" src="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-14.png" alt="圖片 14" class="wp-image-3290" srcset="https://www.finlab.tw/wp-content/uploads/2022/02/圖片-14.png 602w, https://www.finlab.tw/wp-content/uploads/2022/02/圖片-14-300x225.png 300w" sizes="(max-width: 602px) 100vw, 602px" title="Finlab 量化平台徵稿活動得獎作品 集技術面和籌碼面於一身的的AI選股策略-陳士謀 46"></figure>



<h1>結論與未來展望</h1>



<p>本研究比較了籌碼面資料對於選股策略的有效性，也從機器學習模型中了解到演算法認為究竟是哪些技術面或籌碼面的資料對未來一週的報酬率分布更有預測能力。因此，本研究認為對於台股而言，除了技術面指標以外，籌碼面也是一個很重要的因素。在機器學習策略的實驗可以發現，對於特徵工程而言，大量使用技術面和籌碼面做為模型學習的特徵近200個欄位能讓模型從多個角度學習如何更有效地預測台股未來一週報酬率的分布情形；對於模型訓練而言，加入籌碼面的資料也確實可以提升模型的學習成效，降低損失函數RMSE。若未來有機會再將此專題改進，例如使用其他決策樹模型如XGBoost、LightGBM或是深度學習模型、甚至示把多種不同的模型做集成學習或是提高模型重新訓練頻率等其他方面再做得更細緻一些，相信模型績效還有再進步的空間。</p>



<h1>參考連結</h1>



<ol><li><a href="https://mrjbq7.github.io/ta-lib/funcs.html" class="rank-math-link" target="_blank" rel="noopener">talib</a></li><li><a href="https://ai.finlab.tw/database" class="rank-math-link" target="_blank" rel="noopener">finlab</a></li></ol>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/finlab_submit1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">3270</post-id>	</item>
		<item>
		<title>2021股票、比特幣崩盤確切時間點 ?! 免費工具大揭密 (附程式碼) &#124; FinLab 財經實驗室</title>
		<link>https://www.finlab.tw/bitcoin-stock-bubble-analysis-lppl/</link>
					<comments>https://www.finlab.tw/bitcoin-stock-bubble-analysis-lppl/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Thu, 14 Jan 2021 05:07:08 +0000</pubDate>
				<category><![CDATA[股票策略]]></category>
		<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[FinLab YouTube]]></category>
		<category><![CDATA[PYTHON財經]]></category>
		<category><![CDATA[加密貨幣]]></category>
		<category><![CDATA[大盤漲跌]]></category>
		<category><![CDATA[財經PYTHON教學]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[大盤]]></category>
		<category><![CDATA[如何買股票]]></category>
		<category><![CDATA[比特幣]]></category>
		<category><![CDATA[理財]]></category>
		<category><![CDATA[股市分析]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票入門]]></category>
		<guid isPermaLink="false">https://www.finlab.tw/?p=2468</guid>

					<description><![CDATA[你是不是覺得比特幣、股票都漲好高，快要懼高症發作？最近是不是手很癢，很想要趕快買股票開始投資？還是說你已經大賺一波了，想要找一個時機做賣出呢？這個實驗就是專門為你設計的！這篇文章將介紹如何將巴菲特的經典名言「眾人恐懼我貪婪」製作成數學工具應用在股市、加密貨幣、全球指數上！]]></description>
										<content:encoded><![CDATA[
<p>你是不是覺得最近什麼市場都漲好高，快要懼高症發作？<br>最近是不是手很癢，很想要趕快買股票開始投資？<br>還是說你已經大賺一波了，想要找一個時機做賣出呢？<br>這個實驗就是專門為你設計的！</p>



<figure class="wp-block-embed-youtube wp-block-embed is-type-video is-provider-youtube wp-embed-aspect-16-9 wp-has-aspect-ratio"><div class="wp-block-embed__wrapper">
<p class="responsive-video-wrap clr"><iframe loading="lazy" title="2021股票、比特幣崩盤確切時間點 ?! 免費工具大揭密 (附程式碼) | FinLab 財經實驗室" width="1200" height="675" src="https://www.youtube.com/embed/z4aIbe2jVVE?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe></p>
</div></figure>



<p></p>



<p>讓 FinLab 告訴你什麼時候泡沫會破裂<br>讓你在大家瘋狂的時候，獲利了結<br>等到恐懼的時候，再逆勢買進</p>



<h2>金融波動大，要如何高買低賣？</h2>



<p>2020算是金融波動非常大的一年，<br>三月因為疫情關係，台股暴跌到8000多點，<br>大家都覺得完蛋了，於是出清股票，停損觀望，<br>想不到這時候政府國安基金，全球印鈔 QE 救經濟，<br>去年年底，台股又飆升到了 14000 點，<br>簡直就像是坐雲霄飛車一樣！</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="1024" height="489" src="https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.05.09-PM-1024x489.png" alt="Screen Shot 2021 01 14 at 1.05.09 PM" class="wp-image-2471" srcset="https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.05.09-PM-1024x489.png 1024w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.05.09-PM-300x143.png 300w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.05.09-PM-768x367.png 768w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.05.09-PM-1536x734.png 1536w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.05.09-PM-2048x978.png 2048w" sizes="(max-width: 1024px) 100vw, 1024px" title="2021股票、比特幣崩盤確切時間點 ?! 免費工具大揭密 (附程式碼) | FinLab 財經實驗室 47"></figure>



<p id="stock-bitcoin-bubble">要如何買在低點買在高點呢？<br>就要像巴菲特說的一樣，眾人恐懼我貪婪！<br>但這句話其實我們已經聽到爛掉了，具體而言要怎麼實行呢？<br>其實非常困難，例如在三月的時候，股市崩盤，<br>親朋好友都叫你趕快賣掉股票了，你還不賣嗎？<br>那時候疫情剛爆發，感染者成倍數增長，<br>你哪有勇氣說自己是對的？你的勇氣會從哪裡來呢？</p>



<p>答案是從數學來的</p>



<h2>全市場通用的泡沫模型</h2>



<p>今天我們要介紹的泡沫模型<br>是多次預測泡沫包含</p>



<ul><li>1990年納斯達克泡沫</li><li>2000年科技泡沫</li><li>2008年石油危機</li><li>中國市場泡沫</li><li>2009年美國房市泡沫</li><li>還有比特幣2017年泡沫</li></ul>



<p>這個模型的簡稱是 <a href="https://arxiv.org/pdf/1108.0099.pdf" class="rank-math-link" target="_blank" rel="noopener">LPPL</a> 模型<br>全名是 <a href="https://arxiv.org/pdf/1108.0099.pdf" class="rank-math-link" target="_blank" rel="noopener">Log-Periodic Power Law Model</a><br>原理其實就是假設這個世界有兩種人<br>A 和 B<br>首先 A 這類的人，他們是聽從別人建議的人，<br>也就是別人買我就買，看到別人賣我就賣，<br>而 B 是有自我主張的人，<br>也就說他不管別人的建議會按照，自己的行為來做決定，<br>而這個自由市場中，<br>A 跟 B 的訊息會不斷地交換，<br>交互影響對方的選擇。</p>



<p>以你來說好了，<br>有時候你會有自我的主張，<br>也就是對股票進行買賣，<br>但有時候你可能也會聽從別的意見，當作參考<br>每個人都有可能有時候是 A 或者是 B，<br>當今天泡沫高漲的時候，<br>這個價格系統臨界點發生時，<br>會有這麼一瞬間，<br>大家都變成 A，一致做出賣出的決定！<br>導致價格的崩跌。</p>



<h2>LPPL 數學原理</h2>



<p>有了這樣的概念，我們就可以來設計一個價格模型，<br>什麼是價格模型？簡單來講就是一個預測真實世界的公式。<br>LPPL 公式推導非常地複雜，借鏡了統一場論，<br>利用模擬群體的交互作用的總體效應，來大幅化簡模擬的複雜度。</p>



<p>下圖中，我們用圖讓大家更了解這個公式的數學原理：</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="915" height="404" src="https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.00.53-PM.png" alt="Screen Shot 2021 01 14 at 1.00.53 PM" class="wp-image-2469" srcset="https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.00.53-PM.png 915w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.00.53-PM-300x132.png 300w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.00.53-PM-768x339.png 768w" sizes="(max-width: 915px) 100vw, 915px" title="2021股票、比特幣崩盤確切時間點 ?! 免費工具大揭密 (附程式碼) | FinLab 財經實驗室 48"></figure>



<p>首先 LPPL 模型，最重要的會有三個元素</p>



<ul><li>一個是橘色的這個點</li><li>那另外是這條藍色的曲線</li><li>最後還有這條紅色的曲線</li></ul>



<p>那這邊橘色的這個點，<br>它其實就代表著崩盤的時候的最高價格 A，<br>那什麼時候會崩盤時間點就是 tc，<br>那我們可以看到這邊除了這個橘色的點以外，<br>還有這條藍色的時間序列，它就是在敘述，<br>泡沫整體上漲的幅度。</p>



<p>最後，價格其實是會有波動，<br>所以除了用藍色這一條線來描述價格以外<br>我們還會需要小週期的震盪，<br>也就是紅色的這一條曲線，來描述波動。</p>



<p>有了這三個元素就可以，<br>更正確地來描述泡沫破裂的時間序列公式，<br>那我們的就可以將這三個部分，<br>合併成同一個公式，<br>來描述說當今天泡沫發生的時候，價格隨時間的變化。</p>



<p>那你可能就會說<br>「我們究竟要怎麼樣將這個公式<br>使用在我們現在任何一個商品中？！」</p>



<p>那接下來我們就可以來看一個例子，</p>



<figure class="wp-block-image size-large"><img loading="lazy" width="881" height="448" src="https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.02.28-PM.png" alt="Screen Shot 2021 01 14 at 1.02.28 PM" class="wp-image-2470" srcset="https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.02.28-PM.png 881w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.02.28-PM-300x153.png 300w, https://www.finlab.tw/wp-content/uploads/2021/01/Screen-Shot-2021-01-14-at-1.02.28-PM-768x391.png 768w" sizes="(max-width: 881px) 100vw, 881px" title="2021股票、比特幣崩盤確切時間點 ?! 免費工具大揭密 (附程式碼) | FinLab 財經實驗室 49"></figure>



<p>例如這邊我們有一個商品，<br>它的歷史價格時間序列是上圖右半邊，<br>那我們就懷疑，最近價格漲了好高，<br>是不是有泡沫會發生呢？</p>



<p>那這時候，可以用剛剛的公式，也就是 P(T)，<br>代入不同的參數進去，會算出不同的時間序列（以顏色表示），<br>那這時候，就可以找到一組參數，<br>它會讓我們的時間序列最接近真實的歷史價格，<br>例如我們可以看到，這 4 個（顏色的）時間序列中，<br>紅色的時間序列，長得最接近原本的歷史價格，<br>所以我們就會說，這組時間序列的參數是比較合理的，<br>這組合理的參數裡面，就包含了 tc，也就是泡沫破裂的時間點！</p>



<p>你可能會問，這個公式真的能幫助我們賺到錢嗎？<br>我們要怎麼應證它是有用的呢？</p>



<h2>跟我們一起來做實驗吧！</h2>



<p>我們已經幫你做好了工具，可以直接來使用，<br>這個工具的費用，就是幫訂閱我們的部落格、YT<br>用正確方法和數學公式，安全穩定地投資理財，<br>這一套工具將會完全免費送給你！</p>



<p>這個<a href="https://colab.research.google.com/drive/1oEMk8-yvhaWHP9DwE6bO_uzazPcvEvAY?usp=sharing" class="rank-math-link" target="_blank" rel="noopener">股票泡沫檢測器</a>不只可以幫你判斷，<br>究竟現在這個商品是否有泡沫，<br>我們可以針對任何一檔股票，<br>甚至是 Bitcoin 來做檢測，<br>只要是有收錄在 Yahoo Finance 的標的，全部都可以拿來做預測分析喔！</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/bitcoin-stock-bubble-analysis-lppl/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2468</post-id>	</item>
		<item>
		<title>ROE怎麼看? 機器學習告訴你！</title>
		<link>https://www.finlab.tw/roe%e6%80%8e%e9%ba%bc%e7%9c%8b-%e6%a9%9f%e5%99%a8%e5%ad%b8%e7%bf%92%e5%91%8a%e8%a8%b4%e4%bd%a0/</link>
					<comments>https://www.finlab.tw/roe%e6%80%8e%e9%ba%bc%e7%9c%8b-%e6%a9%9f%e5%99%a8%e5%ad%b8%e7%bf%92%e5%91%8a%e8%a8%b4%e4%bd%a0/#respond</comments>
		
		<dc:creator><![CDATA[FinLab - 韓承佑]]></dc:creator>
		<pubDate>Wed, 22 Jul 2020 23:05:39 +0000</pubDate>
				<category><![CDATA[AI看股票]]></category>
		<category><![CDATA[MACHINE LEARNING]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[機器學習]]></category>
		<category><![CDATA[程式交易]]></category>
		<category><![CDATA[股票]]></category>
		<category><![CDATA[股票分析]]></category>
		<guid isPermaLink="false">http://34.96.136.135/?p=794</guid>

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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



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



<p>雖然兩個模型的闡述「相互矛盾」「有點道理、但又有點詭異」，就像是投資界眾說紛紜的理論一樣，所以以後看到相互矛盾的論點，其實不一定誰好誰壞，甚至說不定都能夠獲利，這就是股票市場的有趣之處。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.finlab.tw/roe%e6%80%8e%e9%ba%bc%e7%9c%8b-%e6%a9%9f%e5%99%a8%e5%ad%b8%e7%bf%92%e5%91%8a%e8%a8%b4%e4%bd%a0/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">794</post-id>	</item>
	</channel>
</rss>
