說明:本文只是通過自己的已學知識對股票數據進行了一個簡單的量化分析,只考慮了收盤情況,真實的量化交易中僅僅考慮收盤情況是不夠的,還有很多的復雜因素,而且僅僅三年數據是不足以來指導真實的股票交易的,因此本文只是作為一個簡單的python練手項目。
一、分析目的
利用預先設定的策略,通過對股票交易的歷史數據進行回測,驗證該策略是否能指導股票交易。
二、數據處理
1、數據集描述
數據集來源:https://www.nasdaq.com/symbol/baba/historical
數據集簡介:此數據集來源於Nasdaq網站,本文獲取的是2016/04/15——2019/04/15三年的數據。
列名稱理解:
原數據表的字段列名非常規范,無需進行重命名,以下是每個列名稱的理解:
date:日期
close:收盤價格
volumn:成交量
open:開盤價格
high:日最高價格
low:日最低價格
本次只是簡單針對收盤價格進行了分析。
2、 數據清洗
該數據集比較規范,沒有重復值以及它異常值需要處理。
3、數據導入
# 加載庫 import numpy as np import pandas as pd # 加載數據(本次只用到了日期和收盤價) df = pd.read_csv('E:/相關文件夾/BABA_stock.csv',index_col = 'date',usecols = [0,1]) df.head()
三、數據分析
# 將索引轉化為日期索引 df.index = pd.to_datetime(df.index) # df.index = pd.DatetimeIndex(df.index.str.strip("'")) df.index # 按索引排序 df.sort_index(inplace = True ) df.head()
買賣策略:前一天低於60日平均線第二天高於60日平均線時買入,前一天高於60日平均線第二天低於60日平均線時賣出。
1、計算60日移動平均值
ma60 = df.rolling(60).mean().dropna() ma60
2、找到值從False變為True時買入,True變為False時賣出
ma60_model = df['close'] - ma60['close'] >0 ma60_model
3、找出買點和賣點
# 自定義方法找出買點和賣點 def get_deal_date(w,is_buy = True): if is_buy == True: return True if w[0] == False and w[1] == True else False else: return True if w[0] == True and w[1] == False else False # raw=False沒有的話會有警告信息 # 如果刪除Na值,會有缺失,所以這里用0填充,轉換為bool值方便后面取值 se_buy = ma60_model.rolling(2).apply(get_deal_date,raw = False).fillna(0).astype('bool') se_buy # apply的args接受數組或者字典給自定義函數傳參 se_sale = ma60_model.rolling(2).apply(get_deal_date,raw = False,args = [False]).fillna(0).astype('bool') se_sale # 使用布爾索引找出買點和賣點 buy_info = df[se_buy.values] sale_info = df[se_sale.values] buy_info sale_info
4、計算獲利情況(每股交易獲利情況)
# 轉換為數值索引:需要將索引進行處理后再進行運算 no_index_buy_info = buy_info.reset_index(drop = True) no_index_sale_info = sale_info.reset_index(drop = True) print(no_index_buy_info.head()) print(no_index_sale_info.head()) # 獲利情況 profit = no_index_sale_info - no_index_buy_info # 最后一組數據中沒有賣出點,可能會出現null值 profit.dropna() # 計算總體利潤情況 profit.describe() # 總共賺了多少錢 profit.sum()
圖a 圖b
close 57.66
dtype: float64
從圖a可以看出每次的買入和賣出有盈有虧,從圖b的整體情況來看,總共交易12次,虧損最多的時候是8.61美元,平均每次獲利4.8,最多的一次賺了75.5美元;通過對
所有交易進行匯總分析,得出了獲利總額為57.66美元,總體來說是盈利的。
5、1w美元的最終盈利情況
策略:將每次賣出的錢投入到下一次進行買入
all_money = 10000 remain = all_money # 如果加上每次交易金額的萬分之三手續費 fee = 0.0003 # 由於最后一次未出現賣點,所以交易次數需要用買入次數減一 for i in range(len(no_index_buy_info)-1): buy_count = remain/no_index_buy_info.iloc[i] remain = buy_count * no_index_sale_info.iloc[i]*(1-fee) print(remain)
close 12413.412104
Name: 0, dtype: float64
close 22301.278558
dtype: float64
close 22412.294488
dtype: float64
close 22024.926199
dtype: float64
close 21439.23349
dtype: float64
close 20885.390796
dtype: float64
close 20576.028522
dtype: float64
close 19640.163023
dtype: float64
close 19232.001776
dtype: float64
close 18857.206606
dtype: float64
close 18595.722503
dtype: float64
close 18044.391215
dtype: float64
從以上結果可以看出:三年獲得的利潤為8044.39美元,年化大概26%左右,收益總體來說還是很不錯的,該策略可以放到其他周期或者其他股票里進行分析,如果都可以獲利,說明該策略在指導股票交易上是有效的。