Flask+强化学习多智能体量化交易系统构建指南

量化交易多智能体系统强化学习
于 2026-08-01 04:03:16 修改
·本内容遵循CC 4.0 BY-SA版权协议

为什么你的量化交易策略总是跑不过大盘?为什么单个AI模型在复杂市场环境中表现不稳定?如果你正在寻找一个能够真正适应市场动态变化的智能交易系统,那么多智能体AI量化交易可能是你需要关注的方向。

传统的量化交易系统往往依赖单一策略或模型,在面对市场风格切换、突发事件冲击时显得力不从心。而结合Flask Web框架和强化学习的多智能体系统,能够通过多个专业Agent的协同工作,实现更稳健的交易决策。本文将带你从零构建一个完整的Flask+强化学习多智能体交易系统,不仅讲解核心原理,更提供可落地的代码实现。

1. 多智能体量化交易的核心价值

在真实交易环境中,市场状态瞬息万变,单一策略很难在所有市场环境下都保持优异表现。多智能体系统的核心思想是"专业分工"——让不同的AI Agent专注于不同的市场维度,然后通过智能协调机制形成最终决策。

这种架构的优势主要体现在三个方面:首先,它能够有效分散风险,避免单一策略失效导致的系统性崩溃;其次,不同Agent可以并行处理市场信息,提高决策效率;最后,通过强化学习机制,系统能够持续从市场反馈中学习优化。

在实际项目中,我们通常会设计几种核心Agent:趋势跟踪Agent负责识别和跟随市场趋势;均值回归Agent专注于价格偏离均值的套利机会;风险控制Agent实时监控仓位和风险指标;决策协调Agent则负责综合各Agent意见做出最终交易决定。

2. 技术架构与核心组件

整个系统采用分层架构设计,从下至上包括数据层、智能体层、决策层和表现层。

数据层负责实时获取和处理市场数据,包括股票价格、成交量、技术指标等。我们使用Python的pandas和numpy进行数据清洗和特征工程,确保输入数据的质量和一致性。

智能体层是系统的核心,每个智能体都是一个独立的强化学习模型。我们采用DQN(Deep Q-Network)作为基础算法,因为它能够在离散动作空间(如买入、持有、卖出)中表现稳定。每个智能体都有自己特定的状态空间和奖励函数,确保它们学习不同的交易策略。

决策层使用加权投票机制整合各个智能体的意见。不同智能体的投票权重不是固定的,而是根据它们近期的表现动态调整——表现好的智能体拥有更高的话语权。

表现层基于Flask框架构建Web界面,实时展示交易信号、持仓情况和绩效指标。Flask的轻量级特性使其非常适合这类需要快速响应的交易系统。

3. 环境准备与依赖安装

在开始编码前,需要确保开发环境正确配置。推荐使用Python 3.8+版本,因为这个版本在AI库的兼容性方面表现最为稳定。

首先创建并激活虚拟环境:

BASH
python -m venv quant_env
source quant_env/bin/activate # Linux/Mac
# 或者 quant_env\Scripts\activate # Windows

安装核心依赖包:

BASH
pip install flask==2.3.3
pip install tensorflow==2.13.0
pip install pandas==2.0.3
pip install numpy==1.24.3
pip install requests==2.31.0
pip install matplotlib==3.7.2

对于强化学习部分,我们选择TensorFlow而不是PyTorch,主要考虑是TensorFlow在生产环境的部署成熟度更高。如果你的设备支持GPU,可以安装TensorFlow-GPU版本以加速训练过程。

项目目录结构应该这样组织:

TEXT
quant_system/
├── app.py # Flask主应用
├── agents/ # 智能体模块
│ ├── trend_agent.py # 趋势跟踪智能体
│ ├── mean_agent.py # 均值回归智能体
│ └── risk_agent.py # 风险控制智能体
├── utils/ # 工具函数
│ ├── data_loader.py # 数据加载
│ └── evaluator.py # 绩效评估
├── static/ # 静态文件
│ └── js/ # JavaScript文件
└── templates/ # HTML模板
└── index.html # 主页面

4. 数据准备与特征工程

高质量的数据是量化交易的基础。我们使用yfinance库获取历史股价数据,这个库提供了免费且相对稳定的数据源。

PYTHON
# utils/data_loader.py
import yfinance as yf
import pandas as pd
import numpy as np
 
