会员登录 立即注册

搜索

股市全景3D模型图

[复制链接]
崎山小鹿 发表于 前天 23:42 | 显示全部楼层 |阅读模式
崎山小鹿
前天 23:42 60 0 看全部
不识庐山真面目,只缘身在此山中!我们之所有在股市沉浮就是很多时候没有看清股市的全貌,今天我们就一步一步创建股市的全景3D模型图。

1.账号登录,调用账号的例子:
from jqdatasdk import *
import config

auth(config.JQ_USERNAME, config.JQ_PASSWORD)

df = get_fundamentals(
    query(
        valuation.code,
        valuation.market_cap
    ).limit(10),
    date='2024-12-31'
)

print(df)

2.聚宽数据接入,获取指定股票数据,获取宁德时代,鲁信创投、金风科技、航天电子、锋龙股份、中国卫通、北斗星通,获取2025-10-11之前过去1年日线的波动数据,(股票名称,股票上市时间,股票总市值,3周的价格,),将这些波动数据用在下面的3D股票状态模型之中。

3.3D 股票状态模型,x轴为上市时间,y轴是分类(军工、人工智能、能源、矿产、电子还有地产、汽车、医疗、教育、食品加工、农业、矿产类的股票,50种比较能代表行业的股票),z轴为当前价格,3D 动画 / 轨迹按3周35天波动,气泡模型,红色表示在膨胀,绿色表示在收缩,气泡的体积是总市值,价格是高度。每个球上面标识股票名称,涨跌幅强度映射颜色深浅,文字的颜色和气泡的颜色同步,小涨 → 浅红、✔ 大涨 → 深红、✔ 小跌 → 浅绿✔ 大跌 → 深绿
✔ 横盘 → 灰,并且颜色要明确使用 RGBA(4 通道),alpha 固定为 1.0,关闭 depthshade。
参考代码:
from jqdatasdk import *
import config

auth(config.JQ_USERNAME, config.JQ_PASSWORD)

stocks = {
    "宁德时代": "300750.XSHE",
    "鲁信创投": "600783.XSHG",
    "金风科技": "002202.XSHE",
    "航天电子": "600879.XSHG",
    "锋龙股份": "002931.XSHE",
    "中国卫通": "601698.XSHG",
    "北斗星通": "002151.XSHE"
}
codes = list(stocks.values())

import pandas as pd
import numpy as np
from datetime import datetime, timedelta

# ===== 聚宽账号可用的最后日期 =====
end_date = "2025-10-11"

# 向前取 21 天(3 周)
start_date = (
    datetime.strptime(end_date, "%Y-%m-%d") - timedelta(days=21)
).strftime("%Y-%m-%d")

price_df = get_price(
    codes,
    start_date=start_date,
    end_date=end_date,
    frequency='daily',
    fields=['close', 'volume', 'money'],
    panel=False
)

# 按股票分组
groups = price_df.groupby('code')

stocks_data = {}

for code, g in groups:
    g = g.sort_values('time')

    # ===== 核心量化特征 =====
    returns = g['close'].pct_change()
    volatility = returns.std()                     # 波动率
    activity = g['volume'].mean() / 1e6             # 成交活跃度
    price_level = (g['close'].iloc[-1] - g['close'].min()) / \
                  (g['close'].max() - g['close'].min())
    money = g['money'].mean()                       # 资金规模

    stocks_data[code] = {
        "activity": activity,
        "price_level": price_level,
        "volatility": volatility,
        "market_cap_proxy": money
    }

df_base = pd.DataFrame.from_dict(stocks_data, orient='index')
df_base['name'] = [k for k in stocks.keys()]
df_base['size'] = np.log10(df_base['market_cap_proxy'])

n_days = 5
days_data = []

for i in range(n_days):
    df = df_base.copy()
    df["activity"] *= (1 + np.random.normal(0, df["volatility"]))
    df["price_level"] += np.random.normal(0, df["volatility"] * 2)
    df["price_level"] = df["price_level"].clip(0, 1)
    df["size"] += np.random.normal(0, 0.02)
    days_data.append(df)

colors_per_day = []

for i in range(n_days):
    if i == 0:
        colors_per_day.append(['gray'] * len(df_base))
    else:
        delta = days_data[i]["price_level"].values - days_data[i-1]["price_level"].values
        colors = np.where(delta >= 0, 'red', 'green')
        colors_per_day.append(colors)



import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from matplotlib import cm

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = False

n_stocks = len(days_data[0])

# ===== 颜色映射(活跃度)=====
all_activity = np.concatenate(
    [d["activity"].values for d in days_data]
)
act_min, act_max = all_activity.min(), all_activity.max()
norm_activity = lambda x: (x - act_min) / (act_max - act_min + 1e-6)

cmap = cm.RdYlGn_r   # 绿 → 黄 → 红

# ===== 创建 3D 图 =====
fig = plt.figure(figsize=(10, 8))
ax = fig.add_subplot(111, projection='3d')

# 初始帧
df0 = days_data[0]

colors0 = cmap(norm_activity(df0["activity"].values))

sc = ax.scatter(
    df0["activity"],
    df0["price_level"],
    df0["size"],
    s=df0["size"] * 120,      # 球体量
    c=colors0,
    alpha=0.9,
    depthshade=True
)

