量价筛选

Photo by Mackenzie Marco on Unsplash

本文重点概要

  • 文章难度:★☆☆☆☆
  • 阅读建议:本文以 PYTHON实作以成交量增长每日筛选股票,若读者的对动能回测有兴趣,可以进一步观看量能回测实战

前言

对于股票交易市场中,我们常听到所谓的热门族群,而热门族群代表著量增价涨,亦或是某些股票当我们看到新闻时已经上涨一段时间,而我们要如何及早发现这些股票,是本文想要实现的,一样以成交量增长做为筛选条件,一次帮我们把所有市场的股票都给筛选,也能大幅减少我们寻找标的的时间。

而本文一样是使用较为弹性的设计,可供读者自行修改,后面会谈及如何修改所参数,本文筛选条件设计如下:

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的相关方案,用高品质的资料库,建构出适合自己的交易策略。

完整程式码

延伸阅读

相关连结

返回总览页