实时Python案例显示场上谁更占优势?

wen python案例 2

本文目录导读:

实时Python案例显示场上谁更占优势?

  1. 案例一:电子竞技/体育比赛——实时比分与优势指数
  2. 案例二:量化金融/模拟交易——多空博弈看谁占优
  3. 如何应用到真实场景?
  4. 关键改进方向

这是一个非常实用的实时数据可视化场景,要判断“谁更占优势”,核心在于实时捕捉双方的关键指标变化(比如比分、资源差、击杀数或股票收益率)。

下面我提供两个最有代表性的实战案例:一个用于体育比赛/电子竞技(模拟比分变化),一个用于量化金融交易(模拟多空博弈),它们都使用Python的matplotlib动画功能实现实时刷新。

电子竞技/体育比赛——实时比分与优势指数

这个案例模拟两支队伍(蓝队 vs 红队)的比赛,我们不仅看总分,还计算一个“综合优势指数”(结合击杀、经济、塔数/得分等权重)。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import random
from collections import deque
# 初始化数据存储(最近100个时间点)
MAX_LEN = 100
times = deque(maxlen=MAX_LEN)
blue_advantage = deque(maxlen=MAX_LEN) # 蓝队优势值(正数表示蓝队强,负数表示红队强)
blue_score = deque(maxlen=MAX_LEN)
red_score = deque(maxlen=MAX_LEN)
# 初始状态
current_time = 0
blue_adv = 0
blue_s = 0
red_s = 0
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 6))
plt.subplots_adjust(hspace=0.4)
def update(frame):
    global current_time, blue_adv, blue_s, red_s
    current_time += 1
    # 模拟随机事件:击杀、推塔、拿龙
    event = random.choice(['kill_blue', 'kill_red', 'tower_blue', 'tower_red', 'dragon_blue', 'dragon_red', 'none'])
    # 根据事件更新比分和优势指数
    if event == 'kill_blue':
        blue_s += 1
        blue_adv += 0.8
    elif event == 'kill_red':
        red_s += 1
        blue_adv -= 0.8
    elif event == 'tower_blue':
        blue_s += 0.5  # 塔相当于分数增长
        blue_adv += 2.0
    elif event == 'tower_red':
        red_s += 0.5
        blue_adv -= 2.0
    elif event == 'dragon_blue':
        blue_adv += 1.5  # 龙提供持续优势
    elif event == 'dragon_red':
        blue_adv -= 1.5
    # 'none' 不改变
    # 添加一点随机波动让曲线更真实
    blue_adv += random.uniform(-0.3, 0.3)
    # 记录数据
    times.append(current_time)
    blue_score.append(blue_s)
    red_score.append(red_s)
    blue_advantage.append(blue_adv)
    # --- 上图:实时比分走势 ---
    ax1.clear()
    ax1.plot(times, list(blue_score), 'b-', label='蓝队 (Blue)', linewidth=2)
    ax1.plot(times, list(red_score), 'r-', label='红队 (Red)', linewidth=2)
    ax1.set_title('实时比分 (实时更新)')
    ax1.set_ylabel('得分')
    ax1.legend(loc='upper left')
    ax1.grid(True, alpha=0.3)
    ax1.set_ylim(max(0, min(blue_s, red_s)-2), max(blue_s, red_s)+3)
    # 显示当前比分文字
    ax1.text(0.02, 0.95, f'蓝 {blue_s:.1f} : {red_s:.1f} 红', 
             transform=ax1.transAxes, fontsize=14,
             bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.8))
    # --- 下图:优势指数(核心指标) ---
    ax2.clear()
    ax2.plot(times, list(blue_advantage), 'g-', label='蓝方优势指数', linewidth=2)
    ax2.axhline(y=0, color='gray', linestyle='--', alpha=0.7)  # 零线
    ax2.fill_between(times, 0, list(blue_advantage), 
                     where=[v > 0 for v in blue_advantage], 
                     color='blue', alpha=0.2, label='蓝方优势区')
    ax2.fill_between(times, 0, list(blue_advantage), 
                     where=[v < 0 for v in blue_advantage], 
                     color='red', alpha=0.2, label='红方优势区')
    ax2.set_title('综合优势指数 (正=蓝优, 负=红优)')
    ax2.set_ylabel('优势值')
    ax2.set_xlabel('时间 (秒/回合)')
    ax2.legend(loc='upper left')
    ax2.grid(True, alpha=0.3)
    ax2.axhline(y=1, color='blue', linestyle=':', alpha=0.5, label='蓝方明显优势')
    ax2.axhline(y=-1, color='red', linestyle=':', alpha=0.5, label='红方明显优势')
    # 显示当前优势评语
    if blue_adv > 1:
        status = '🔵 蓝方明显占优!'
    elif blue_adv > 0.2:
        status = '🔷 蓝方略微占优'
    elif blue_adv > -0.2:
        status = '⚪ 双方均势'
    elif blue_adv > -1:
        status = '🔶 红方略微占优'
    else:
        status = '🔴 红方明显占优!'
    ax2.text(0.02, 0.95, status, transform=ax2.transAxes, fontsize=12,
             bbox=dict(boxstyle='round', facecolor='lightyellow', alpha=0.9))
ani = animation.FuncAnimation(fig, update, interval=500, cache_frame_data=False)  # 500ms刷新一次
plt.show()
# 如果要保存为GIF或MP4,取消下面注释
# ani.save('实时优势分析.gif', writer='pillow', fps=2)