class DataLoader:
def __init__(self, symbol='AAPL', period='1y'):
self.symbol = symbol
self.period = period
def load_data(self):
"""加载股票历史数据"""
stock = yf.Ticker(self.symbol)
df = stock.history(period=self.period)
return df
def calculate_technical_indicators(self, df):
"""计算技术指标"""
# 移动平均线
df['MA5'] = df['Close'].rolling(window=5).mean()
df['MA20'] = df['Close'].rolling(window=20).mean()
# 相对强弱指数
delta = df['Close'].diff()
gain = (delta.where(delta > 0, 0)).rolling(window=14).mean()
loss = (-delta.where(delta < 0, 0)).rolling(window=14).mean()
rs = gain / loss
df['RSI'] = 100 - (100 / (1 + rs))
# 布林带
df['BB_Middle'] = df['Close'].rolling(window=20).mean()
bb_std = df['Close'].rolling(window=20).std()
df['BB_Upper'] = df['BB_Middle'] + 2 * bb_std
df['BB_Lower'] = df['BB_Middle'] - 2 * bb_std
# 成交量变化率
df['Volume_Change'] = df['Volume'].pct_change()
return df.dropna()

特征工程的关键是要确保指标具有预测能力且避免未来函数。所有技术指标都必须使用历史数据计算,不能包含未来信息。

5. 强化学习智能体实现

每个智能体都是一个独立的DQN模型,但具有不同的状态设计和奖励函数。

5.1 趋势跟踪智能体

趋势跟踪智能体专注于识别和跟随市场趋势,它的状态空间包含趋势相关指标。

PYTHON
# agents/trend_agent.py
import tensorflow as tf
from tensorflow.keras import layers
import numpy as np
 
class TrendAgent:
def __init__(self, state_size=8, action_size=3):
self.state_size = state_size
self.action_size = action_size
self.memory = []
self.gamma = 0.95 # 折扣因子
self.epsilon = 1.0 # 探索率
self.epsilon_min = 0.01
self.epsilon_decay = 0.995
self.learning_rate = 0.001
self.model = self._build_model()
def _build_model(self):
"""构建神经网络模型"""
model = tf.keras.Sequential([
layers.Dense(24, input_dim=self.state_size, activation='relu'),
layers.Dense(24, activation='relu'),
layers.Dense(self.action_size, activation='linear')
])
model.compile(loss='mse', optimizer=tf.keras.optimizers.Adam(lr=self.learning_rate))
return model
def remember(self, state, action, reward, next_state, done):
"""存储经验"""
self.memory.append((state, action, reward, next_state, done))
def act(self, state):
"""选择动作"""
if np.random.rand() <= self.epsilon:
return np.random.choice(self.action_size)
act_values = self.model.predict(state, verbose=0)
return np.argmax(act_values[0])
def replay(self, batch_size=32):
"""经验回放"""
if len(self.memory) < batch_size:
return
minibatch = np.random.choice(len(self.memory), batch_size, replace=False)
for idx in minibatch:
state, action, reward, next_state, done = self.memory[idx]
target = reward
if not done:
target = reward + self.gamma * np.amax(self.model.predict(next_state, verbose=0)[0])
target_f = self.model.predict(state, verbose=0)
target_f[0][action] = target
self.model.fit(state, target_f, epochs=1, verbose=0)
if self.epsilon > self.epsilon_min:
self.epsilon *= self.epsilon_decay

5.2 均值回归智能体

均值回归智能体专注于价格偏离均值的套利机会,它的奖励函数会鼓励在价格偏离时进行反向操作。

PYTHON
# agents/mean_agent.py
class MeanReversionAgent:
def __init__(self, state_size=6, action_size=3):
self.state_size = state_size
self.action_size = action_size
# 初始化代码与TrendAgent类似,但状态设计和奖励函数不同
def get_reward(self, action, price_data, position):
"""均值回归特有的奖励函数"""
current_price = price_data['Close'].iloc[-1]
ma20 = price_data['MA20'].iloc[-1]
price_deviation = abs(current_price - ma20) / ma20
if action == 1: # 买入
if current_price < ma20: # 价格低于均线,正确操作
reward = price_deviation * 2
else:
reward = -price_deviation
elif action == 2: # 卖出
if current_price > ma20: # 价格高于均线,正确操作
reward = price_deviation * 2
else:
reward = -price_deviation
else: # 持有
reward = 0.1 # 小幅奖励减少频繁交易
return reward

