入市有风险,投资需谨慎,本文不作为任何投资参考依据。
选股可以通过形态和一些基本面的数据进行选择,还可以通过相似度选股以及趋势选股。
相似度
我们一般比较在意股票的收盘价,比如均线或者各种指标如果需要计算一段序列值,我们一般选择收盘价作为序列中的值,就像5日均线计算的是五日的收盘价的均值一样。
那么每天的收盘价就是一个个数字,一年的收盘价就是一串大概220个数字的序列,这个序列在数学上我们可以用向量来表示,而向量与向量之间是可以计算余弦相似度的,通过这个相似度计算我们可以比较一下两支股票的相似程度。
余弦相似度的值在-1与1之间,越相似就越接近1,反之越接近-1.
假设我们对对一支股票很熟悉,那么和它走势极其相似的股票我们是不是可以认为会在以后也跟我们熟悉的那支股票大概一致呢?或者说,在某个特定的行情下,在手动选出了我认为有利的趋势股票,在通过相似度找到其他的股票或许是件不错的事。
这里研究一下最近一百个交易日内与平安银行(000001)这只股票最相似的前十只股票。
为了避免交易日范围相差太大的情况,比如虽然都是最近100个交易日,但是被计算的股票已经停牌了10个交易日或者它没有上市超过10个交易日,所以应该将这些情况给筛选掉。
还有就是股票之间的价格差距过大,那么通过两只股票的价格来进行相似度比较显然不够合理,所以这里选择股票的涨幅大小来进行相似度比较。
# 计算余弦相似度的函数
def cos(vector_a, vector_b):
vector_a = np.mat(vector_a)
vector_b = np.mat(vector_b)
num = float(vector_a * vector_b.T)
denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
cos = num / denom
return cos
def select_by_similarity(data_path, code_name, top_size=10):
day_range = 100
# 交易日的起始截至时间做大不能超过这个间隔
max_delta = timedelta(days=7)
all_df = load_all_local_data(data_path, tail_size=day_range)
# code_name = "000001.SZ"
if code_name not in all_df:
print("要比对的股票不在当前下载的股票数据中")
vector_a = all_df[code_name].pct_chg
start_date_a = vector_a.index[0]
end_date_a = vect