当前位置:首页>python>量化投资第二步:用Python计算技术指标,制定交易策略!

量化投资第二步:用Python计算技术指标,制定交易策略!

  • 2026-09-26 14:36:15
量化投资第二步:用Python计算技术指标,制定交易策略!

图解MACD、均线等经典指标,手把手教你策略开发

在上一篇文章中,我们学会了如何用Tushare获取股票数据。今天,我们将利用获取的数据计算技术指标,并初步构建交易策略。

一、技术指标概述

技术指标是量化投资的基础工具,通过对历史数据(价格、成交量等)进行数学计算,帮助投资者判断市场趋势和买卖时机。

常用技术指标包括:

  • 趋势指标:移动平均线(MA)、指数平滑移动平均线(MACD)

  • 摆动指标:相对强弱指数(RSI)、随机指标(KDJ)

  • 能量指标:成交量(VOL)、量价曲线

  • 压力支撑指标:布林带(Bollinger Bands)

今天我们将重点介绍移动平均线和MACD这两个最常用的指标。

二、环境准备

确保已经安装必要库,如果还没有,请执行:

pip install tushare pandas matplotlib numpy

三、移动平均线(MA)

移动平均线是消除价格随机波动、显示趋势的重要指标。

1. 计算方法

  • 简单移动平均(SMA):指定时间周期内收盘价的算术平均值

  • 指数移动平均(EMA):对近期价格赋予更高权重,反应更快

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. 计算方法

  1. 计算12日EMA(快线)和26日EMA(慢线)

  2. DIF = 快线 - 慢线

  3. DEA = DIF的9日EMA

  4. 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()

五、策略优化思路

  1. 参数优化:调整均线周期、MACD参数等

  2. 结合多个指标:例如同时使用均线和MACD确认信号

  3. 加入止损机制:设置固定比例或ATR止损

  4. 考虑交易成本:加入佣金和滑点影响

六、注意事项

  1. 技术指标的滞后性:所有指标都基于历史数据,具有滞后性

  2. 市场适应性:不同指标适合不同市场环境

  3. 过度拟合风险:避免在历史数据上过度优化

最新文章

随机文章