社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python技术】akshare、matplotlib分析上证指数近10年月份涨跌情况

灵度智能 • 2 周前 • 31 次点击  
周末和朋友闲聊3月份的战绩,大家互相吐槽这行情的艰难。看了下群消息, 群里同学也在吐槽,怪量化么? 
对于自己来说,前面做得还算可以,下半月回撤了一些。后来我细想了下,还是怪自己太侥幸,自认为自己经过这几年的股市毒打,与之前已经不一样了,技术应该有了明显的进步。该休息的时候强行出手,非得证明下自己。不得不说, 1月2月赚钱只能说行情好,3月证明了自己的风险控制能力还是差了点。
为了验证下历年3月份的行情和接下来4月份的行情,最初我的想法 是拿出之前写的代码 运行3月份、4月份的结果看一看, 后来想了想, 每个月这样运行还是好麻烦,要不直接一步到位,直接看上证指数最近10年每个月的涨跌结果。
顶部截图就是大家想要的答案,好吧,看了下,历年3月、4月大盘大部分时候还是很惨的。

相关文章推荐:
【Python技术】ashare、pyplot数据分析历年1月份A股表现
【Python技术】春节前后真的有红包行情么?用历史数据分析

题外话:
有些时候,我们不得不相信历史数据,毕竟历史数据还是有很强的参考意义。 对于做技术出身的我来说,还是很相信历史数据分析的。 
有些时候,只是为了证明 自己和 历史的自己 不一样 强行为之。 事实上,个人确实有了一些进步。  但在大趋势面前,这点小小的进步根本不值一提了。 
后续的目标,在提升收益率的同时, 在大盘情绪不佳的时候,减少出手频次。 该休息就休息。

最后附上完整代码,需要的自取。 备注:如果发现格式有多余的特殊字符,用普通浏览器打开复制应该没问题。
import streamlit as st
import akshare as ak
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
from datetime import datetime

# 设置全局样式
plt.rcParams['font.sans-serif'] = ['STHeiti']  # 苹果系统字体
# plt.rcParams['font.sans-serif'] = ['SimHei']  # Windows系统使用此字体
plt.rcParams['axes.unicode_minus'] = False

# 配置页面
st.set_page_config(page_title="上证指数历年月度分析", layout="wide")
st.title("上证指数历年月度分析")

# 自定义双色系
dual_colors = ['#4CB050''#FF3333']  # 绿跌红涨
cmap = mcolors.ListedColormap(dual_colors)
bounds = [-100, 0, 100]  # 严格分界
norm = mcolors.BoundaryNorm(bounds, cmap.N)


# 数据获取
@st.cache_data
def get_data():
    df = ak.stock_zh_index_daily(symbol="sh000001")
    df['date'] = pd.to_datetime(df['date'])
    df['year'] = df['date'].dt.year
    df['month'] = df['date'].dt.month
    return df[df['year'].between(2015, 2024)].sort_values('date')


# 构建月度数据
def build_table(df):
    monthly = []
    for y in range(2015, 2025):
        row = {'年份': y}
        for m in range(1, 13):
            sub = df[(df['year'] == y) & (df['month'] == m)]
            if  len(sub) >= 3:
                chg = (sub.iloc[-1]['close'] / sub.iloc[0]['close'] - 1) * 100
                row[f'{m}月'] = round(chg, 2)
        monthly.append(row)
    return pd.DataFrame(monthly).set_index('年份')


# 生成热力图
def plot_heatmap(data):
    fig, ax = plt.subplots(figsize=(16, 6))
    sns.heatmap(data,
                cmap=cmap,
                norm=norm,
                annot=True,
                fmt=".1f",
                linewidths=0.5,
                cbar=False,
                annot_kws={'color''white''weight''bold'})
    ax.set_xticklabels(['1月''2月''3月''4月''5月''6月',
                        '7月''8月''9月''10月''11月''12月'])
    ax.set_title('月度涨跌幅分布', fontsize=14)
    return fig


# 主程序
df = get_data()
monthly_df = build_table(df)

# 显示表格
st.subheader("数据表")


def color_cell(val):
    color = '#FF3333'if val >= 0 else'#4CB050'
    return f'background-color: {color}; color: white'


styled_df = monthly_df.style.format('{:.1f}%', na_rep="-").applymap(color_cell)
st.dataframe(styled_df, height=450, use_container_width=True)




为了后续能正常收到文章推送,欢迎点赞在看,不然可能收不到消息哦。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/180574
 
31 次点击