运行效果

  • 上方折线图:两队分数实时变化。
  • 下方填充图:蓝色区域代表蓝方优势,红色区域代表红方优势,跨越零线即代表局势逆转。
  • 文字提示:实时显示“谁更占优势”的定性判断。

量化金融/模拟交易——多空博弈看谁占优

如果你想要更“金融范”的实时博弈,可以模拟两只股票(或一个多头策略 vs 空头策略)的累计收益率。

import matplotlib.pyplot as plt
import matplotlib.animation as animation
import numpy as np
# 模拟两只股票的实时价格(多头 vs 空头策略)
np.random.seed(42)
MAX_LEN = 200
times = list(range(MAX_LEN))
long_prices = [100]  # 多头
short_prices = [100] # 空头
# 存储收益率
long_returns = [0]
short_returns = [0]
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 7))
def update(frame):
    # 模拟新价格(随机游走,但加入趋势差异)
    last_long = long_prices[-1]
    last_short = short_prices[-1]
    # 多头:有正的漂移(模拟市场长期向上)
    drift_long = 0.02
    noise_long = np.random.randn() * 1.5
    new_long = max(50, last_long + drift_long + noise_long)
    # 空头:稍微偏空(或随机)
    drift_short = -0.01
    noise_short = np.random.randn() * 1.5
    new_short = max(50, last_short + drift_short + noise_short)
    long_prices.append(new_long)
    short_prices.append(new_short)
    # 计算累计收益率
    long_ret = (new_long / 100 - 1) * 100  # 百分比
    short_ret = (new_short / 100 - 1) * 100
    long_returns.append(long_ret)
    short_returns.append(short_ret)
    # 只保留最近MAX_LEN个数据
    if len(long_prices) > MAX_LEN:
        long_prices.pop(0)
        short_prices.pop(0)
        long_returns.pop(0)
        short_returns.pop(0)
    current_times = list(range(len(long_prices)))
    # 上图:价格走势
    ax1.clear()
    ax1.plot(current_times, long_prices, 'b-', label='多头策略 (看涨)', linewidth=2)
    ax1.plot(current_times, short_prices, 'r-', label='空头策略 (看跌)', linewidth=2)
    ax1.set_title('实时价格走势')
    ax1.legend()
    ax1.grid(True, alpha=0.3)
    # 下图:收益率差(谁更占优)
    ax2.clear()
    advantage = [l - s for l, s in zip(long_returns, short_returns)]
    ax2.plot(current_times, advantage, 'g-', label='多头优势 (正=多头占优)', linewidth=2)
    ax2.axhline(y=0, color='gray', linestyle='--')
    ax2.fill_between(current_times, 0, advantage, 
                     where=[v>0 for v in advantage], color='green', alpha=0.2, label='多头占优区')
    ax2.fill_between(current_times, 0, advantage,
                     where=[v<0 for v in advantage], color='red', alpha=0.2, label='空头占优区')
    ax2.set_title('实时优势对比 (收益率差)')
    ax2.legend()
    ax2.grid(True, alpha=0.3)
    # 显示当前占优方
    current_adv = advantage[-1]
    if current_adv > 2:
        msg = '📈 多头明显占优!收益率领先 {:.1f}%'.format(current_adv)
    elif current_adv > 0.5:
        msg = '📊 多头略占优势 (+{:.1f}%)'.format(current_adv)
    elif current_adv > -0.5:
        msg = '⚖️ 双方接近均势 ({:+.1f}%)'.format(current_adv)
    elif current_adv > -2:
        msg = '📊 空头略占优势 ({:+.1f}%)'.format(current_adv)
    else:
        msg = '📉 空头明显占优!收益率领先 {:.1f}%'.format(-current_adv)
    ax2.text(0.02, 0.95, msg, transform=ax2.transAxes, fontsize=12,
             bbox=dict(boxstyle='round', facecolor='lightcyan', alpha=0.9))
    ax2.set_xlabel('最近交易时段')
ani = animation.FuncAnimation(fig, update, interval=300, cache_frame_data=False)
plt.show()

运行效果

  • 上图:两个策略的价格线,直观看出谁在涨。
  • 下图:绿色区域 = 多头占优,红色区域 = 空头占优,零线是分水岭。
  • 文字提示:实时给出优势判断和量化百分比。

如何应用到真实场景?

你想分析的场景 需要采集的原始数据 如何映射到“优势指标”
篮球/足球比赛 实时比分、控球率、射门次数、犯规 加权计算:优势 = 0.5*(得分差) + 0.3*(控球率-0.5) + 0.2*(射门效率)
MOBA游戏 (LOL/Dota2) 击杀数、塔数、龙/肉山、经济差 类似案例1,可调用游戏官方API
量化交易多空PK 两只股票/ETF实时价格 累计收益率差值(案例2)
辩论赛/投票 实时点赞、评论情感分析 情感得分差 → 优势指数
网络对战 (格斗游戏) 血量百分比、连招命中率 血量差 + 帧数优势

关键改进方向

  1. 真实数据源:用websocket连接体育API(如ESPN、OP.GG)、交易所数据(如yfinance实时流)。
  2. 更复杂的优势模型:引入移动平均、指数平滑、置信区间。
  3. 交互性:用ipywidgetsDash做成可动态调节权重的看板。

这两个案例可以直接复制到你的Python环境运行(需要matplotlib),它们会自动连续更新,实时展示谁更占主导。

上一篇综合Python案例,哪队能掌握比赛主动权?

下一篇当前分类已是最新一篇

抱歉,评论功能暂时关闭!