# ===== 股票名称标签 =====
texts = []
for i in range(n_stocks):
    t = ax.text(
        df0["activity"].iloc[i],
        df0["price_level"].iloc[i],
        df0["size"].iloc[i] + 0.03,
        df0["name"].iloc[i],
        fontsize=9,
        ha='center'
    )
    texts.append(t)

# ===== 轨迹 =====
lines = []
for _ in range(n_stocks):
    line, = ax.plot([], [], [], color='gray', alpha=0.35, linewidth=1)
    lines.append(line)

ax.set_xlabel("Activity(成交活跃度)")
ax.set_ylabel("Price Level(价格位置)")
ax.set_zlabel("Log(资金规模)")

ax.set_xlim(0, df0["activity"].max() * 1.4)
ax.set_ylim(0, 1.05)
ax.set_zlim(df0["size"].min() - 0.1, df0["size"].max() + 0.15)

# ===== 动画更新 =====
def update(frame):
    df = days_data[frame]

    colors = cmap(norm_activity(df["activity"].values))

    # 更新球位置
    sc._offsets3d = (
        df["activity"].values,
        df["price_level"].values,
        df["size"].values
    )
    sc.set_sizes(df["size"].values * 120)
    sc.set_facecolors(colors)

    # 更新文字
    for i, txt in enumerate(texts):
        txt.set_position((df["activity"].iloc[i], df["price_level"].iloc[i]))
        txt.set_3d_properties(df["size"].iloc[i] + 0.03)
        txt.set_text(df["name"].iloc[i])

    # 更新轨迹
    for i in range(n_stocks):
        xs = [days_data[d]["activity"].iloc[i] for d in range(frame + 1)]
        ys = [days_data[d]["price_level"].iloc[i] for d in range(frame + 1)]
        zs = [days_data[d]["size"].iloc[i] for d in range(frame + 1)]
        lines[i].set_data(xs, ys)
        lines[i].set_3d_properties(zs)

    ax.set_title(f"3D 股票状态演化(第 {frame + 1} 帧)")
    return sc, *lines, *texts

ani = FuncAnimation(
    fig,
    update,
    frames=len(days_data),
    interval=1200,
    blit=False
)

plt.show()

天不生墨翟,万古如长夜!以墨运商,以商助墨。金双石科技长期招聘科技研发人才!微信:qishanxiaolu   电话:15876572365   公司:深圳市金双石科技有限公司
回复

使用道具 举报

  • 您可能感兴趣
您需要登录后才可以回帖 登录 | 立即注册 |

本版积分规则 返回列表

管理员给TA私信
以墨运商,以商助墨。

查看:60 | 回复:0

  • 高端神经反馈脑波检测系统

    高端神经反馈脑波检测系统分为脑波检测、脑波分析、脑波解码三个部分。 前端主程序

    阅读:9|2026-01-06
  • 国内第三方量化平台有哪些有什么特点

    好的,我们来详细了解一下国内主流的第三方量化平台。这些平台极大地降低了个人投资者

    阅读:516|2025-12-09
  • 为什么脑波要去除伪迹

    1. 伪迹不是大脑信号 EEG设备记录的是头皮上非常微弱的电位变化(微伏级别,μV)。

    阅读:13|2025-12-05
  • 便携可视化语音AI耳机

    项目起源: 初先生的聊天记录: 你那边掌握的技术,有办法做一个有摄像头的,墨者机

    阅读:9|2025-12-01
  • 脑波峰值频率

    看看1-30Hz脑波功率曲线 发现15Hz之后的波动很小。 去掉15Hz之后的曲线 发现4Hz

    阅读:103|2025-11-28
  • 什么是基础节律

    🧠 一、什么是“基础节律”(Basic Rhythm) 基础节律 = 在闭眼静息状态下,大脑自发

    阅读:117|2025-11-27
  • 情绪指数EQ是什么?

    情绪指数 EQ 在脑波科学(特别是情绪解码、神经反馈、BCI 领域)中,通常不是单个固定

    阅读:231|2025-11-22
  • 抗癫痫作用的SMR波

    SMR 波(Sensorimotor Rhythm)是脑电学里一个非常重要、但经常被忽略的节律。它与运

    阅读:226|2025-11-22
  • 为什么科学家认为β波与人的注意、紧张相关

    科学家之所以非常确定 β波(13–30 Hz)与“注意、警觉、紧张、执行任务”相关,不是

    阅读:219|2025-11-22
  • 为什么说θ波与冥想、困倦相关

    科学界之所以认为 θ波(Theta, 4–7 Hz)与“冥想、困倦、催眠状态”有关,并不是玄

    阅读:212|2025-11-22
金双石科技,软件开发20年,技术行业领先,您的满意,就是我们的目标,认真负责,开拓进取,让成品物超所值
关于我们
公司简介
发展历程
联系我们
本站站务
友情链接
新手指南
内容审核
商家合作
广告合作
商家入驻
新闻合作

手机APP

官方微博

官方微信

联系电话:15876572365 地址:深圳市宝安区西乡街道宝民二路宝民花园 ( 粤ICP备2021100124号-1 ) 邮箱:qishanxiaolu@qq.com
QQ|Powered by Discuz! X3.5 © 2001-2026 Discuz! Team.
快速回复 返回顶部 返回列表