1.tushare
一直用tushare獲取數據,數據準確,獲取方便,感謝米哥。
2.股票溫度
股票價值投資 (Value Investing)一種常見的投資方式,專門尋找價格低估的證券。價值投資常用的參數就是pe,pb。可以用於個股,也可以用於板塊,指數。本文用個股簡單的舉個例子而已。
2.1計算方法
2.2.公式解釋
假設Pe是服從正態分佈的,則F(Pe)爲Pe在此正態分佈中縱座標的值,取值範圍是[0,1],則通過F(Pe)就可以計算Pe值在樣本數據中是高分位還是低分位了。
3.實現
3.1.通過tushare獲取數據
import tushare as ts
import datetime
ts.set_token(TOKEN) # TOKEN爲個人申請值
pro = ts.pro_api()
end_date = datetime.date.today().strftime('%Y%m%d')
start_date = (datetime.date.today() - datetime.timedelta(days=365 * 10)).strftime('%Y%m%d') # 獲取十年期間的數據
df = pro.daily_basic(ts_code='000001.sz', start_date=start_date, end_date=end_date, fields='ts_code,trade_date,close, turnover_rate,volume_ratio,pe,pe_ttm,pb')
print(df.head(5))
3.2.計算溫度
import numpy as np
import pandas as pd
def norm_dist_func(x, _mean, _std):
result = norm_dist_func_s(x, _mean, _std)
return round(result * 100.0, 2)
def norm_dist_func_s(x, _mean, _std):
oor2pi = 1 / np.sqrt(2.0 * np.pi)
x2 = (x - _mean) / _std
if x2 == 0:
res = 0.5
else:
t = 1 / (1.0 + 0.2316419 * np.abs(x2))
t = t * oor2pi * np.exp(-0.5 * x2 * x2) * (0.31938153 + t * (-0.356563782 + t * (1.781477937 + t * (-1.821255978 + t * 1.330274429))))
if x2 > 0:
res = 1.0 - t
else:
res = t
return res
pe_std = np.std(df['pe'], ddof=1) # pe的標準差
pe_mean = np.mean(df['pe']) # pe的平均值
pb_std = np.std(df['pb'], ddof=1) # pb的標準差
pb_mean = np.mean(df['pb']) # pb的平均值
df['pe_temperature'] = df['pe'].apply(norm_dist_func, _mean=pe_mean, _std=pe_std) # 計算pe溫度
df['pb_temperature'] = df['pb'].apply(norm_dist_func, _mean=pb_mean, _std=pb_std) # 計算pb溫度
df['temperature'] = df['pe_temperature'] * 0.5 + df['pb_temperature'] * 0.5
3.3.溫度和收盤價展示
可以看出,溫度比較低的時候,上漲概率較大。
3.4. 關於溫度的統計分析
dic_temperature_upper_counter = {} # 特定溫度下的上漲次數
dic_temperature_upper_profit = {} # 特定溫度下的上漲次數
dic_temperature_all = {} # 特定溫度下的出現次數
for j in range(df.shape[0]):
temperature_level = str(int(df.iloc[j]['temperature_level']))
if temperature_level not in dic_temperature_upper_counter.keys():
dic_temperature_upper_counter[temperature_level] = 0
dic_temperature_all[temperature_level] = 0
dic_temperature_upper_profit[temperature_level] = 0
if df.iloc[j]['profit'] > 0:
dic_temperature_upper_counter[temperature_level] = dic_temperature_upper_counter[temperature_level] + 1
dic_temperature_all[temperature_level] = dic_temperature_all[temperature_level] + 1
for k, v in dic_temperature_upper_counter.items():
dic_temperature_upper_profit[k] = round(v / dic_temperature_all[k] * 100, 2)
print('溫度{0}出現次數:{1}, 上漲概率{2}%'.format(k, dic_temperature_upper_counter[k], dic_temperature_upper_profit[k]))
sorted_dic_counter = sorted(dic_temperature_upper_profit.items(), key=lambda d: d[1], reverse=True)
print('股票:{0}最適宜溫度是{1},上漲概率是{2}%'.format('000001.sz', sorted_dic_counter[0][0], sorted_dic_counter[0][1]))
從統計數據中可以看出,並不是溫度越低越好,每個股票都有自己的最適宜溫度
4.結語
股票分析有很多方法,本文只是一個比較簡單的方法來進行量化,再次感謝米哥提供如此好的數據源。