6. 多智能体协调机制

智能体协调是多智能体系统的关键环节。我们采用动态权重投票机制,根据每个智能体的近期表现分配投票权重。

PYTHON
# agents/coordinator.py
class AgentCoordinator:
def __init__(self, agents):
self.agents = agents
self.performance_history = {agent: [] for agent in agents.keys()}
self.window_size = 20 # 考虑最近20个交易日的表现
def update_performance(self, agent_name, reward):
"""更新智能体表现记录"""
self.performance_history[agent_name].append(reward)
if len(self.performance_history[agent_name]) > self.window_size:
self.performance_history[agent_name].pop(0)
def calculate_weights(self):
"""计算智能体权重"""
weights = {}
for agent_name, performances in self.performance_history.items():
if len(performances) == 0:
weights[agent_name] = 1.0 # 默认权重
else:
# 根据夏普比率计算权重
returns = np.array(performances)
sharpe_ratio = np.mean(returns) / np.std(returns) if np.std(returns) > 0 else 0
weights[agent_name] = max(0, sharpe_ratio) + 0.1 # 确保权重为正
return weights
def make_decision(self, current_state):
"""综合决策"""
weights = self.calculate_weights()
votes = {}
for agent_name, agent in self.agents.items():
action = agent.act(current_state)
votes[agent_name] = {
'action': action,
'weight': weights[agent_name]
}
# 加权投票
action_scores = {0: 0, 1: 0, 2: 0} # 0:持有, 1:买入, 2:卖出
for vote in votes.values():
action_scores[vote['action']] += vote['weight']
final_action = max(action_scores.items(), key=lambda x: x[1])[0]
return final_action, votes

7. Flask Web接口实现

Flask框架负责提供Web界面和API接口,实时展示交易决策和系统状态。

PYTHON
# app.py
from flask import Flask, render_template, jsonify
from agents.trend_agent import TrendAgent
from agents.mean_agent import MeanReversionAgent
from agents.risk_agent import RiskAgent
from agents.coordinator import AgentCoordinator
from utils.data_loader import DataLoader
import numpy as np
 
app = Flask(__name__)
 
# 初始化智能体和协调器
agents = {
'trend': TrendAgent(),
'mean_reversion': MeanReversionAgent(),
'risk': RiskAgent()
}
coordinator = AgentCoordinator(agents)
 
@app.route('/')
def index():
"""主页面"""
return render_template('index.html')
 
@app.route('/api/trading_signal')
def get_trading_signal():
"""获取交易信号API"""
data_loader = DataLoader()
df = data_loader.load_data()
df = data_loader.calculate_technical_indicators(df)
# 获取最新状态
current_state = df.iloc[-1][['MA5', 'MA20', 'RSI', 'BB_Upper', 'BB_Lower', 'Volume_Change']].values
current_state = np.reshape(current_state, [1, len(current_state)])
# 获取决策
action, votes = coordinator.make_decision(current_state)
action_map = {0: 'HOLD', 1: 'BUY', 2: 'SELL'}
return jsonify({
'signal': action_map[action],
'confidence': votes,
'current_price': df['Close'].iloc[-1],
'timestamp': df.index[-1].strftime('%Y-%m-%d %H:%M:%S')
})
 
@app.route('/api/performance')
def get_performance():
"""获取性能数据"""
# 实现性能计算逻辑
return jsonify({'message': 'Performance data endpoint'})
 
if __name__ == '__main__':
app.run(debug=True, host='0.0.0.0', port=5000)

前端界面使用简单的HTML和JavaScript实现实时数据展示:

