大家看到这篇文章的时候,已经是521早上了。 在520的晚上,坐在电脑旁思考的时候,我心里在想,今天520应该写篇什么类型的技术文章呢? 520,A股大盘大涨, 晚上大家应该比较忙,可能在产生强烈的 交叉信号, 那么这里就以 5日线上穿20日线均线为例,写一个金叉例子。首次约会信号(金叉验证)
当MA5线穿上MA20线,就像男生鼓起勇气表白:"今晚月色真美",此时需满足三大恋爱指标:
- 20日均线仰角≥45°
- 成交量放大1.5倍
- 收盘价站稳MA20
二次约会禁忌
若MA5线第三次回踩MA20,堪比"复合三次的前任"——成功率暴跌80%!请默念股民三字经:不!要!贪!
【防绿指南】三招识别"股市海王"
- 假金叉陷阱
- 缩量暧昧
- 三振出局
"你是我生命中的MA5,
穿越20日均线的洪荒,
在520的坐标点,
完成最完美的金叉..."上面的段子,纯属娱乐。 相信大家都过了一个难忘的520,当天买的股票是贝因美, 而不是红墙股份。 毕竟大家喜欢的都是涨停,而不是跌停。 是不是这个理。最后附上源代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。
import akshare as ak
import streamlit as st
import pandas as pd
import plotly.graph_objs as go
@st.cache_data
def load_data(stock_code):
df = ak.stock_zh_a_hist(
symbol=stock_code,
period="daily",
start_date="20241008",
adjust="hfq"
)
df['MA5'] = df['收盘'].rolling(5).mean()
df['MA20'] = df['收盘'].rolling(20).mean()
df['金叉信号'] = (df['MA5'] > df['MA20']) & (df['MA5'].shift(1) <= df['MA20'].shift(1))
return df
def plot_strategy(df):
fig = go.Figure()
fig.add_trace(go.Candlestick(
x=df['日期'], open=df['开盘'],
high=df['最高'], low=df['最低'],
close=df['收盘'], name='K线',
increasing_line_color='red',
decreasing_line_color='green',
))
fig.add_trace(go.Scatter(
x=df['日期'], y=df['MA5'],
line=dict(color='#FF1493', width=2),
name='5日均线'
))
fig.add_trace(go.Scatter(
x=df['日期'], y=df['MA20'],
line=dict(color='#4169E1', width=2),
name='20日均线'
))
crosses = df[df['金叉信号']]
fig.add_trace(go.Scatter(
x=crosses['日期'], y=crosses['MA5'],
mode='markers', marker=dict(color='gold', size=10),
name='金叉信号'
))
st.plotly_chart(fig, use_container_width=True)
def app():
code = stock_list[stock_list['name'] == selected_stock]['code'].values[0]
df = load_data(code)
with st.container():
col1, col2 = st.columns([1, 3])
with col1:
st.metric("最新MA5", f"{df['MA5'].iloc[-1]:.2f}")
st.metric("最新MA20", f"{df['MA20'].iloc[-1]:.2f}")
if df['金叉信号'].iloc[-1]:
st.success("🌟 发现最新金叉信号!")
with col2:
plot_strategy(df)
with st.expander("📊 高级策略验证"):
col3, col4 = st.columns(2)
with col3:
st.write("**成交量验证**:")
vol_ratio = df['成交量'].iloc[-1] / df['成交量'].iloc[-2]
st.metric("成交量变化", f"{vol_ratio:.1f}倍",
delta="达标" if vol_ratio >= 1.5 else "不足")
with col4:
st.write("**均线斜率验证**:")
ma5_slope = (df['MA5'].iloc[-1] - df['MA5'].iloc[-5]) / 5
st.metric("5日线斜率", f"{ma5_slope:.2f}")
st.dataframe(df[['日期', '收盘', 'MA5', 'MA20', '金叉信号']].tail(10), height=300)
if __name__ == "__main__":
st.title("📈 5日/20日均线金叉策略系统")
stock_list = ak.stock_info_a_code_name()
selected_stock = st.selectbox("选择股票", stock_list['name'])
app()