
为什么用Python分析股票趋势
散户看盘往往凭感觉,追涨杀跌。Python能帮你把感觉变成规则。它像一台不知疲倦的扫描仪,把历史价格、成交量、财务数据全部摊开,用数学计算告诉你趋势的方向和强度。股票趋势分析的本质是识别价格运动的方向,Python擅长处理这种重复性计算,还能避免人为情绪干扰。
准备工作:获取数据
分析趋势的第一步是拿到干净的数据。免费方案可以用yfinance库拉取美股和部分A股数据,A股更稳定的来源是akshare。安装这两个库后,几行代码就能把日线数据变成表格。
import yfinance as yf
import pandas as pd
# 下载苹果公司过去两年的日线数据
df = yf.download('AAPL', start='2023-01-01', end='2025-01-01')
print(df.head())
数据包含开盘价、最高价、最低价、收盘价和成交量。收盘价是趋势分析的核心,成交量用来验证趋势的可靠性。

趋势判断的三大基础指标
移动平均线(MA)
移动平均线把价格噪音过滤掉,显示一段时间内的平均成本。短期均线上穿长期均线,通常意味着上涨趋势形成。Python里用rolling函数一行搞定。
df['MA20'] = df['Close'].rolling(window=20).mean()
df['MA60'] = df['Close'].rolling(window=60).mean()
# 生成金叉死叉信号
df['Signal'] = 0
df.loc[df['MA20'] > df['MA60'], 'Signal'] = 1
df.loc[df['MA20'] < df['MA60'], 'Signal'] = -1
MA20代表一个月的交易成本,MA60代表一个季度。当价格站上MA60且MA20在MA60上方,中期趋势偏多。注意均线有滞后性,震荡市里频繁交叉会发出假信号。
相对强弱指数(RSI)
RSI衡量最近涨跌力量的对比,数值在0到100之间。传统用法是RSI超过70算超买,低于30算超卖。趋势分析中更实用的方法是看RSI是否在50以上运行,50以上说明多头占优。
delta = df['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
df['RSI'] = 100 - (100 / (1 + rs))
RSI和价格走势出现背离时值得警惕。价格创新高但RSI没创新高,上涨动能可能在减弱。
MACD指标
MACD由快慢两条指数移动平均线之差构成,加上一条信号线。快线上穿慢线是买入信号,下穿是卖出信号。MACD适合捕捉中期趋势的转折。
exp12 = df['Close'].ewm(span=12, adjust=False).mean()
exp26 = df['Close'].ewm(span=26, adjust=False).mean()
df['MACD'] = exp12 - exp26
df['MACD_Signal'] = df['MACD'].ewm(span=9, adjust=False).mean()
df['MACD_Hist'] = df['MACD'] - df['MACD_Signal']
MACD柱状图由负转正,往往对应趋势由弱转强。需要注意的是,MACD在横盘震荡中会反复翻红翻绿,单独使用容易被打脸。
多指标共振提高胜率
单一指标容易骗线。把均线、RSI、MACD组合起来,要求多个条件同时满足才确认趋势。比如做多信号可以定义为:收盘价高于MA60,MA20高于MA60,RSI大于50,MACD柱状图为正。四个条件同时成立时,趋势的可靠性大幅提升。
df['Buy'] = ((df['Close'] > df['MA60']) &
(df['MA20'] > df['MA60']) &
(df['RSI'] > 50) &
(df['MACD_Hist'] > 0))
这种组合逻辑在Python里就是简单的布尔运算,跑一遍全历史数据,马上能看到信号分布。
用回测验证趋势策略
信号生成后,需要知道这套规则在历史上到底赚不赚钱。回测就是让策略在历史数据上模拟交易。计算每次买入到卖出的收益,累加得到总回报。重点看最大回撤和胜率,而不是只看总收益。
df['Position'] = df['Buy'].shift(1).fillna(False).astype(int)
df['Returns'] = df['Close'].pct_change()
df['Strategy_Returns'] = df['Position'] * df['Returns']
cumulative = (1 + df['Strategy_Returns']).cumprod()
print(cumulative.tail())
回测结果好看不代表未来有效,但能帮你排除明显有逻辑缺陷的策略。股票市场趋势会变化,参数需要定期检查,避免过度优化。
期货市场的趋势分析差异
期货和股票的趋势分析逻辑相通,细节有差别。期货有杠杆、有到期日、有夜盘,数据频率更高。用Python分析期货趋势时,常用tushare或akshare获取主力连续合约。期货趋势更看重持仓量变化,价升仓增是健康上涨,价升仓减要警惕。均线系统在期货上同样适用,但止损设置要更严格,因为杠杆放大了波动。
# 期货数据示例,假设已获取主力合约数据
# 计算持仓量变化与价格趋势的配合
# fut_df['OI_Change'] = fut_df['OpenInterest'].pct_change()
# fut_df['Price_Change'] = fut_df['Close'].pct_change()
期货趋势策略的回测要包含手续费和滑点,否则结果会严重高估。商品期货受宏观周期影响大,用Python拉取库存数据、基差数据一起分析,比单纯看价格均线更有优势。
实战中的关键细节
数据清洗不能跳过。停牌、除权除息会导致价格跳空,直接用原始收盘价算指标会失真。用adj_close复权价格更可靠。时间序列要对齐,股票和期货的交易时间不同,跨品种分析时注意时区。
趋势分析不是预测未来,而是评估当前状态。Python帮你把状态量化成数字,决策仍然需要人来定。代码写好后,每天收盘跑一次,把信号记录在表格里,坚持三个月,你会对自己的交易规则有更清晰的认识。