怪物卡车机器人
83.87MB · 2025-09-30
炒股的时候,大家经常听到一句话:支撑位和压力位很关键。 如果把股价的运行比作人在大楼里走动,支撑位就像地板,会把人托住;压力位就是天花板,会挡住人往上冲。
那问题来了:这些地板和天花板到底在哪? 今天花姐就带大家看看一个经典的工具——斐波那契。
我这里用的行情数据源是 xtquant + miniQMT。
后续示例里会用到一些常见的 Python 库:pandas, numpy, matplotlib
,进阶部分还会涉及 scipy, sklearn
。在实际运行代码之前,记得先把环境配置好:
pip install pandas numpy matplotlib scipy scikit-learn xtquant
这样就能避免因为依赖缺失导致的报错啦。
以下是一个基于xtquant + miniQMT获取股票行情的方法,后面的行情Dataframe数据都会通过这个方法来获取:
def get_hq(code,start_date='19900101',period='1d',dividend_type='front_ratio',count=-1):
'''
基于xtquant下载某个股票的历史行情
盘中运行最后一个K里存了最新的行情
period 1d 1w 1mon
dividend_type - 除权方式,用于K线数据复权计算,对tick等其他周期数据无效
none 不复权
front 前复权
back 后复权
front_ratio 等比前复权
back_ratio 等比后复权
'''
xtdata.enable_hello = False
xtdata.download_history_data(stock_code=code, period='1d',incrementally=True)
history_data = xtdata.get_market_data_ex(['open','high','low','close','volume','amount','preClose','suspendFlag'],[code],period=period,start_time=start_date,count=count,dividend_type=dividend_type)
print(history_data)
df = history_data[code]
df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
df['date'] = df.index
return df
斐波那契(Fibonacci,本名列昂纳多·比萨)是13世纪意大利的一位数学家。
他提出了一个很有意思的问题:
如果一对兔子每个月都会生一对新的兔子,而新兔子在第二个月开始繁殖,那么经过若干个月,会有多少对兔子?
为了回答这个问题,他推导出了一个数列:
1, 1, 2, 3, 5, 8, 13, 21…
这个就是著名的 斐波那契数列。
数列里有一个很神奇的规律:
而 0.618 在自然界里无处不在:
这种普遍存在的规律被称为“黄金分割”,后来被引入金融市场。 大家发现股价的波动也常常在这些比例附近表现出支撑或压力,于是便发展出了 斐波那契回撤 这一技术工具。
斐波那契数列大家或多或少都听过:1, 1, 2, 3, 5, 8, 13… 这个数列的相邻数字比例,会逐渐趋近于 0.618,也就是著名的“黄金分割”。
在金融市场中,常用的斐波那契比例有:
当股价在某段时间里走出一个高点 H 和低点 L,我们就可以用这些比例来推算潜在的支撑和压力区域。
市场里很多投资者会关注这些点位,自然就容易形成“共识心理”,价格也更容易在这些区域发生反应。
其中 就是斐波那契比例(0.236, 0.382, 0.5, 0.618, 0.786)。
0.618回撤位:
也就是说,13.82 附近可能就是股价的支撑位。
这段代码的功能是:先从指定股票获取历史行情数据,然后根据最近一段时间的收盘价找到最高点和最低点,计算出斐波那契回撤线,用来标记价格可能的支撑和阻力位,并将股价走势、回撤线以及最高点和最低点可视化展示,帮助投资者直观判断股票的趋势和关键价格区间,同时将0.618的线重点画成金色。
from xtquant import xtdata
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def get_hq(code,start_date='19900101',period='1d',dividend_type='front_ratio',count=-1):
'''
基于xtquant下载某个股票的历史行情
盘中运行最后一个K里存了最新的行情
period 1d 1w 1mon
dividend_type - 除权方式,用于K线数据复权计算,对tick等其他周期数据无效
none 不复权
front 前复权
back 后复权
front_ratio 等比前复权
back_ratio 等比后复权
'''
xtdata.enable_hello = False
xtdata.download_history_data(stock_code=code, period='1d',incrementally=True)
history_data = xtdata.get_market_data_ex(['open','high','low','close','volume','amount','preClose','suspendFlag'],[code],period=period,start_time=start_date,count=count,dividend_type=dividend_type)
df = history_data[code]
df.index = pd.to_datetime(df.index.astype(str), format='%Y%m%d')
df['date'] = df.index
return df
def plot_fibonacci(df, period=200):
"""
计算并绘制斐波那契回撤线
:param df: DataFrame, 包含['open','high','low','close','volume']
:param period: 回看区间长度,默认200
"""
df = df.tail(period).copy()
# 找高低点及索引
high_idx = df['close'].idxmax()
low_idx = df['close'].idxmin()
high = df.loc[high_idx, 'close']
low = df.loc[low_idx, 'close']
# 判断谁更靠近最新K线
last_idx = df.index[-1]
if abs(last_idx - high_idx) < abs(last_idx - low_idx):
# 高点更近:从高到低画线
trend = "down"
else:
# 低点更近:从低到高画线
trend = "up"
# 计算斐波那契回撤
diff = high - low
levels = [0.236, 0.382, 0.5, 0.618, 0.786]
fibo_levels = {}
if trend == "down":
fibo_levels = {f"{p*100:.1f}%": high - diff * p for p in levels}
else:
fibo_levels = {f"{p*100:.1f}%": low + diff * p for p in levels}
# 绘图
plt.figure(figsize=(12,6))
plt.plot(df['close'].values, label="Close Price", color="black")
begin_line = high if trend == "down" else low
plt.hlines(begin_line, 0, len(df), linestyles="--",colors='red', label=f"begin_line: {begin_line:.2f}")
plt.text(len(df)*0.99, begin_line, f"{begin_line:.2f}", va="center", ha="right", color="blue")
# 画斐波那契水平线并标注价格
for k, v in fibo_levels.items():
if k == "61.8%":
plt.hlines(v, 0, len(df), linestyles="--", colors='gold', label=f"{k}: {v:.2f}")
plt.text(len(df)*0.99, v, f"{v:.2f}", va="center", ha="right", color="blue")
else:
plt.hlines(v, 0, len(df), linestyles="--", colors='gray', label=f"{k}: {v:.2f}")
plt.text(len(df)*0.99, v, f"{v:.2f}", va="center", ha="right", color="blue")
# 标记高点和低点
plt.scatter(df.index.get_loc(high_idx), high, color="red", marker="o", s=100, label=f"High: {high:.2f}")
plt.scatter(df.index.get_loc(low_idx), low, color="red", marker="o", s=100, label=f"Low: {low:.2f}")
plt.title(f"Fibonacci Retracement ({trend}) - {period} bars")
plt.legend()
plt.show()
return {
"trend": trend,
"high": (high_idx, high),
"low": (low_idx, low),
"fibo_levels": fibo_levels
}
if __name__ == "__main__":
df = get_hq('600519.SH', start_date='20220101', period='1d', dividend_type='front_ratio', count=200)
result = plot_fibonacci(df, period=200)
print(result)
运行后你会得到一组价位,这些就是对应区间的斐波那契支撑/压力参考。
今天关于寻找股票支撑与压力位的斐波那契法就写到这里了,更高级的用法有兴趣的朋友可以结合AI来自由探索,花姐这里只做简单科普抛砖引玉。
下一篇我们介绍通过成交量剖面寻找股票支撑与压力位。