先说个我自己的故事。
刚学炒股那几年,有一阵子我天天盯盘,越盯越急,越急越亏,亏了就想补,补了继续亏。心态崩得不成样子,夜里做梦都在打板。
那时候,我对K线两个字的理解,就俩词:波动 + 情绪。
后来偶然间翻起《道德经》,一句“致虚极,守静笃”,像大锤一样把我脑袋敲醒了。当时我还真不是搞玄学哈,我是个理工科出身的Python程序员,但我突然明白了:炒股不就跟练太极一样嘛,阴阳互转,涨跌之间藏着规律。
你可能在想:量化不是讲逻辑、讲代码的吗?怎么整这一出?
别急,听我慢慢展开。
K线不是玄学,是“道”在波动
老子说:“道生一,一生二,二生三,三生万物。”
听着抽象?换成股市语言翻译一下:
- “一”是市场的本源,也可以理解为趋势;
- “二”是阴阳,也就是多空力量;
- “三”是情绪 + 资金 + 时间的三维交互;
- “万物”就是我们眼中的K线、形态、波动。
所以,一根K线,是不是就是多空交锋后的结果?阳线是多头强,阴线是空头强。而长上影、长下影,实际上都是“中气以为和”的表现——强中带弱,弱中带强。
而当我们把K线一根一根连起来,再加点Python的技术,就能观察到趋势的“归根复命”——涨久必跌,跌久必涨。
用Python“看懂”K线的阴阳循环
K线里到底藏了多少秘密?
你可能见过什么“启明星” “黄昏星” “吞没” “十字星”……
但这些都是图形而已,如果你能抓到“涨跌转换”的临界点,才算真正开始懂了阴阳。
我们用Python搞一个简单的小实验:识别一个经典的“早晨之星”形态。
先上代码——我改进了一些条件判定,去掉了很多噪音。
import pandas as pd
import mplfinance as mpf
import numpy as np
df = pd.read_csv(r"这里是股票行情csv文件路径")
df = df[['open', 'high', 'low', 'close', 'date']]
df = df.set_index('date')
df.index = pd.to_datetime(df.index)
# 晨星识别函数
def is_morning_star(df):
"""
简化版晨星识别:
- 第一天为大阴线
- 第二天实体小,低开(星体)
- 第三天阳线且收盘超过第一天中点
"""
signals = []
for i in range(2, len(df)):
day1 = df.iloc[i - 2]
day2 = df.iloc[i - 1]
day3 = df.iloc[i]
if (
day1['close'] < day1['open'] and
day2['close'] < day2['open'] and
day2['open'] < day1['close'] and
day3['close'] > day3['open'] and
day3['close'] > (day1['open'] + day1['close']) / 2
):
signals.append(True)
else:
signals.append(False)
return [False, False] + signals
df['morning_star'] = is_morning_star(df)
scatter_data = pd.Series(
[row['low']*0.99 if row['morning_star'] else np.nan for _, row in df.iterrows()],
index=df.index
)
apds = [
mpf.make_addplot(
scatter_data,
type='scatter',
markersize=100,
marker='^',
color='blue'
)
]
# 中文支持
my_style = mpf.make_mpf_style(
base_mpf_style='charles',
marketcolors=mpf.make_marketcolors(
up='red', down='green', inherit=True
),
rc={'font.sans-serif': 'SimHei', 'axes.unicode_minus': False}
)
# 绘图
mpf.plot(df, type='candle', style=my_style, addplot=apds,
title='晨星形态识别演示', ylabel='价格', volume=False)
聪明的你一定会发现——虽然代码短,但判断逻辑就是“阴→星→阳”的转换,也就是典型的“阴极生阳”。
是不是和《道德经》里的“知常曰明,不知常,妄作凶”有点味道了?
趋势看似复杂,本质只有“涨”与“跌”
有一说一,我一开始也搞不懂啥叫“致虚极,守静笃”。
直到我把股市看成了对抗——涨 vs 跌,涨到极致要跌,跌到极致会涨,就像老子讲的“物极必反”。所以说趋势再复杂,最终就是两个方向之间的来回转换。
就像打太极,你出拳我接招,市场的波动,正是因为情绪不断博弈的结果。
这里我推荐大家做一个“小实验”:
- 把K线的涨跌(用close-open判断)转成+1/-1
- 然后画成折线图
你会发现——很多时候,涨跌节奏呈现出某种“波”的形态,而且有一个“周期”。我们可以用简单的FFT(快速傅里叶变换)来看这个频率结构。
代码如下:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import mplfinance as mpf
def plot_kline_and_fft_vertical(df):
# 计算涨跌波形
deltas = df['close'] - df['open']
wave = [1 if d > 0 else -1 for d in deltas]
fft = np.fft.fft(wave)
freq = np.abs(fft)
# 画布2行1列,上下排列
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(12, 8), gridspec_kw={'height_ratios':[3,1]})
# 画K线到ax1
my_style = mpf.make_mpf_style(
base_mpf_style='charles',
marketcolors=mpf.make_marketcolors(up='red', down='green', inherit=True),
rc={'font.sans-serif': 'SimHei'}
)
mpf.plot(df, type='candle', style=my_style, ax=ax1, volume=False, show_nontrading=False)
# 频率图画到ax2
ax2.plot(freq[:len(freq)//2], color='blue')
ax2.set_title('K线涨跌节奏的频率结构')
ax2.set_xlabel('频率')
ax2.set_ylabel('幅度')
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.tight_layout()
plt.show()
# 读数据
df = pd.read_csv(r"这里是股票行情csv文件路径")
df['date'] = pd.to_datetime(df['date'])
df.set_index('date', inplace=True)
plot_kline_and_fft_vertical(df)
这不就是“道”吗?
动中有静,静中有动。
静,是对抗“妄作凶”的最优解
股市里最大的坑是什么?
不是亏损,而是乱来。你每天急急忙忙追涨杀跌,最后连自己怎么亏的钱都搞不明白。
老子讲“致虚极,守静笃”,我一开始觉得很抽象,后来我才明白:你要让自己的大脑“空”下来,才有空间接收信息;你要保持“静”,才能感知市场节奏。
用在量化上就是——你做策略的时候,能不能别急着优化?先观察,再建模,再验证。做研究和做交易一样,妄动必败。
我自己就栽过坑——某次看到某只票走势暴涨,兴冲冲写了个突破策略,跑了一遍回测,哇年化30%!一开心就实盘了,结果一周就把利润赔光。
因为我没看清楚,那不过是“物芸芸”的表象,没有“归其根”。
你也可以想一想——你写策略,是为了“赚快钱”?还是为了“找道”?
如果你能坚持后者,那你注定会成为能“没身不殆”的人。
大道至简
道即一,一生二,二生三。
用最简单的方式表达最复杂的内容,就是“美”。
看趋势其实没那么复杂。趋势不是花里胡哨的指标堆积,而是最根本的价格变化方向。你只要盯着几个关键点,价格是比过去高了还是低了,就能判断市场的脉络。聪明的你一看就知道,趋势其实就是时间序列里的一个“方向感”——往上走就是涨势,往下就是跌势,横盘就别瞎琢磨了。别被那些复杂的技术指标绕晕了,回归本质,简单的对比,往往才能看得最清楚。只要抓住这条主线,你的策略才有坚实的基础,不会被噪音牵着鼻子走。
最后说几句真心话
股市看似是个技术活,其实更像修行。越深的人,越简单。巴菲特几十年就那几招,张磊看企业也是一句话——“做时间的朋友”。
愿你炒股不再浮躁,不再盲从,慢慢摸出一条属于自己的“道”。