HTML
<!-- templates/index.html -->
<!DOCTYPE html>
<html>
<head>
<title>多智能体量化交易系统</title>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
<div class="container">
<h1>多智能体AI量化交易系统</h1>
<div id="trading-signal">
<h2>当前交易信号: <span id="signal">加载中...</span></h2>
<p>最新价格: <span id="price"></span></p>
<p>更新时间: <span id="timestamp"></span></p>
</div>
<div id="agent-votes">
<h3>智能体投票详情</h3>
<table id="votes-table">
<thead>
<tr><th>智能体</th><th>投票</th><th>权重</th></tr>
</thead>
<tbody></tbody>
</table>
</div>
</div>
<script>
function updateTradingData() {
fetch('/api/trading_signal')
.then(response => response.json())
.then(data => {
document.getElementById('signal').textContent = data.signal;
document.getElementById('price').textContent = data.current_price.toFixed(2);
document.getElementById('timestamp').textContent = data.timestamp;
// 更新投票表格
const tbody = document.querySelector('#votes-table tbody');
tbody.innerHTML = '';
for (const [agent, vote] of Object.entries(data.confidence)) {
const row = tbody.insertRow();
row.insertCell(0).textContent = agent;
row.insertCell(1).textContent = ['持有', '买入', '卖出'][vote.action];
row.insertCell(2).textContent = vote.weight.toFixed(3);
}
});
}
// 每10秒更新一次数据
setInterval(updateTradingData, 10000);
updateTradingData(); // 立即执行一次
</script>
</body>
</html>

8. 系统训练与回测验证

在部署系统前,必须进行充分的回测验证。我们使用历史数据模拟交易过程,评估系统性能。

PYTHON
# utils/evaluator.py
import pandas as pd
import numpy as np
 
class Backtester:
def __init__(self, initial_capital=100000):
self.initial_capital = initial_capital
self.reset()
def reset(self):
self.capital = self.initial_capital
self.shares = 0
self.positions = []
self.portfolio_values = []
def execute_trade(self, action, price, date):
"""执行交易"""
if action == 1 and self.capital >= price: # 买入
shares_to_buy = self.capital // price
self.shares += shares_to_buy
self.capital -= shares_to_buy * price
self.positions.append(('BUY', shares_to_buy, price, date))
elif action == 2 and self.shares > 0: # 卖出
self.capital += self.shares * price
self.positions.append(('SELL', self.shares, price, date))
self.shares = 0
def calculate_performance(self, price_data):
"""计算回测绩效"""
portfolio_values = []
for idx, row in price_data.iterrows():
current_value = self.capital + self.shares * row['Close']
portfolio_values.append(current_value)
returns = pd.Series(portfolio_values).pct_change().dropna()
total_return = (portfolio_values[-1] - self.initial_capital) / self.initial_capital
sharpe_ratio = returns.mean() / returns.std() * np.sqrt(252) if returns.std() > 0 else 0
max_drawdown = self.calculate_max_drawdown(portfolio_values)
return {
'total_return': total_return,
'sharpe_ratio': sharpe_ratio,
'max_drawdown': max_drawdown,
'final_value': portfolio_values[-1]
}
def calculate_max_drawdown(self, values):
"""计算最大回撤"""
peak = values[0]
max_dd = 0
for value in values:
if value > peak:
peak = value
dd = (peak - value) / peak
if dd > max_dd:
max_dd = dd
return max_dd

训练过程需要结合历史数据进行:

PYTHON
# train.py
def train_system(symbol='AAPL', episodes=1000):
"""训练多智能体系统"""
data_loader = DataLoader(symbol, period='2y')
df = data_loader.load_data()
df = data_loader.calculate_technical_indicators(df)
backtester = Backtester()
for episode in range(episodes):
state = df.iloc[0][['MA5', 'MA20', 'RSI', 'BB_Upper', 'BB_Lower', 'Volume_Change']].values
state = np.reshape(state, [1, len(state)])
for i in range(1, len(df)):
# 获取智能体决策
action, votes = coordinator.make_decision(state)
# 执行交易
current_price = df['Close'].iloc[i]
backtester.execute_trade(action, current_price, df.index[i])
# 计算奖励并更新智能体
next_state = df.iloc[i][['MA5', 'MA20', 'RSI', 'BB_Upper', 'BB_Lower', 'Volume_Change']].values
next_state = np.reshape(next_state, [1, len(next_state)])
# 为每个智能体计算特定奖励
for agent_name, agent in agents.items():
reward = agent.get_reward(action, df.iloc[:i+1], backtester.shares)
agent.remember(state, action, reward, next_state, False)
coordinator.update_performance(agent_name, reward)
state = next_state
# 经验回放
if i % 10 == 0:
for agent in agents.values():
agent.replay(32)
# 每100轮输出一次进度
if episode % 100 == 0:
performance = backtester.calculate_performance(df)
print(f"Episode {episode}, Total Return: {performance['total_return']:.2%}")

