写在前面
去年7月,作者开始联系购买股票。在过去的一年里,他损失了一半的钱。股市不是基金市场,残酷给了我一个新年轻人。当时我在想买卖股票能不能赚钱,关键在于一个信息。内部人有内部消息,总能赚很多钱。作为一名学生,我家里没有背景,不可能得到公司内部的消息。当我的计算机水平还一般的时候,我一直想做点什么,合理分析市场上公开的股票信息,得到一些我们看不到的信息。这样,在掌握了信息之后,我们就可以在一定程度上减少损失。(本人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之间波动。当6日指数上涨至80时,表示股市已超买。如果继续上涨,超过90,则表示已达到严重超买的警戒区,股价已形成头部,很可能在短期内反转。 (4) 当6日强弱指数跌至20时,说明股市超卖。如果继续跌至10以下,说明已经到了严重超卖区,股价很可能有机会停止下跌和反弹。 (5) 各类股票的超卖超买值不同。 在牛市中,如果蓝筹股的强弱指数为80,则为超买,如果为30,则为超卖。至于二三线股,如果强弱指数为85至90,则为超买,如果为20至25,则为超卖。 但是,我们不能硬性制定蓝筹股或二三线股是否超买或超卖,主要是因为有些股票有自己的超买/卖水平,即股价反复的股票通常超买 价值较高(90-95),视为超卖的价值较低(10-15)。对于表现稳定的股票,超买价值较低(65至70),超卖价值较高(35至35 40)。因此,在购买/出售股票之前,我们必须首先找出股票的超买/超卖水平。至于衡量一只股票的超买/超卖水平,我们可以参考该股票过去12个 月度强弱指标记录。 (6) 超买和超卖范围的确定也取决于两个因素。一是市场市场的特点,稳定的市场一般可以规定超过70个, 超卖30以下。变化剧烈的市场可以规定80以上超买,20以下超卖。第二是计算RSI时间参数。例如,日RSI,可规定80以上 超买,20以下超卖。对于24日RSI,可规定70以上超买,30以下超卖。需要注意的是,超买或超卖本身并不构成进入市场的信号。有时市场会发生变化 过于迅速,RSI会很快超出正常范围,此时RSI的超买或超卖往往就失去了其作为出入市警告讯号的作用。比如牛市初期,RSI通常会很快进入80以上 该地区,并在该地区停留了相当长的时间,但这并不意味着上涨的市场即将结束。相反,这是一种强烈的表现。只有在未期牛市或熊市中,超买才更可靠 入市讯号。基于这个原因,一般不适合RSI一旦进入异常区域,采取买卖行动。当价格本身发出转向信号时,最好进行交易。这样就可以避免类似上面提到的问题 的RSI进入超买区但不立即回到正常区域的陷井。在许多情况下,良好的交易信号是:RSI进入超买超卖区,然后通过超买或超卖的界线恢复正常 区域。然而,在采取实际行动之前,我们仍然需要确认价格。这种确认可以是: ①突破趋势线; ②突破移动平均线; ③完成某种价格类型。 (7) 当强弱指数与股价或指数进行比较时,往往会产生先显示未来市场走势的特征,即股价或指数不涨而强弱指数先涨,股价或指数不跌而强弱指数先跌,其特征在股价高峰和底部反应最为明显。 (8) 当强弱指数上涨,股价反而下跌,或者强弱指数下跌,股价反向上涨时,这种情况被称为后退。当RSI70到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 np pro = 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([丽江股份])]
/pre>我们从中获得了丽江股份的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 = 0 down = 0 x = list(x) for i in x: if i > 0: up += 1 else: down += 1 return 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:])
后记
现在接触的知识有限,更加上时间匆忙,我只能分析这两个因子。后续会考虑同机器学习结合,写一篇股票预测博客。