【實戰應用】量價篩選

TEJ 台灣經濟新報
TEJ-API 金融資料分析
11 min readMar 15, 2022

搭上市場順風車,篩選熱門股票

Photo by Mackenzie Marco on Unsplash

本文重點概要

前言

對於股票交易市場中,我們常聽到所謂的熱門族群,而熱門族群代表著量增價漲,亦或是某些股票當我們看到新聞時已經上漲一段時間,而我們要如何及早發現這些股票,是本文想要實現的,一樣以成交量增長做為篩選條件,一次幫我們把所有市場的股票都給篩選,也能大幅減少我們尋找標的的時間。

而本文一樣是使用較為彈性的設計,可供讀者自行修改,後面會談及如何修改所參數,本文篩選條件設計如下:

1. 今日成交量是前”4”日平均的5倍

2.需要上漲3%以上

3. 交易量至少大於 500

編輯環境及模組需求

本文使用 Window10 並以 Spyder(anaconda31) 作為編輯器

###匯入套件##########數據分析三寶
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
#################TEJ
import tejapi
tejapi.ApiConfig.api_key = 'Your Key'
tejapi.ApiConfig.ignoretz = True
###############畫k線
from mplfinance.original_flavor import candlestick_ohlc
from matplotlib.dates import date2num ,num2date
import matplotlib.ticker as ticker
import matplotlib.dates

資料庫使用

證券交易資料表:上市(櫃)未調整股價(日),資料代碼為(TWN/EWPRCD)。

證券屬性資料表 : 上市(櫃)產業別與名稱,資料代碼為(TWN/ANPRCSTD)。

資料導入

data=tejapi.get('TWN/EWNPRCSTD' ,chinese_column_name=True )
select=data["上市別"].unique()

選取上市上櫃別

select=select[1:3]
condition =(data["上市別"].isin(select)) & ( data["證券種類名稱"]=="普通股" )
data=data[condition] ######設條件
twid=data["證券碼"].to_list()

將選取的上市上櫃資料放入證券交易資料庫中,並挑選出證券代號、開盤價、收盤價、最高價、最低價、調整股價、交易量、日期。

opts={'columns': ['coid','open_d','close_d','high_d','low_d' ,'mdate', 'volume', 'close_adj']}
start='2022-1-01'
end="2022-03-8"
tw=tejapi.get('TWN/EWPRCD',coid=twid,
mdate={'gt':start,'lt':end},
paginate=True,
chinese_column_name=True,
opts=opts
)
a=tw
a=tw.groupby(by=["證券碼"])
b=list(a) #######ˇ

使用groupby函數將每一個證券碼分類,將groupby後的資料放在list裡面才能觀察

點開裡面的形式如下

資料處理 step1 計算指標

def selectstock(b,number,minnum,num) : # b為用groupby做出來的list
output=[]
for i in range(len(b)):
a=b[i][1]
a["五日均量"]=a["成交量(千股)"].rolling(5).sum()
a["五日均價"]=a["收盤價-除權息"].rolling(5).mean()

a["前幾日平均"]=(a["五日均量"]-a["成交量(千股)"]) / 4
a["成交量"+str(number)+"倍喔"]=a["成交量(千股)"]-a['前幾日平均'] *number
a.drop('五日均量',axis=1)
if a["成交量(千股)"].mean() > minnum :
output.append(a)
stockineed=[]
for j in output:
j.reset_index(drop=True,inplace=True)
if j["成交量"+str(number)+"倍喔"][len(j)-1] > 0 :

if j["收盤價-除權息"][len(j)-1] > j["收盤價-除權息"][len(j)-2]*num :
stock=j["證券碼"][0]
stockineed.append(stock)
return stockineed

此函式是有3個參數設計 (number,minnum,num)

number 可以選擇倍數 本文選 前"4"日平均的5倍

minnum 可以選擇篩選成交量之最小值 本文選"500"

num 當日上漲幅度 本文選取 " 3" %

stockineed=selectstock(b,5,500,1.03)

這些資料為本次篩選出來的股票代碼一共有八檔股票符合條件

condition=tw["證券碼"].isin(stockineed)
tw1=tw[condition]
a=tw1.groupby("證券碼")
a=list(a)
for i in a:
i[1].set_index("日期",inplace=True) ###將日期設為index

