python探究小市值因子的有效性
前言:在Barra的10個風格因子中,size(市值)因子引起了很多人的關注。其中就包括著名的小市值因子。
有的人將小市值股票定義為,按照市值排序,后50%的股票是小市值股票。
而本文中,將股票按照每日收盤價的市值排序,令后30%的股票是小市值股票。
設計一個簡單的投資策略,檢驗小市值因子的有效性。
每日收盤前,以收盤價等權重買入當日流通市值最小的30%股票。
第二日收盤前,立刻賣出前一日的股票倉位,買入第二日流通市值最小的30%股票。
接下來,以此類推。。
最終查看按照該策略進行投資,近10年來的投資收益情況。
數據來源:2009年3月17日至2019年3月15日,中國A股市場上所有股票(股票總數隨著時間在變動)的‘
股票代碼、交易日期、收盤價、日個股交易股數、日個股交易金額、日個股流通市值、日個股總市值、考慮現金紅利再投資的日個股回報率、交易狀態。
其對應的代碼如下:
Stkcd,Trddt,Clsprc,Dnshrtrd,Dnvaltrd,Dsmvosd,Dsmvtll,Dretwd,Trdsta
代碼如下:
#本程序實現了小盤因子的收益率分析 #先導入數據,保存每日個股的數據 import pandas as pd import numpy as np""" data_raw = pd.read_csv(".\\new_total_little_size.csv") #處理回報率數據,使其對應x日后的回報率 data_x = data_raw["Dretwd"].values data_x = data_x.flatten() length = len(data_raw) data_new_x = np.zeros(length) x = 1 data_new_x[0 : length - x] = data_x[x : length] data_raw["Dretwd"] = data_new_x data_raw = pd.DataFrame(data_raw).sort_values(by = ["Trddt", "Dsmvosd"]) data_raw.to_csv("new2_total_little_size.csv", index = False)data_raw = pd.DataFrame(pd.read_csv(".\\new2_total_little_size.csv")) print("OK") #用于讀取文件數據,并找到時間間隔點,寫入文件location中, 此處用簡單的二分法快速查詢時間間隔點。 data = data_raw location = [] for i in range(1500, len(data_raw) - 1, 1500):if data_raw["Trddt"][i - 1500] != data_raw["Trddt"][i]:left, right = i - 1500, ileft_date, right_date = data_raw["Trddt"][i - 1500], data_raw["Trddt"][i]while True:judge = int((left + right) / 2)if data["Trddt"][judge] == data["Trddt"][judge + 1] and data["Trddt"][judge] == left_date:left = judgecontinueif data["Trddt"][judge] == data["Trddt"][judge - 1] and data["Trddt"][judge] == right_date:right = judgecontinueif data["Trddt"][judge] != left_date and data["Trddt"][judge] != right_date:print("find new one")breakif data["Trddt"][judge] != data["Trddt"][judge - 1]:location.append(judge)breakif data["Trddt"][judge] != data["Trddt"][judge + 1]:location.append(judge + 1)break with open("location_little_size", "a+", encoding = "utf-8") as f:for i in range(len(location)):f.write(str(location[i]) + "\n") """data_raw = pd.DataFrame(pd.read_csv(".\\new2_total_little_size.csv")) print("OK") time_table = [] with open("location_little_size", "r") as f:for line in f:line = line.strip('\n')time_table.append(int(line)) rate1 = [] rate2 = [] rate3 = [] for i in range(len(time_table)):if i == 0:begin = 0end = time_table[i] - 1else:begin = time_table[i-1]end = time_table[i] - 1return_rate = 0#取前30%的小市值股票divisor = round((end - begin) * 0.3)for j in range(divisor):return_rate += float(data_raw["Dretwd"][begin + j])rate1.append(return_rate / divisor)return_rate = 0#取后30%的大市值股票divisor = round((end - begin) * 0.3)for j in range(divisor):return_rate += float(data_raw["Dretwd"][end - divisor + j + 1])rate2.append(return_rate / divisor)return_rate = 0#取30%-70%的中等市值股票begin_length = round((end - begin) * 0.3)divisor = round((end - begin) * 0.4)for j in range(divisor):return_rate += float(data_raw["Dretwd"][begin + begin_length + j])rate3.append(return_rate / divisor)for i in range(len(rate1)):print(rate1[i])print("Changing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")for i in range(len(rate2)):print(rate2[i])print("Changing!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!")for i in range(len(rate3)):print(rate3[i]) #按照位置輸出日期 #for i in range(len(time_table)): # print(data_raw["Trddt"][time_table[i]])#讀取指數文件數據 #data_index = pd.read_csv(".\little_size\index_2009-2019\TRD_index.csv")結論:
如下圖所示,很明顯,小市值因子是有效的,按照該理想策略的投資收益率,顯著高于其他市值因子。
大概在2018年初,有一段時間小市值因子失效了,引得行業內跟蹤小市值因子或者以此為策略的人開始懷疑人生了。
好在2019年,小市值因子重新煥發生機。
除此之外,也可以看出,隨著市值的增大,該策略的投資回報率在下降。
運行結果太長了,自己搜集數據來運行吧,分享給對小市值因子感興趣的人。
總結
以上是生活随笔為你收集整理的python探究小市值因子的有效性的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关不掉的窗口
- 下一篇: websocket python爬虫_p