量化交易(也稱為自動化交易)是一種應用數學模型幫助投資者進行判斷,並且根據電腦程式發送的指令進行交易的投資方式,它極大地減少了投資者情緒波動的影響。量化交易的主要優點如下:
#量化交易的核心是篩選策略,策略也是靠數學或物理模型來創造,把數學語言變成電腦語言。量化交易的流程是從資料的取得到資料的分析、處理。
資料分析工作的第一步就是取得數據,也就是資料收集。取得資料的方式有很多,一般來講, 資料來源主要分為兩大類:外部來源(外部購買、網路爬取、免費開源資料等)和內部來源 (自己企業銷售資料、財務資料等)。
因為我們不生產數據,所以只能從外部取得數據。其獲取途徑為第三方開源函式庫tushare。
使用 tushare 取得歷史股票資料
tushare 是一個免費、開源的Python 財經資料介麵包。其主要實現對股票等金融數據從數據收集、清洗加工到數據存儲的過程,能夠為金融分析人員提供快速、整潔和多樣的便於分析的數據,以減輕他們在數據獲取方面的工作量。
安裝 tushare 函式庫,在 Jupter Notebook 下輸入以下指令:
%pip install tushare
重啟kernel,然後輸入以下指令。
import tushare print("tushare版本号{}".format(tushare.__version__))
tushare版本号1.2.85
取得個股歷史交易資料(包含均線資料),使用者可透過參數設定取得日K線、週K線、月K線,以及5分鐘、15 分鐘、30 分鐘和60分鐘K線數據。本介面只能取得近3年的日線數據,適合搭配均線數據進行選股分析。 Python 程式碼如下:
importtushareasts ts.get_hist_data('000001') #一次性获取全部日k线数据 ''' 参数说明: code:股票代码,即6位数字代码,或者指数代码(sh=上证指数 sz=深圳成指 hs300=沪深300指数 sz50=上证50 zxb=中小板 cyb=创业板) start:开始日期,格式YYYY-MM-DD end:结束日期,格式YYYY-MM-DD ktype:数据类型,D=日k线 W=周 M=月 5=5分钟 15=15分钟 30=30分钟 60=60分钟,默认为D retry_count:当网络异常后重试次数,默认为3 pause:重试时停顿秒数,默认为0 例如: ts.get_hist_data('000001', ktype='W') #获取周k线数据 ts.get_hist_data('000001', ktype='M') #获取月k线数据 ts.get_hist_data('000001', ktype='5') #获取5分钟k线数据 ts.get_hist_data('000001', ktype='15') #获取15分钟k线数据 ts.get_hist_data('000001', ktype='30') #获取30分钟k线数据 ts.get_hist_data('000001', ktype='60') #获取60分钟k线数据 ts.get_hist_data('sh')#获取上证指数k线数据 ts.get_hist_data('sz')#获取深圳成指k线数据 ts.get_hist_data('hs300')#获取沪深300指数k线数据 ts.get_hist_data('000001',start='2021-01-01',end='2021-03-20') #获取”000001”从2021-01-01到2021-03-20的k线数据 '''
回傳值說明如下。
v_ma10: 10日均量;
v_ma20:20日均量;
turnover:換手率(註:指數無此項)。 #########使用 tushare 取得所有股票即時資料#########個股歷史交易資料屬於延遲資料。面對即時變動的價格數據,我們可以使用更方便的當日實時行情,以便在Python 量化中快速把握行情,選擇出當目符合條件的優秀股票。 ######以下使用第三方函式庫 tushare 中的 get_today_all() 兩數來取得所有股票的即時資料(如果是假日,即為上一交易日)。程式碼如下:###importtushareasts ts.get_today_all()############資料的取得是資料研究的根本。一個快速、準確且穩定的 API會極大地縮短個人獲取資料的時間,從而將研究者的精力更多地投入到資料處理與建模中。 tushare 函式庫也是筆者獲取資料的主要方式之它為量化工作提供了穩定而強大的資料來源,從而使資料的採集簡單地使用一行程式碼就可以實現。 ######資料預處理######無論是量化策略還是單純的機器學習項目,資料預處理都是非常重要的一環。從量化學習的角度來看,資料預處理主要包括資料清洗、排序、缺失值或異常值處理、統計量分析、相關性分析和主成分分析(PCA)等。 ######因為先前本書收集的都是規整股票數據,因此本章要介紹的數據預處理就是預先剔除掉不符合條件的股票數據,然後對剩餘股票進行優化篩選。本章主要使用的是 Pandas 函式庫,讀者應該專注於理解篩選思維。 #########清洗掉ST 股票#########ST 股票通常表示對財務狀況或其他狀況出現異常的上市公司股票,對其交易要進行特別處理(Special Treatment) 。由於“特別處理”,在簡稱前冠以 ST,因此這類股票稱為 ST 股。 ######哪一支股票的名稱前加上ST,就是給市場一個警示,該股票存在投資風險,起警告作用,但這種股票風險大,收益也大,如果加上*ST,就表示該股票有退市風險,要警惕的意思,具體就是在2021年4 月左右,如果公司向證監會交的財務報表連續了年虧損,就有退市的風險。股票的交易規則也由報價日漲跌幅限制為漲幅 5%、跌幅 5%。 ######我們要迴避這類「地雷股」(ST 股票),因而可以使用以下程式碼來清洗 ST 股票。 ###
import tushareasts csv_data=ts.get_today_all() csv_data[~csv_data.name.str.contains('ST')]
我们对 csv_data 的 name 列进行操作,筛选出包含 ST 字母的行,并对整个 DataFrame 取反,进而筛选出不含 ST 股票的行。经过观察,我们发现在运行结果中没有 ST 股票,实现了数据的初步清洗。
清洗掉没成交量的股票
首先要明确定义,什么是没有成交量的股票。没有成交量不是成交量为零,而是一支股票单位时间的成交量不活跃。成交量是反映股市上人气聚散的一面镜子。人气旺盛、 买卖踊跃,成交量自然放大:相反人气低迷、买卖不活跃,成交量必定萎缩。成交量是观察庄家大户动态的有效途径。
下面开始清洗没成交量的股票,在原来的基础上增加代码如下:
import tushareasts csv_data=ts.get_today_all() csv_data=csv_data[~csv_data.name.str.contains('ST')] csv_data[csv_data["volume"]>15000000]#15万手
在以上代码中,我们对 csv_data 的 volume 列进行操作。15 万手是过滤掉不活跃、没成交量的股票,主要以小盘股居多。
其运行结果为:
Index 出现了调行现象,即为去掉成交量小手 15 万手的股票。
清洗掉成交额过小的股票
成交额是成交价格与成交数量的乘积,它是指当天已成交股票的金额总数。成交最的至少取决于市场的投资热情。我们每天看大盘,一个重要的指标就是大 A 股成交量是否超过一万亿元,超过即为成交活跃。
筛选成交额超过 1 亿元的股票,代码如下:
import tushareasts csv_data=ts.get_today_all() csv_data=csv_data[~csv_data.name.str.contains('ST')] csv_data=csv_data[csv_data["volume"]>15000000]#15万手 csv_data["amount"]=round(csv_data["amount"]/100000000,2)#一亿,保留2位 csv_data[(csv_data["amount"]>1)]
筛选股票的数量没有锐减,这是因为成交额-成交价格×成交量。有些股票价格低,成交量巨大,乘积刚刚超过 1亿元;有些股票价格高,成交量相对小一些,乘积仍然超过1亿元。同成交额,2元股票相对于 20 元与 200 元股票,其成交量相差10 倍到 100 倍之多。同成交量,有些股票成交额为 100 亿元,相对于成交额仅有 1亿元的股票,也有百倍之多。
用户可以对 1亿元这个参数进行调参,不过笔者不是特别支持。因为将成交额变大即是对大盘股产生偏重,而前面成交量的筛选也己经对大盘股的成交量进行了偏重筛选,这样双重筛选下来,就会全部变成大盘股,数据偏置严重,没有合理性。预处理的思想也是先将数据进行简单的筛选。笔者认为后期的策略相对于这里的调参更为重要,策略是日后交易的核心。
清洗掉换手率低的股票
换手率=某一段时期内的成交量/流通总股数×100% 。一般情况下,大多数股票每日换手率在1%~2.5%之间(不包括初上市的股票)。70%股票的换手率基本在 3%以下,3%就成为一种分界。
当一支股票的换手率在 3%~7%之间时,该股进入相对活跃状态。当换手率在 7%~10%之间时,则为强势股的出现,股价处于高度活跃中。
筛选换手率超过3的股票,代码如下:
importtushareasts csv_data=ts.get_today_all() csv_data=csv_data[~csv_data.name.str.contains('ST')] csv_data=csv_data[csv_data["volume"]>15000000]#15万手 csv_data["amount"]=round(csv_data["amount"]/100000000,2)#一亿,保留2位 csv_data=csv_data[(csv_data["amount"]>1)] csv_data["liutongliang"]=csv_data["nmc"]/csv_data["trade"]#增加流通盘的列 csv_data["turnoverratio"]=round(csv_data["turnoverratio"],2)#换手率保留2位 csv_data[csv_data["turnoverratio"]>3]
筛选股票的数量减半。换手率低于 3%当然也有不错的股票,但是根据正态分布,我们不选取小概率事件。选择换手率较好的股票,意味着该文股票的交投越活跃,人们购买该支股票的意愿越高,该股票属于热门股。
换手率商一般意味股票流通性好,进出市场比较容易,不会出现想买买不到、想卖卖不出的现象,具有我较强的变现能力。然而值得注意的是,换手率较高的股票,往往也是短线资金追逐的对象,投机性较强,股价起伏较大,风险也相对较大。
将换手率降序排列并保存数据
换手率是最重要的一个指标,所以将筛选出来的股票换手率进行降序排列并保存,以备日后取证与研究。
将序排列用 sort_values() 两数,保存用 to_csv() 函数。这两个函数都很常用,也比较简单。代码如下:
import tushare as ts def today_data(): csv_data=ts.get_today_all() csv_data=csv_data[~csv_data.name.str.contains('ST')] csv_data=csv_data[csv_data["volume"]>15000000]#15万手 csv_data["amount"]=round(csv_data["amount"]/100000000,2)#一亿,保留2位 csv_data=csv_data[(csv_data["amount"]>1)] csv_data["liutongliang"]=csv_data["nmc"]/csv_data["trade"]#增加流通盘的列 csv_data["turnoverratio"]=round(csv_data["turnoverratio"],2)#换手率保留2位 csv_data=csv_data[csv_data["turnoverratio"]>3] csv_data=csv_data.sort_values(by="turnoverratio", ascending=False) return csv_data
经过一系列的数据清洗与筛选,选择出符合要求的股票数据并保存到 Jupter Notebook 中。我们将上述代码进行函数化处理,并命名为 get_data.py。
以后,只要运行如下代码,就会将得到的 csv_data 显示出来:
import get_data get_data.today_data()
模块化后,将去掉大量重复代码,重加专注一个功能,也会增强代码的可读性。
本文摘编自《Python量化交易实战》,经出版方授权发布。(ISBN:9787522602820)
以上是Python量化交易實戰:取得股票數據並做分析處理的詳細內容。更多資訊請關注PHP中文網其他相關文章!