9. 常见问题与解决方案

在实际部署过程中,经常会遇到以下几类问题:

9.1 数据质量问题

问题现象:系统产生异常交易信号,绩效波动巨大。 原因分析:数据源不稳定或包含异常值,技术指标计算错误。 解决方案:增加数据清洗步骤,设置合理的异常值过滤机制,验证指标计算逻辑。

PYTHON
def validate_data_quality(df):
"""数据质量验证"""
# 检查缺失值
if df.isnull().any().any():
raise ValueError("数据包含缺失值,请检查数据源")
# 检查价格合理性
if (df['Close'] <= 0).any():
raise ValueError("股票价格出现非正值")
# 检查成交量合理性
if (df['Volume'] < 0).any():
raise ValueError("成交量出现负值")

9.2 过拟合问题

问题现象:在训练数据上表现优异,但在新数据上表现差。 原因分析:模型过于复杂,学习了数据中的噪声而非真实规律。 解决方案:使用正则化技术,增加Dropout层,采用早停策略,使用交叉验证。

PYTHON
# 在模型构建中增加正则化
from tensorflow.keras import regularizers
 
def _build_regularized_model(self):
model = tf.keras.Sequential([
layers.Dense(24, input_dim=self.state_size, activation='relu',
kernel_regularizer=regularizers.l2(0.001)),
layers.Dropout(0.2),
layers.Dense(24, activation='relu',
kernel_regularizer=regularizers.l2(0.001)),
layers.Dropout(0.2),
layers.Dense(self.action_size, activation='linear')
])
return model

9.3 系统性能问题

问题现象:Web界面响应缓慢,交易信号延迟。 原因分析:模型推理速度慢,数据获取阻塞,缺乏缓存机制。 解决方案:优化模型结构,使用异步数据获取,添加缓存层。

10. 生产环境部署建议

当系统通过回测验证后,可以逐步部署到生产环境。以下是关键注意事项:

10.1 安全性配置

确保Flask应用在生产环境中关闭调试模式,设置强密钥,配置合适的CORS策略。

PYTHON
# production_config.py
class ProductionConfig:
DEBUG = False
TESTING = False
SECRET_KEY = 'your-production-secret-key' # 实际使用中应从环境变量获取
PREFERRED_URL_SCHEME = 'https'

10.2 监控与日志

建立完整的监控体系,记录系统运行状态和交易决策。

PYTHON
import logging
from logging.handlers import RotatingFileHandler
 
def setup_logging():
"""配置日志系统"""
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(levelname)s %(name)s %(message)s',
handlers=[
RotatingFileHandler('trading_system.log', maxBytes=1000000, backupCount=5),
logging.StreamHandler()
]
)

10.3 风险控制机制

在生产环境中必须设置严格的风险控制:

  • 单日最大亏损限制
  • 单笔交易规模限制
  • 市场异常情况自动暂停交易
  • 定期性能评估和模型更新

多智能体AI量化交易系统代表了量化交易发展的新方向。通过将复杂问题分解为多个专业智能体的协作,系统能够更好地适应市场变化。本文提供的实现方案涵盖了从数据获取、智能体设计、协调机制到Web展示的完整流程,读者可以根据实际需求进行调整和优化。

在实际应用中,建议先从模拟交易开始,充分验证系统稳定性后再投入真实资金。同时要持续关注市场变化,定期更新模型以适应新的市场环境。