與剛才一樣的步驟將資料使用groupy函數聚合

Step 2. 視覺化篩選股票的k線

我們能得到篩選出來股票的日交易資料,我們使用剛才得到股票代碼取尋找分別代表的產業類別,方便畫圖時顯示,並且打算把它畫出來!

opts={'columns': ['coid','stk_name','mkt','tejindnm',]}
data1=tejapi.get('TWN/ANPRCSTD' ,
opts=opts,
chinese_column_name=True,
paginate=True,
coid=stockineed)
def getplot(finaldata):    for i in range(len(finaldata)):

out=finaldata[i][1]
name=data1[data1["證券碼"]==finaldata[i][0]]
outputname0=name.loc[i,'證券名稱']##為了得到標題
outputname1=name.loc[i,'上市別'] ##
outputname2=name.loc[i,"TEJ產業名"]##
# out.reset_index(drop=True,inplace=True)
if outputname1 == "TSE":
outputname1 ="上市"
else :
outputname1= "上櫃"
fig = plt.figure(figsize=(6,6))
grid = plt.GridSpec(3, 3, wspace=0.4, hspace=0.3)
ax1=plt.subplot(grid[:2, :])
ax2=plt.subplot(grid[2, :])

date= [i for i in range(len(out))]
##### 獲取 0開始的順序 因為如果使用原日期假日會有空缺

out_index= [tuple([date[i],out.開盤價[i],out.最高價[i],out.最低價[i],out.收盤價[i]]) for i in range(len(out))]
candlestick_ohlc(ax1, out_index, width=0.6, colorup='r', colordown='g', alpha=0.75)
ax1.set_xticks(range(0, len(out.index), 10))
ax1.set_xticklabels(out.index[::10])

ax1.set_title([str(out["證券碼"][0]),outputname0,outputname1,outputname2])
ax1.set_ylabel('Price')
ax1.grid(linestyle="--",alpha=0.8)

red_pred = np.where(out["收盤價"] >= out["開盤價"],out["成交量(千股)"], 0)
blue_pred = np.where(out["收盤價"] < out["開盤價"], out["成交量(千股)"], 0)
out1=out.reset_index(drop=True )
ax2.bar(out1.index,red_pred, facecolor="red")
ax2.bar(out1.index,blue_pred,facecolor="green")
ax2.set_xticks(range(0, len(out.index), 5))
ax2.set_xticklabels(out.index[::5])
ax2.set_ylabel('vol')
plt.legend(loc='best')
fig.autofmt_xdate()
fig.tight_layout()
plt.show()

此程式能將畫出股票的k線以及成交量在同一張圖上

getplot(a) ###前面聚合後的List(a)

就會畫出篩選的股票啦,也可以在此加入均線等等讓圖看起來更豐富,每天都可以用這個程式自動篩選股票。

結論

藉由這次程式的篩選,我們依然能找到這次大跌下的強勢股,也是一個可以用來挑選標地物的好方法,配合上次的量能回測的操作模式或許是一個不錯的獲利模式,而更改篩選參數也能找到出量下跌的標的,每個人對於投資都有自己喜歡的方式,而我們能藉由程式的方式找尋符合自己進場邏輯的標的,以節省下許多挑選的時間,所以歡迎對各種交易回測有興趣的讀者,選購TEJ E-Shop的相關方案,用高品質的資料庫,建構出適合自己的交易策略。

完整程式碼

延伸閱讀

相關連結

給我們鼓勵
之後會持續分享更多財金資料庫的應用
如果你的覺得今天的文章不錯,可以幫我們在下面的
掌聲 icon 點 1下
如果覺得超讚,可以按住
掌聲 icon 不放直到 50 下
有任何想法歡迎點選
留言 icon和我們討論

--

--

TEJ 台灣經濟新報
TEJ-API 金融資料分析

TEJ 為台灣本土第一大財經資訊公司,成立於 1990 年,提供金融市場基本分析所需資訊,以及信用風險、法遵科技、資產評價、量化分析及 ESG 等解決方案及顧問服務。鑒於財務金融領域日趨多元與複雜,TEJ 結合實務與學術界的精英人才,致力於開發機器學習、人工智慧 AI 及自然語言處理 NLP 等新技術,持續提供創新服務