創新高股票,你還少看了這個因子!

假如你是追高的選股策略,
有沒有一種感覺?
就是往往創新高的股票,
大部分都賠錢,
只有少部分賺錢,

今天我們將介紹一個因子,
大幅提昇創新高獲利的效果!

這種追高的策略,
有幾個比較難克服的地方,
我們將介紹
一個可以破解這些課題的策略。

1. 心理因素

一個就是心魔,
因為勝率真的很低
所以你會覺得
怎麼一直輸錢?
造成人為干預嚴重

所以在追高股票時,
最好還是讓自己「分心」
也就是透過持有多檔股票的方式
讓自己不會過度在乎一檔個股

2. 選到亂漲一通的股票

另外,
有時候股票市場很感性
不能用理性的方式來交易

有些個股
明明股價淨值比都5以上
本益比都50了
還漲個沒完

針對這種個股
要是去追高
很有可能買在高點!

所以我們可以用「基本面」
來分析這檔股票的「創新高」
合不合理

總結以上兩點 製作創新高策略

1. 動態調整 Portfolio

每兩個禮拜調整一次所選的股票,
並將資產「平均分配」於所選的股票中,

2. 基本面篩選

我們並不是看到創新高就無條件選這些股票
必須搭配基本面的因子,
來選出更有可能維持上漲的股票:

  1. 創新高:股價突破60天內股價
  2. ROE大於3,前一季ROE大於1

另外由於股價容易受流動性影響,
我們希望買入賣出有流動性的股票:

  1. 股價大於7
  2. 成交量大於100張

才能更順利
在任意時刻買賣股票

3. 新因子研發

最後,最重要的因子
忍痛割愛告訴大家
我們特別研發一個「成長+價值」的複合因子:

新因子 = 當季ROE / 前一季ROE / 股價淨值比

新因子可以拆解成兩個部分:

第一部份:成長股篩選

這個新因子當中,成長的部分是
「當季ROE / 前一季ROE」
這些ROE成長的股票,這個數值會大於1

第二部分:價值股篩選

接下來,我們要選 CP 值高的股票
股價淨值比
就是一個很好的指標
可以幫我們判斷股票的價格是否太高,
我們希望
「1 / 股價淨值比」
越大越好,
可以參考「股價淨值比」來瞭解更詳細的原理喔!

將上述兩種因子合併

用乘法,將這兩種因子合併起來:

新因子 = 當季ROE / 前一季ROE / 股價淨值比

我們將每檔股票都算出此因子,假如當天有超過三檔股票創新高,
用這個因子排序,並選出前 3 名的股票,
新增到我們的 portfolio 組合裡面

賣出策略

當股價收盤價小於 20 日均,則賣出

回測結果

本文章所公佈的「新因子」
究竟對於這些創新高有什麼樣子的影響呢?


上圖中
藍色的數值為使用「新因子」,
每次加入3檔股票的方法
而橘色的為,「沒有用新因子」,
每次加入數檔股票的方法

效果差距非常多!

以下是策略的回測相關數值和風險,
假如你希望用 Python
跟我們一起研究量化投資,
可以參加「小資族選股策略」和「AI股票理專」,
一起來研發有用的選股邏輯喔!

假如你是有加入課程的同學,
可以直接使用以下的程式碼開始選股喔!

from finlab.data import Data

data = Data()


#############
# 股價淨值比  #
#############
price = data.get('收盤價', 300)
股東權益 = data.get('歸屬於母公司業主之權益合計', 1)
股本 = data.get('普通股股本', 1)


流通股數 = 股本 / 10
每股淨值 = 股東權益 / 流通股數
今日股價 = price.iloc[-1]

股價淨值比pb = (今日股價 / 每股淨值).squeeze()

#####################
# 股東權益報酬率 ROE  #
#####################

稅後淨利 = data.get('本期淨利(淨損)', 2)

# 股東權益,有兩個名稱,有些公司叫做權益總計,有些叫做權益總額
# 所以得把它們抓出來
權益總計 = data.get('權益總計', 2)
權益總額 = data.get('權益總額', 2)

# 並且把它們合併起來
權益總計.fillna(權益總額, inplace=True)

股東權益報酬率 = 稅後淨利.iloc[-1] / 權益總計.iloc[-1]
股東權益報酬率_上季 = 稅後淨利.iloc[-2] / 權益總計.iloc[-2]


#####################
# 成交量  #
#####################
vol = data.get('成交股數', 100)


############
# 篩選股票  #
############

condition1 = (price.rolling(60).max() == price).iloc[-10:].sum() > 0
condition2 = (股東權益報酬率 > 0.03) & (股東權益報酬率_上季 > 0.01)
condition3 = (price.iloc[-1] > 7) & (vol.iloc[-1] > 100000)
rank = 股東權益報酬率 / 股東權益報酬率_上季 / 股價淨值比pb * (condition1 & condition2 & condition3)

print('近10天創新高的股票數量')
print(condition1.sum())

print('rank 前10名的股票')
print(rank[rank > 0].nlargest(10))

附上策略的回測結果
祝大家選股愉快!


FinLab - 韓承佑

嗨大家好,我是韓承佑,FinLab創辦人,畢業於巴黎薩克雷大學資工博士,目前擔任臺灣量化交易協會 學術顧問、台北商業大學 創新育成中心 創業技術顧問與上市科技公司 量化交易顧問。當初,我喜歡寫程式、無意間因為軟體比賽接觸Fintech,從此開始了財經跟程式的學習之路。我們成立 FinLab 量化投資部落格,用自己研發的軟體,對台灣股市做大量快速的實驗。希望可以在量化投資的路上,當大家的「武器製造商」!