写在前面
去年七月,笔者开始接触买入股票,近一年下来,投入的的钱亏了一半,股票市场不是基金市场,其中的残酷给我这个初来乍到的年轻人上了一课。当时,我就在想,买卖股票是否能够赚钱,关键就在一个信息。内部的人有内部的消息,总是能赚大量的钱。我作为一个学生,家里边也没有背景,不可能获取到公司内部的消息。在我计算机水平还一般的时候,我一直想做一个东西,把市面上公开的股票信息进行合理的分析,获得一些我们原先看不出来的信息,这样,在我们掌握信息之后,就可以在一定程度上减少我们的损失。(本人tushareID:496517)
几个有趣的因子
- 原先,我所了解的因子仅仅局限于k线,每日涨跌幅度等比较浅显的数据。最近我刚刚认识了几个值
- ADR值
取值范围:
一般而言,由ADR的数值大小可以把大势分为几个区域。
(1)ADR数值在0.5——1.5之间是ADR处在正常区域内。当ADR处在正常区域内时,表明多空双方势均力敌,大盘的走势波动不大、比较平稳,股市大势属于一种盘整行情。这个区域是ADR数值经常出现的区域。
(2)当ADR数值在0.3——0.5之间或1.5——2之间是ADR处在非正常区域内。
当ADR处在1.5——2之间的非正常区域时,表明多头力量占据优势,大盘开始向上一路上涨,股市大势属于一种多头行情;
而当ADR处在0.3——0.5之间的非正常区域时,表明空头力量占据优势,大盘开始一路下跌,股市大势属于一种空头行情。这两个区域是ADR数值比较少出现的区域。
(3)当ADR值是在0.3以下或2以上时是ADR处在极不正常区域内。当ADR处在极不正常区域时,主要是突发的利多、利空消息引起股市暴涨暴跌的情况。此时,股市大势属于一种大空头或大多头行情。
- RSI值
RSI运用法则
(1) 受计算公式的限制,不论价位如何变动,强弱指标的值均在0与100之间。
(2) 强弱指标保持高于50表示为强势市场,反之低于50表示为弱势市场。
(3) 强弱指标多在70与30之间波动。当六日指标上升到达80时,表示股市已有超买现象,如果一旦继续上升,超过90以上时,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。
(4) 当六日强弱指标下降至20时,表示股市有超卖现象,如果一旦继续下降至10以下时则表示已到严重超卖区域,股价极可能有止跌回升的机会。
(5) 每种类型股票的超卖超买值是不同的。
在牛市时,通常蓝筹股的强弱指数若是80,便属超买,若是30便属超卖,至于二三线股,强弱指数若是85至90,便属超买,若是20至25,便属超卖。 但我们不能硬性地以上述数值,拟定蓝筹股或二三线股是否属于超买或超卖,主要是由于某些股票有自己的一套超买/卖水平,即是,股价反覆的股票,通常超买的 数值较高(90至95),而视作超卖的数值亦较低(10至15)。至于那些表现较稳定的股票,超买的数值则较低(65至70),超卖的数值较高(35至 40)。因此我们对一只股票采取买/卖行动前,一定要先找出该只股票的超买/超卖水平。至于衡量一只股票的超买/超卖水平,我们可以参考该股票过去12个 月之强弱指标记录。
(6) 超买及超卖范围的确定还取决于两个因素。第一是市场的特性,起伏不大的稳定的市场一般可以规定70以上超买, 30以下为超卖。变化比较剧烈的市场可以规定80以上超买,20以下为超卖。第二是计算RSI时所取的时间参数。例如,对于9日RSI,可以规定80以上 为超买,20以下为超卖。对于24日RSI,可以规定70以上为超买,30以下为超卖。应当注意的是,超买或超卖本身并不构成入市的讯号。有时行情变化得 过于迅速,RSI会很快地超出正常范围,这时RSI的超买或超卖往往就失去了其作为出入市警告讯号的作用。例如在牛市初期,RSI往往会很快进入80以上 的区域,并在此区域内停留相当长一段时间,但这并不表示上升行情将要结束。恰恰相反,它是一种强势的表现。只有在牛市未期或熊市当中,超买才是比较可靠的 入市讯号。基于这个原因,一般不宜在RSI一旦进入非正常区域就采取买卖行动。最好是价格本身也发出转向信号时再进行交易。这样就可以避免类似于上面提到 的RSI进入超买区但并不立即回到正常区域那样的“陷井”。在很多情况下,很好的买卖讯号是:RSI进入超买超卖区,然后又穿过超买或超卖的界线回到正常 区域。不过这里仍然要得到价格方面的确认,才能采取实际的行动。这种确认可以是:
①趋势线的突破;
②移动平均线的突破;
③某种价格型态的完成。
(7) 强弱指标与股价或指数比较时,常会产生先行显示未来行情走势的特性,亦即股价或指数未涨而强弱指标先上升,股价或指数未跌而强弱指标先下降,其特性在股价的高峰与谷底反应最明显。
(8) 当强弱指标上升而股价反而下跌,或是强弱指标下降而股价反趋上涨,这种情况称之为“背驰”。当RSI在70至80上时,价位破顶而RSI不能破 顶,这就形成了“顶背驰”,而当RSI在30至20下时,价位破底而RSI不能破底就形成了“底背驰”。这种强弱指标与股价变动,产生的背离现象,通常是 被认为市场即将发生重大反转的讯号。
和超买及超卖一样,背驰本背并不构成实际的卖出讯号,它只是说明市场处于弱势。实际的投资决定应当在 价格本身也确认转向之后才作出。虽然在行情确实发生反转的情况下,这个确认过程会使投资者损失一部分利润,可是却可以避免在行情后来并未发生反转的情况下 投资者可能做出过早卖出的错误决定。相对地说,这种错误会对投资者造成更大的损失,因为有时候行情会暂时失去动量然后又重新获得动量,而这时价格并不发生大 规模的转向。
进行因子计算
首先,我们使用tushare把数据获取到,这里我相分析的股票是丽江股份(曾是我买过的股票之一),先把丽江股份的基础信息筛选出来
查询方式可以从这里获得:
https://tushare.pro/document/2?doc_id=25
import tushare as ts
import matplotlib.pyplot as plt
import pandas as pd
import numpy as nppro = ts.pro_api()
data = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,area,industry,list_date')
data.loc[data['name'].isin(['丽江股份'])]
我们从中获得了丽江股份的ts_code
df_data = pro.daily(ts_code='002033.SZ', start_date='20180701', end_date='20220318') # 获取每日详情信息
df_data = df_data[['trade_date', 'open', 'high', 'low', 'close']] # 拿出来需要的几行数据
这里我们用一个小心机,把时间年月日用"-"隔开,方便转化成datetime格式,并把时间作为索引
数据拿到手了,先算一下5日均线和30日均线两个重要数据
se_close = df_data['close'].reindex(df_data['close'].index[::-1]) # 先把数据进行反转,让更早的时间靠前
ma30 = se_close.rolling(30).mean() # 30日均线
ma5 = se_close.rolling(5).mean() # 5日均线plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
plt.figure(figsize=(10, 10))
plt.plot(ma5[400:],label='5日均线')
plt.plot(ma30[400:],label='30日均线')
plt.legend()
短期均线上穿长期均线叫做“金叉”
反之就是死叉
可能我买的时候还是在金叉?(现在已经赔本卖出了,可见并不能完全信服)
那我们就再算一个ADR值
# ADR值
def ADR(x):up = 0down = 0x = list(x)for i in x:if i > 0:up += 1else:down += 1return up/down
ADR_info = pd.Series(data=zhang_info.rolling(10).apply(ADR)) # 十日ADR值plt.figure(figsize=(10, 10))
plt.plot(df_data['ADR_val'][400:], label="ADR", color='black')
plt.legend(fontsize=20)
plt.axhspan(ymin=0.5, ymax=1.5, facecolor='g', alpha=0.5)
plt.axhspan(ymin=0.3, ymax=1.5, facecolor='y', alpha=0.5)
plt.axhspan(ymin=1.5, ymax=2, facecolor='y', alpha=0.5)
plt.axhspan(ymin=0, ymax=0.3, facecolor='r', alpha=0.5)
plt.axhspan(ymin=2, ymax=10, facecolor='r', alpha=0.5)
绘制一张十日ADR值图
从这张图里边可以看出,2021-7时的ADR值还是比较正常的
再计算RSI值
def RSI(x):x = list(x)up = []down = []for i in x:if i > 0:up.append(i)else:down.append((-1)*i)return (np.mean(up) * 100)/ (np.mean(down) + np.mean(up))
df_data['RSI_val'] = df_data['change'].rolling(10).apply(RSI)
plt.figure(figsize=(10, 10))
plt.plot(df_data['RSI_val'][400:])
后记
现在接触的知识有限,更加上时间匆忙,我只能分析这两个因子。后续会考虑同机器学习结合,写一篇股票预测博客。