Python爬虫+Flask+ECharts 疫情可视化
在本项目中,“Python爬虫+Flask+ECharts 疫情可视化”是一个结合了多个技术的实战应用,主要用于实时或定期抓取疫情数据并进行可视化展示。下面将详细讲解这个项目涉及的主要知识点:1.
beerer
6930
Docker构建python Flask+ nginx+uwsgi容器
"使用Docker构建Python Flask应用,结合Nginx和uWSGI来提高服务性能和稳定性。本文提供了一步步的详细指南,适合初学者和开发者参考学习。"在现代Web开发中,Docker已经
weixin_38629976
361
Python+Flask+sqlite实现的选课系统
本项目使用Python + Flask + SQLite开发了一个简单的选课系统,利用SQLAlchemy实现学生与课程的多对多关系建模。系统定义了学生和课程的数据模型,并支持基本的数据查询与序列化操
Sophia_fez
3575
flask+bootstrap+python
在"flask+bootstrap+python"的组合中,Flask负责后端逻辑处理,包括路由处理、数据处理和模板渲染。
qq_39782028
963
Python-使用Flask构建的微服务的骨架
**Flask构建微服务的关键组件**1. **路由**:Flask使用装饰器来定义URL路由和相应的处理函数,如`@app.route('/')`。2.
weixin_39841882
2109
python生成html+flask界面呈现
在Python编程领域,Flask是一个轻量级的Web服务应用框架,它允许开发者用Python代码构建功能丰富的Web应用。HTML则是网页设计的基础语言,用于创建和构建网页结构。
Ly小宇童鞋
8476
强化学习新突破:Python多智能体协同训练.pdf
资源摘要信息:"强化学习新突破:Python多智能体协同训练.pdf"知识点:一、Python编程语言概述Python作为一种高级编程语言,具有语法简洁、易于阅读和维护的特点。它的设计哲学强调代码的可读性,使用空格缩进区分代码块,而非使用大括号或其他语法元素。Python支持多种编程范式,包括面向对象、命令式、函数式和过程式编程。二、Python在各领域的应用- 数据分析与可视化:Python提供了许多强大的库如Pandas、NumPy和Matplotlib,这些库使得数据处理、分析和可视化工作变得更加高效和简洁。- Web开发:通过诸如Django和Flask这样的框架,Python能够方便快速地搭建网站和开发Web应用。- 强化学习:Python在人工智能领域,特别是在强化学习领域拥有广泛的应用。强化学习通过与环境的交互学习策略,以获得最大的累积奖励。三、强化学习的基本概念强化学习是一种学习范式,目标是使智能体能够通过在环境中采取行动并获取奖励或惩罚来学习最优化行为策略。它涉及到智能体、环境、状态、动作和奖励等基本概念。四、单智能体与多智能体强化学习的区别- 单智能体强化学习:单一智能体在环境中独立学习,以最大化总奖励。- 多智能体强化学习:涉及多个智能体在同一个环境中相互作用和学习。它们可以通过合作或竞争来达成目标。多智能体系统复杂度更高,需要考虑智能体间的通信、协调和策略交互。五、多智能体强化学习的关键技术与算法分类- 基本概念:包括状态空间、动作空间、奖励函数、策略和价值函数等。- 关键技术:如状态表示学习、策略优化方法、动态环境建模等。- 算法分类:可以分为基于值的算法(例如Q-learning及其变种),基于策略的算法(例如Policy Gradient及其变种)以及Actor-Critic算法。六、强化学习环境的搭建- 基础环境配置:包括安装Python、包管理工具如pip以及创建虚拟环境等。- 强化学习核心库安装:如安装Gymnasium、Stable Baselines3以及PettingZoo等。- 多智能体环境配置:选择合适的多智能体环境(如SMAC和MPE),并进行相应配置。- 开发工具配置:选择合适的集成开发环境(IDE),配置Jupyter Notebook以及版本控制工具。七、多智能体协同训练算法设计- 算法设计基础:包括算法设计的基本原理、关键挑战和评估指标。- 经典协同训练算法:介绍Q-learning算法及其扩展、Policy Gradient算法及其扩展、Actor-Critic算法及其扩展。- 分布式协同训练算法:涉及到如何在分布式环境中执行强化学习训练,实现多智能体间的协同学习和决策。文档中提到的“文档内容完整、条理清晰”暗示了文档在结构设计上的优点,使其更易于读者学习和理解。另外,文档中还强调了Python编程语言的学习价值,以及多智能体协同训练在强化学习中的重要性与实用性。通过逐步深入的介绍,文档旨在帮助读者从基础语法掌握到参与实用项目实践,再到理解强化学习的高级概念和算法,从而在多智能体协同训练领域取得突破。文档特别提醒仅供学习参考,禁止商业用途。
fanxbl957
Python爬虫+Flask+Echarts构建全疫情实时可视化大屏
Python爬虫+Flask+Echarts构建全疫情实时可视化大屏。主要涉及的知识点为前端三剑客(html,css,js),python爬虫,Flask,echarts等。适合学习了python爬虫
艾派森
581
python + flask + LayUI + mysql 网站模板.zip
python + flask + LayUI + mysql 网站模板python + flask + LayUI + mysql 网站模板python + flask + LayUI + mysql
「已注销」
1182