图解MACD、均线等经典指标,手把手教你策略开发
在上一篇文章中,我们学会了如何用Tushare获取股票数据。今天,我们将利用获取的数据计算技术指标,并初步构建交易策略。
一、技术指标概述
技术指标是量化投资的基础工具,通过对历史数据(价格、成交量等)进行数学计算,帮助投资者判断市场趋势和买卖时机。
常用技术指标包括:
趋势指标:移动平均线(MA)、指数平滑移动平均线(MACD)
摆动指标:相对强弱指数(RSI)、随机指标(KDJ)
能量指标:成交量(VOL)、量价曲线
压力支撑指标:布林带(Bollinger Bands)
今天我们将重点介绍移动平均线和MACD这两个最常用的指标。
二、环境准备
确保已经安装必要库,如果还没有,请执行:
pip install tushare pandas matplotlib numpy
三、移动平均线(MA)
移动平均线是消除价格随机波动、显示趋势的重要指标。
1. 计算方法
2. 代码实现
import tushare as tsimport pandas as pdimport matplotlib.pyplot as pltimport numpy as np# 设置token(请替换为你的token)ts.set_token('你的token')pro = ts.pro_api()# 获取数据df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')df['trade_date'] = pd.to_datetime(df['trade_date'])df = df.sort_values('trade_date') # 按日期排序# 计算移动平均线df['MA5'] = df['close'].rolling(5).mean()df['MA10'] = df['close'].rolling(10).mean()df['MA20'] = df['close'].rolling(20).mean()# 绘制股价和移动平均线plt.figure(figsize=(12, 8))plt.plot(df['trade_date'], df['close'], label='收盘价', linewidth=2)plt.plot(df['trade_date'], df['MA5'], label='5日均线', alpha=0.8)plt.plot(df['trade_date'], df['MA10'], label='10日均线', alpha=0.8)plt.plot(df['trade_date'], df['MA20'], label='20日均线', alpha=0.8)plt.title('平安银行(000001)股价与移动平均线', fontsize=15)plt.xlabel('日期', fontsize=12)plt.ylabel('价格(元)', fontsize=12)plt.legend()plt.grid(True, alpha=0.3)plt.xticks(rotation=45)plt.tight_layout()plt.show()
3. 均线策略
金叉与死叉:
金叉:短期均线上穿长期均线,买入信号
死叉:短期均线下穿长期均线,卖出信号
# 生成交易信号df['Signal'] = 0 # 初始化信号列# 5日均线上穿20日均线,金叉,买入信号(1)df.loc[df['MA5'] > df['MA20'], 'Signal'] = 1# 5日均线下穿20日均线,死叉,卖出信号(-1)df.loc[df['MA5'] < df['MA20'], 'Signal'] = -1# 计算每日持仓(金叉买入,死叉卖出,其余时间持仓不变)df['Position'] = df['Signal'].replace(0, method='ffill') # 向前填充# 计算策略收益df['Strategy_Return'] = df['Position'].shift(1) * df['close'].pct_change()# 计算累计收益df['Cumulative_Market'] = (1 + df['close'].pct_change()).cumprod()df['Cumulative_Strategy'] = (1 + df['Strategy_Return']).cumprod()# 绘制累计收益对比plt.figure(figsize=(12, 6))plt.plot(df['trade_date'], df['Cumulative_Market'], label='持有收益', alpha=0.8)plt.plot(df['trade_date'], df['Cumulative_Strategy'], label='均线策略收益', alpha=0.8)plt.title('均线策略收益对比', fontsize=15)plt.xlabel('日期', fontsize=12)plt.ylabel('累计收益', fontsize=12)plt.legend()plt.grid(True, alpha=0.3)plt.xticks(rotation=45)plt.tight_layout()plt.show()
四、MACD指标
MACD是股票交易中常用的趋势判断指标,由快线(DIF)、慢线(DEA)和柱状图(MACD)组成。
1. 计算方法
计算12日EMA(快线)和26日EMA(慢线)
DIF = 快线 - 慢线
DEA = DIF的9日EMA
MACD = (DIF - DEA) × 2
2. 代码实现
# 计算EMA函数def calculate_ema(data, period): return data.ewm(span=period, adjust=False).mean()# 计算MACDdef calculate_macd(df, fast=12, slow=26, signal=9): df['EMA_fast'] = calculate_ema(df['close'], fast) df['EMA_slow'] = calculate_ema(df['close'], slow) df['DIF'] = df['EMA_fast'] - df['EMA_slow'] df['DEA'] = calculate_ema(df['DIF'], signal) df['MACD'] = (df['DIF'] - df['DEA']) * 2 return dfdf = calculate_macd(df)# 绘制MACD图plt.figure(figsize=(12, 10))# 股价和均线plt.subplot(2, 1, 1)plt.plot(df['trade_date'], df['close'], label='收盘价', linewidth=2)plt.plot(df['trade_date'], df['MA5'], label='5日均线', alpha=0.8)plt.plot(df['trade_date'], df['MA20'], label='20日均线', alpha=0.8)plt.title('平安银行(000001)股价与移动平均线', fontsize=15)plt.ylabel('价格(元)', fontsize=12)plt.legend()plt.grid(True, alpha=0.3)# MACDplt.subplot(2, 1, 2)plt.plot(df['trade_date'], df['DIF'], label='DIF', linewidth=1.5)plt.plot(df['trade_date'], df['DEA'], label='DEA', linewidth=1.5)plt.bar(df['trade_date'], df['MACD'], label='MACD', alpha=0.5)plt.title('MACD指标', fontsize=15)plt.xlabel('日期', fontsize=12)plt.ylabel('MACD', fontsize=12)plt.legend()plt.grid(True, alpha=0.3)plt.xticks(rotation=45)plt.tight_layout()plt.show()
3. MACD策略
# 生成MACD交易信号df['MACD_Signal'] = 0df.loc[df['DIF'] > df['DEA'], 'MACD_Signal'] = 1 # DIF上穿DEA,买入df.loc[df['DIF'] < df['DEA'], 'MACD_Signal'] = -1 # DIF下穿DEA,卖出# 计算MACD策略收益df['MACD_Position'] = df['MACD_Signal'].replace(0, method='ffill')df['MACD_Strategy_Return'] = df['MACD_Position'].shift(1) * df['close'].pct_change()# 计算累计收益df['Cumulative_MACD'] = (1 + df['MACD_Strategy_Return']).cumprod()# 绘制三种策略对比plt.figure(figsize=(12, 6))plt.plot(df['trade_date'], df['Cumulative_Market'], label='持有收益', alpha=0.8)plt.plot(df['trade_date'], df['Cumulative_Strategy'], label='均线策略收益', alpha=0.8)plt.plot(df['trade_date'], df['Cumulative_MACD'], label='MACD策略收益', alpha=0.8)plt.title('不同策略收益对比', fontsize=15)plt.xlabel('日期', fontsize=12)plt.ylabel('累计收益', fontsize=12)plt.legend()plt.grid(True, alpha=0.3)plt.xticks(rotation=45)plt.tight_layout()plt.show()
五、策略优化思路
参数优化:调整均线周期、MACD参数等
结合多个指标:例如同时使用均线和MACD确认信号
加入止损机制:设置固定比例或ATR止损
考虑交易成本:加入佣金和滑点影响
六、注意事项
技术指标的滞后性:所有指标都基于历史数据,具有滞后性
市场适应性:不同指标适合不同市场环境
过度拟合风险:避免在历史数据上过度优化