本人股市多年的老韭菜,各种股票分析书籍,技术指标书籍阅历无数,萌发想法,何不自己开发个股票预测分析软件,选择python因为够强大,它提供了很多高效便捷的数据分析工具包。
我们已经初步的接触与学习其中数据分析中常见的3大利器---Numpy,Pandas,Matplotlib库。
也简单介绍一下数据获取的二种方法,通过金融数据接口和爬虫获取。
同时介绍了指标之王MACD,随机指标KDJ和BOLL指标线和量价指标的用法
这一章我们讲一下均线指标和经典蜡烛图买卖点:
又叫移动平均线,Moving Average,简称MA,MA是用统计分析的方法,将一定时期内的证券价格(指数)加以平均,并把不同时间的平均值连接起来,形成一根MA,用以观察证券价格变动趋势的一种技术指标。
移动平均线是由著名的美国投资专家Joseph E.Granville(葛兰碧,又译为格兰威尔)于20世纪中期提出来的。均线理论是当今应用最普遍的技术指标之一,它帮助交易者确认现有趋势、判断将出现的趋势、发现过度延生即将反转的趋势。
移动平均线 [1] 常用线有5天、10天、30天、60天、120天和240天的指标
N日移动平均线=N日收盘价之和/N?
比如;5日均线 = (收盘价1 + 收盘价2 + 收盘价3 + 收盘价4 + 收盘价5) / 5
详细代码
# !/usr/bin/env python
# coding=utf-8
import pandas
import pandas as pd
import matplotlib.pyplot as plt
from mpl_finance import candlestick2_ochl
from matplotlib.ticker import MultipleLocator
# 根据指定代码和时间范围获取股票数据
plt.rcParams['font.family'] = 'Heiti TC'
plt.rcParams['font.sans-serif'] = ['SimHei']
df = pd.read_csv('600271.csv',encoding='gbk',index_col=0)
# 设置窗口大小
fig, ax = plt.subplots(figsize=(10, 8))
xmajorLocator = MultipleLocator(5) # 将x轴主刻度设置为5的倍数
ax.xaxis.set_major_locator(xmajorLocator)
# 调用方法绘制K线图
candlestick2_ochl(ax = ax,
opens=df["open"].values, closes=df["close"].values,
highs=df["high"].values, lows=df["low"].values,
width=0.75, colorup='red', colordown='green')
df['close'].rolling(window=3).mean().plot(color="red",label='3日均线')
df['close'].rolling(window=5).mean().plot(color="blue",label='5日均线')
df['close'].rolling(window=10).mean().plot(color="green",label='10日均线')
plt.legend(loc='best') # 绘制图例
ax.grid(True) # 带网格线
plt.title("K线图")
plt.rcParams['font.sans-serif']=['SimHei']
plt.setp(plt.gca().get_xticklabels(), rotation=30)
plt.show()
显示效果:
1:均线从下降逐渐转头向上,股价从均线下方向上突破形成金叉,为买进信号。
2:股价在均线上运行,回调时未跌破均线,说明该均线形成十分可靠的支撑,其后股价又确实不再下跌而再度上涨时,是第二次买进时机。
3:股价之前在均线上运行,回调时发生死叉跌破均线,但均线仍呈上升趋势,说明整体还有一段涨幅,此时为买进时机。
4:股价在均线下运行,连续下跌,距离均线又较远,极有可能会向均线靠拢,所谓物极必反,此时是买进时机,但不宜期望过高。
5:股价在均线上运行,连日大涨,距离均线越来越远,极有可能会回靠均线,随时会产生获利回吐的卖压,是卖出时机。
6:均线总体向下,股价又再次向下跌破均线时说明卖压再次加重,是卖出时机。
7:股价在均线下运行,反弹时接近均线但未能成功向上突破,是卖出时机。
8:股价连续大涨多日,与均线拉开越来越大的距离,是卖出信号,代表了随时可能出现获利回吐卖出。
葛兰威尔均线买卖八大法则,实际上是道氏理论和艾略特波浪理论的图表化、具体化和标准化。
python 代码
# !/usr/bin/env python
# coding=utf-8
import pandas as pd
# 从文件中读取数据
df = pd.read_csv('600276.csv',encoding='gbk')
maIntervalList = [3,5,10]
# 虽然在后文中只用到了5日均线,但这里演示设置3种均线
for maInterval in maIntervalList:
df['MA_' + str(maInterval)] = df['close'].rolling(window=maInterval).mean()
cnt=0
while cnt<=len(df)-1:
try:
# 规则1:收盘价连续三天上扬
if df.iloc[cnt]['close']<df.iloc[cnt+1]['close'] and df.iloc[cnt+1]['close']<df.iloc[cnt+2]['close']:
# 规则2:5日均线连续三天上扬
if df.iloc[cnt]['MA_5']<df.iloc[cnt+1]['MA_5'] and df.iloc[cnt+1]['MA_5']<df.iloc[cnt+2]['MA_5']:
# 规则3:第3天收盘价上穿5日均线
if df.iloc[cnt+1]['MA_5']>df.iloc[cnt]['close'] and df.iloc[cnt+2]['MA_5']<df.iloc[cnt+1]['close']:
print("Buy Point on:" + df.iloc[cnt]['cate'])
except: # 有几天是没有5日均线的,所以用except处理异常
pass
cnt=cnt+1
# !/usr/bin/env python
# coding=utf-8
import pandas as pd
# 从文件中读取数据
df = pd.read_csv('600276.csv',encoding='gbk')
maIntervalList = [3,5,10]
# 虽然在后文中只用到了5日均线,但这里演示设置3种均线
for maInterval in maIntervalList:
df['MA_' + str(maInterval)] = df['close'].rolling(window=maInterval).mean()
cnt=0
while cnt<=len(df)-1:
try:
# 规则1,收盘价连续三天下跌
if df.iloc[cnt]['close']>df.iloc[cnt+1]['close'] and df.iloc[cnt+1]['close']>df.iloc[cnt+2]['close']:
# 规则2,5日均线连续三天下跌
if df.iloc[cnt]['MA_5']>df.iloc[cnt+1]['MA_5'] and df.iloc[cnt+1]['MA_5']>df.iloc[cnt+2]['MA_5']:
#规则3,第3天收盘价下穿5日均线
if df.iloc[cnt+1]['MA_5']<df.iloc[cnt]['close'] and df.iloc[cnt+2]['MA_5']>df.iloc[cnt+1]['Close']:
print("Sell Point on:" + df.iloc[cnt]['date'])
except: # 有几天是没有5日均线的,所以用except处理异常
pass
cnt=cnt+1
短期均线上穿长期均线时,我们将其视为买入信号。在实际应用中,你可能需要结合其他技术指标和市场走势来进一步确认交易信号。
python代码
import pandas as pd
import numpy as np
# 假设我们已经有了一个包含日期和收盘价的数据框
# 这里我们用随机数据生成一个示例数据框
dates = pd.date_range(start='2023-01-01', periods=100)
prices = np.random.randn(100).cumsum() + 100 # 随机价格数据
df = pd.DataFrame({'Date': dates, 'Close': prices})
# 设置移动平均线的周期
short_window = 20
long_window = 50
# 计算短期和长期移动平均线
df['Short_MA'] = df['Close'].rolling(window=short_window, min_periods=1, center=False).mean()
df['Long_MA'] = df['Close'].rolling(window=long_window, min_periods=1, center=False).mean()
# 创建一个空的“Signal”列,用于存储交易信号
df['Signal'] = 0.0
# 生成交易信号:当短期均线上穿长期均线时,产生买入信号
df['Signal'][short_window:] = np.where(df['Short_MA'][short_window:] > df['Long_MA'][short_window:], 1.0, 0.0)
# 输出结果
print(df)
python代码:
import pandas as pd
import numpy as np
# 假设我们已经有了一个包含日期和收盘价的数据框
# 这里我们用随机数据生成一个示例数据框
dates = pd.date_range(start='2023-01-01', periods=100)
prices = np.random.randn(100).cumsum() + 100 # 随机价格数据
df = pd.DataFrame({'Date': dates, 'Close': prices})
# 设置移动平均线的周期
short_window = 20
long_window = 50
# 计算短期和长期移动平均线
df['Short_MA'] = df['Close'].rolling(window=short_window, min_periods=1, center=False).mean()
df['Long_MA'] = df['Close'].rolling(window=long_window, min_periods=1, center=False).mean()
# 创建一个空的“Signal”列,用于存储交易信号
df['Signal'] = 0.0
# 生成交易信号:当短期均线下穿长期均线时,产生卖出信号
df['Signal'][short_window:] = np.where(df['Short_MA'][short_window:] < df['Long_MA'][short_window:], -1.0, 0.0)
# 输出结果
print(df)
?注意:均线指标最好结合量价指标来进行买卖操作,这样判断更加准确
均线指标还有很多的买卖点,都是基于葛兰碧均线法则演变而来,大家有兴趣可以细细研究。