做一个 简单的Django 《股票自选助手》显示 用akshare 库(A股数据获取)

 图:

股票自选助手

这是一个基于 Django 开发的 A 股自选股票信息查看系统。系统使用 akshare 库获取实时股票数据,支持添加、删除和更新股票信息。

功能特点

  • 支持添加自选股票
  • 实时显示股票价格和涨跌幅
  • 一键更新所有股票数据
  • 支持删除不需要的股票
  • 使用中国时区显示更新时间
  • 支持简体中文界面

技术栈

  • Python 3.8+
  • Django 5.0.1
  • akshare(A股数据获取)
  • Bootstrap 5.1.3(前端界面)
  • SQLite(数据存储)

安装步骤

  1. 克隆项目到本地:
git clone [项目地址]
cd stock_tracker
  1. 创建并激活虚拟环境(可选但推荐):
python -m venv venv
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate
  1. 安装依赖包:
pip install django akshare pandas
  1. 初始化数据库:
python manage.py migrate
  1. 启动开发服务器:
python manage.py runserver
  1. 访问系统:
    打开浏览器,访问 http://127.0.0.1:8000

使用说明

添加股票

  1. 在输入框中输入股票代码,支持以下格式:
    • 直接输入代码:600519(系统会自动判断沪深市场)
    • 带后缀格式:
      • 上证股票:600519.SS
      • 深证股票:000001.SZ
  1. 点击"添加"按钮将股票添加到自选列表

更新股票数据

  • 点击"更新价格"按钮可以一次性更新所有股票的最新数据
  • 系统会显示更新成功和失败的股票数量

删除股票

  • 点击每个股票行右侧的"删除"按钮可以将股票从自选列表中移除

项目结构

stock_tracker/
├── manage.py
├── stock_tracker/          # 项目配置目录
│   ├── __init__.py
│   ├── settings.py        # 项目设置
│   ├── urls.py           # URL配置
│   └── wsgi.py
└── stocks/               # 股票应用目录├── __init__.py├── models.py        # 数据模型├── views.py         # 视图函数├── urls.py          # 应用URL配置└── templates/       # 模板文件└── stocks/└── stock_list.html

开发说明

数据模型

Stock 模型包含以下字段:

  • symbol: 股票代码
  • name: 股票名称
  • current_price: 当前价格
  • change_percent: 涨跌幅
  • last_updated: 最后更新时间

主要视图函数

  • stock_list: 显示股票列表
  • add_stock: 添加新股票
  • remove_stock: 删除股票
  • update_prices: 更新股票价格

注意事项

  1. 时区设置:
    • 系统使用中国时区 (Asia/Shanghai)
    • 所有时间显示均为本地时间
  1. 数据更新:
    • 使用 akshare 获取实时数据
    • 支持批量更新所有股票
  1. 错误处理:
    • 系统会显示详细的错误信息
    • 包含股票代码格式提示

维护和更新

  1. 数据库备份:
    • 定期备份 SQLite 数据库文件
  1. 依赖更新:
    • 定期检查并更新依赖包
    • 特别注意 akshare 的更新

代码:

stocks\models.py

from django.db import modelsclass Stock(models.Model):symbol = models.CharField(max_length=10, unique=True)name = models.CharField(max_length=100)current_price = models.DecimalField(max_digits=10, decimal_places=2, null=True)change_percent = models.DecimalField(max_digits=5, decimal_places=2, null=True)last_updated = models.DateTimeField(auto_now=True)def __str__(self):return f"{self.symbol} - {self.name}"

stocks\views.py

from django.shortcuts import render, redirect
from django.contrib import messages
from .models import Stock
import akshare as ak
from datetime import datetime
import pandas as pddef stock_list(request):stocks = Stock.objects.all().order_by('symbol')return render(request, 'stocks/stock_list.html', {'stocks': stocks})def add_stock(request):if request.method == 'POST':symbol = request.POST.get('symbol', '').upper()try:# 处理股票代码格式if symbol.endswith('.SZ'):code = symbol.replace('.SZ', '')market = 'sz'elif symbol.endswith('.SS'):code = symbol.replace('.SS', '')market = 'sh'else:code = symbolmarket = 'sh' if code.startswith('6') else 'sz'# 获取实时行情stock_info = ak.stock_zh_a_spot_em()stock_data = stock_info[stock_info['代码'] == code]if stock_data.empty:messages.error(request, f'找不到股票 {symbol} 的信息。请确保:\n1. 股票代码格式正确\n2. 对于上证股票,可以添加.SS后缀\n3. 对于深证股票,可以添加.SZ后缀')return redirect('stock_list')# 获取第一行数据stock_row = stock_data.iloc[0]stock_obj, created = Stock.objects.get_or_create(symbol=symbol,defaults={'name': stock_row['名称']})# 更新股票信息stock_obj.current_price = float(stock_row['最新价'])stock_obj.change_percent = float(stock_row['涨跌幅'])stock_obj.save()if created:messages.success(request, f'成功添加股票 {symbol}({stock_row["名称"]})')else:messages.success(request, f'成功更新股票 {symbol} 的信息')except Exception as e:messages.error(request, f'添加股票时出错: {str(e)}\n建议:\n1. 检查股票代码格式\n2. 确保网络连接正常')return redirect('stock_list')def remove_stock(request, symbol):try:stock = Stock.objects.get(symbol=symbol)stock.delete()messages.success(request, f'已删除股票 {symbol}')except Stock.DoesNotExist:messages.error(request, f'找不到股票 {symbol}')return redirect('stock_list')def update_prices(request):success_count = 0error_count = 0stocks = Stock.objects.all()try:# 获取所有A股实时行情stock_info = ak.stock_zh_a_spot_em()for stock in stocks:try:# 处理股票代码格式if stock.symbol.endswith('.SZ'):code = stock.symbol.replace('.SZ', '')elif stock.symbol.endswith('.SS'):code = stock.symbol.replace('.SS', '')else:code = stock.symbol# 查找对应的股票数据stock_data = stock_info[stock_info['代码'] == code]if not stock_data.empty:stock_row = stock_data.iloc[0]stock.current_price = float(stock_row['最新价'])stock.change_percent = float(stock_row['涨跌幅'])stock.save()success_count += 1else:error_count += 1except:error_count += 1continueexcept Exception as e:messages.error(request, f'更新价格时出错: {str(e)}')return redirect('stock_list')if success_count > 0:messages.success(request, f'成功更新 {success_count} 支股票的价格')if error_count > 0:messages.warning(request, f'有 {error_count} 支股票更新失败')return redirect('stock_list')

stocks\urls.py

from django.urls import path
from . import viewsurlpatterns = [path('', views.stock_list, name='stock_list'),path('add/', views.add_stock, name='add_stock'),path('remove/<str:symbol>/', views.remove_stock, name='remove_stock'),path('update/', views.update_prices, name='update_prices'),
] 

stocks\templates\stocks\stock_list.html

<!DOCTYPE html>
<html lang="zh">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>自选股票</title><link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet">
</head>
<body><div class="container mt-4"><h1 class="mb-4">我的自选股票</h1>{% if messages %}<div class="messages">{% for message in messages %}<div class="alert alert-{{ message.tags }}">{{ message }}</div>{% endfor %}</div>{% endif %}<!-- 添加新股票的表单 --><div class="card mb-4"><div class="card-body"><h5 class="card-title">添加新股票</h5><form method="post" action="{% url 'add_stock' %}" class="row g-3">{% csrf_token %}<div class="col-auto"><input type="text" name="symbol" class="form-control" placeholder="输入股票代码" required></div><div class="col-auto"><button type="submit" class="btn btn-primary">添加</button></div></form></div></div><!-- 股票列表 --><div class="card"><div class="card-body"><div class="d-flex justify-content-between align-items-center mb-3"><h5 class="card-title">股票列表</h5><a href="{% url 'update_prices' %}" class="btn btn-success">更新价格</a></div>{% if stocks %}<div class="table-responsive"><table class="table table-hover"><thead><tr><th>代码</th><th>名称</th><th>当前价格</th><th>涨跌幅</th><th>最后更新</th><th>操作</th></tr></thead><tbody>{% for stock in stocks %}<tr><td>{{ stock.symbol }}</td><td>{{ stock.name }}</td><td>{{ stock.current_price }}</td><td class="{% if stock.change_percent > 0 %}text-success{% elif stock.change_percent < 0 %}text-danger{% endif %}">{{ stock.change_percent|floatformat:2 }}%</td><td>{{ stock.last_updated|date:"Y-m-d H:i:s" }}</td><td><a href="{% url 'remove_stock' stock.symbol %}" class="btn btn-danger btn-sm" onclick="return confirm('确定要删除这支股票吗?')">删除</a></td></tr>{% endfor %}</tbody></table></div>{% else %}<p class="text-center">暂无自选股票,请添加。</p>{% endif %}</div></div></div><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script>
</body>
</html> 

stock_tracker\urls.py

from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('admin/', admin.site.urls),path('', include('stocks.urls')),
]

stock_tracker\settings.py

INSTALLED_APPS = [。。。'stocks',
]LANGUAGE_CODE = 'zh-hans'TIME_ZONE = 'Asia/Shanghai'USE_I18N = TrueUSE_TZ = True

AKShare 使用说明

AKShare 是一个优秀的开源财经数据接口库,用于获取中国金融市场数据。本项目主要使用其 A 股数据接口。

安装方法

pip install akshare

基本使用

import akshare as ak

A股数据获取

1. 实时行情数据

获取所有 A 股实时行情数据:

# 获取所有A股实时行情
stock_info = ak.stock_zh_a_spot_em()# 返回的数据包含以下字段:
# - 代码: 股票代码
# - 名称: 股票名称
# - 最新价: 当前价格
# - 涨跌幅: 涨跌百分比
# - 涨跌额: 价格变动
# - 成交量: 成交股数
# - 成交额: 成交金额
# - 振幅: 价格振幅
# - 最高: 最高价
# - 最低: 最低价
# - 今开: 开盘价
# - 昨收: 昨日收盘价

2. 个股历史数据

获取单个股票的历史数据:

# 获取股票历史数据
stock_history = ak.stock_zh_a_hist(symbol="000001", period="daily", start_date="20240101", end_date="20240110")# 参数说明:
# - symbol: 股票代码(不带市场后缀)
# - period: 周期(daily-日线,weekly-周线,monthly-月线)
# - start_date: 开始日期
# - end_date: 结束日期

3. 股票基本信息

获取股票的基本信息:

# 获取股票基本信息
stock_info = ak.stock_individual_info_em(symbol="000001")# 返回数据包含:
# - 股票代码
# - 股票简称
# - 行业
# - 总市值
# - 流通市值
# - 等基本面信息

本项目中的使用

在本项目中,我们主要使用了以下功能:

  1. 获取实时行情:
# 从 views.py 中的实现
def add_stock(request):# 获取实时行情数据stock_info = ak.stock_zh_a_spot_em()# 查找特定股票stock_data = stock_info[stock_info['代码'] == code]if not stock_data.empty:# 获取股票信息stock_row = stock_data.iloc[0]current_price = float(stock_row['最新价'])change_percent = float(stock_row['涨跌幅'])
  1. 批量更新价格:
# 从 views.py 中的实现
def update_prices(request):# 一次获取所有A股数据stock_info = ak.stock_zh_a_spot_em()for stock in stocks:# 查找对应的股票数据stock_data = stock_info[stock_info['代码'] == code]if not stock_data.empty:# 更新价格信息stock_row = stock_data.iloc[0]stock.current_price = float(stock_row['最新价'])stock.change_percent = float(stock_row['涨跌幅'])

注意事项

  1. 数据限制:
    • 接口访问可能有频率限制
    • 建议适当控制请求频率
    • 考虑数据缓存机制
  1. 代码格式:
    • A股代码格式:6位数字
    • 上证股票以 6 开头
    • 深证股票以 0 或 3 开头
  1. 错误处理:
    • 注意处理网络异常
    • 处理数据为空的情况
    • 处理数值转换异常

常见问题

  1. 数据获取失败:
    • 检查网络连接
    • 确认股票代码格式
    • 查看是否触发频率限制
  1. 数据不准确:
    • 确认是否在交易时间
    • 检查数据更新时间
    • 验证股票代码正确性

相关资源

  • AKShare 官方文档
  • GitHub 仓库
  • AKShare 使用教程

更新记录

  • 2024-01-10: 首次创建文档
  • 使用 akshare 1.15.68 版本
  • 主要实现 A 股实时数据获取功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/65636.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Protobuf编码规则详解

Protobuf编码规则详解 1 Message 结构1.1 tag1.1.1 字段编号(field_num)1.1.2 传输类型(wire_type) 1.2 字段顺序1.3 默认值 2 编码2.1 Varint编码2.1.1 Varint编码过程2.1.2解码过程2.1.3 存储2.1.4 小结2.2 有符号整数(sint32和sint64)编码的问题与zigzag优化 3 编码实践3.1测…

【docker】exec /entrypoint.sh: no such file or directory

dockerfile生成的image 报错内容&#xff1a; exec /entrypoint.sh: no such file or directory查看文件正常在此路径&#xff0c;但是就是报错没找到。 可能是因为sh文件的换行符使用了win的。

计算机的错误计算(二百零七)

摘要 利用两个数学大模型计算 arccot(0.125664e2)的值&#xff0c;结果保留16位有效数字。 实验表明&#xff0c;它们的输出中分别仅含有3位和1位正确数字。 例1. 计算 arccot(0.125664e2)的值&#xff0c;结果保留16位有效数字。 下面是与一个数学解题器的对话。 以上为与…

MCANet: 基于多模态字幕感知的大语言模型训练无关视频异常检测

目录 摘要01 引言02 相关工作2.1 视频异常检测2.2 基于视频的大语言模型&#xff08;VLLMs&#xff09; 03 方法论3.1 问题定义3.2 MCANet3.3 图像字幕分支3.4 音频字幕分支3.5 基于LLM的异常评分3.6 视频-文本分数优化 04 实验4.1 数据集和评估指标4.2 实现细节4.3 定性结果4.…

WMS仓库管理系统,Vue前端开发,Java后端技术源码(源码学习)

一、项目背景和建设目标 随着企业业务的不断扩展&#xff0c;仓库管理成为影响生产效率、成本控制及客户满意度的重要环节。为了提升仓库作业的透明度、准确性和效率&#xff0c;本方案旨在构建一套全面、高效、易用的仓库管理系统&#xff08;WMS&#xff09;。该系统将涵盖库…

【Uniapp-Vue3】创建自定义页面模板

大多数情况下我们都使用的是默认模板&#xff0c;但是默认模板是Vue2格式的&#xff0c;如果我们想要定义一个Vue3模板的页面就需要自定义。 一、我们先复制下面的模板代码&#xff08;可根据自身需要进行修改&#xff09;&#xff1a; <template><view class"…

【Go】:图片上添加水印的全面指南——从基础到高级特性

前言 在数字内容日益重要的今天&#xff0c;保护版权和标识来源变得关键。为图片添加水印有助于声明所有权、提升品牌认知度&#xff0c;并防止未经授权的使用。本文将介绍如何用Go语言实现图片水印&#xff0c;包括静态图片和带旋转、倾斜效果的文字水印&#xff0c;帮助您有…

springCloudGateWay使用总结

1、什么是网关 功能: ①身份认证、权限验证 ②服务器路由、负载均衡 ③请求限流 2、gateway搭建 2.1、创建一个空项目 2.2、引入依赖 2.3、加配置 3、断言工厂 4、过滤工厂 5、全局过滤器 6、跨域问题

【UE5 C++课程系列笔记】22——多线程基础——FRunnable和FRunnableThread

目录 1、FRunnable 1.1 概念 1.2 主要成员函数 &#xff08;1&#xff09;Init 函数 &#xff08;2&#xff09;Run 函数 &#xff08;3&#xff09;Stop 函数 &#xff08;4&#xff09;Exit 函数 2、FRunnableThread 2.1 概念 2.2 主要操作 &#xff08;1&#xff…

《图解HTTP》 学习日记

1.了解WEB以及网络基础 1.1使用HTTP协议访问WEB web页面显示:根据web浏览器地址栏中输入指定的URL,web浏览器从web服务端获取文件资源(resource)等信息&#xff0c;从而显示出web页面 1.2网络基础TCP/IP 通常使用的网络(包括 互联网)是在tcp/ip协议族的基础上运作的&#xf…

【Docker】docker compose 安装 Redis Stack

注&#xff1a;整理不易&#xff0c;请不要吝啬你的赞和收藏。 前文 Redis Stack 什么是&#xff1f; 简单来说&#xff0c;Redis Stack 是增强版的 Redis &#xff0c;它在传统的 Redis 数据库基础上增加了一些高级功能和模块&#xff0c;以支持更多的使用场景和需求。Redis…

kubesphere前端源码运行

一、下载源码 源码是react&#xff0c;下载地址是 GitHub - kubesphere/console at v3.3.2 然后直接用git下拉就可以了 下拉完成后差不多是这样一个目录结构&#xff0c;记得切分支到3.3.2 二、下载依赖 1、node & yurn 想要运行源码首先需要node&#xff0c;使用刚才…

蓝桥杯历届真题 #分布式队列 (Java,C++)

文章目录 题目解读[蓝桥杯 2024 省 Java B] 分布式队列题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示 思路完整代码 题目解读 题目链接 [蓝桥杯 2024 省 Java B] 分布式队列 题目描述 小蓝最近学习了一种神奇的队列&#xff1a;分布式队列。简单来说&#x…

PySide6 Qt for Python Qt Quick参考网址

Qt QML BOOK&#xff1a; 《Qt for Python》 -Building an Application https://www.qt.io/product/qt6/qml-book/ch19-python-build-app#signals-and-slots Qt for Python&#xff1a;与C版本的差异即BUG处理&#xff08;常见的DLL文件确实的问题等&#xff09; Qt for Pyt…

如何稳定使用 O1 / O1 Pro,让“降智”现象不再困扰?

近期&#xff0c;不少朋友在使用 O1 或 O1 Pro 模型时&#xff0c;都会碰到“降智”或“忽高忽低”的智力波动&#xff0c;比如无法识图、无法生成图片、甚至回答准确度也不稳定。面对这些问题&#xff0c;你是不是也感到头疼呢&#xff1f; 为了找到更可靠的解决办法&#xf…

用户界面的UML建模11

然而&#xff0c;在用户界面方面&#xff0c;重要的是要了解《boundary》类是如何与这个异常分层结构进行关联的。 《exception》类的对象可以作为《control》类的对象。因此&#xff0c;《exception》类能够聚合《boundary》类。 参见图12&#xff0c;《exception》Database…

记录一次面试中被问到的问题 (HR面)

文章目录 一、你对公司的了解多少二、为什么对这个岗位感兴趣三、不能说的离职原因四、离职原因高情商回复五、你的核心优势是什么六、你认为你比其他面试候选人的优势是什么七、不要提及情感 一、你对公司的了解多少 准备要点&#xff1a; 在面试前&#xff0c;对公司进行充分…

前端 图片上鼠标画矩形框,标注文字,任意删除

效果&#xff1a; 页面描述&#xff1a; 对给定的几张图片&#xff0c;每张能用鼠标在图上画框&#xff0c;标注相关文字&#xff0c;框的颜色和文字内容能自定义改变&#xff0c;能删除任意画过的框。 实现思路&#xff1a; 1、对给定的这几张图片&#xff0c;用分页器绑定…

pandas系列----DataFrame简介

DataFrame是Pandas库中最常用的数据结构之一&#xff0c;它是一个类似于二维数组或表格的数据结构。DataFrame由多个列组成&#xff0c;每个列可以是不同的数据类型&#xff08;如整数、浮点数、字符串等&#xff09;。每列都有一个列标签&#xff08;column label&#xff09;…

安装完docker后,如何拉取ubuntu镜像并创建容器?

1. 先docker拉取ubuntu镜像 docker search ubuntu #搜索ubuntu 镜像 docker pull ubuntu:22.04 #拉取ubuntu 镜像 docker images #下载完成后&#xff0c;查看已经下载的镜像 docker run --name ubuntu_container -dit ubuntu:22.04 /bin/bash # docker container -l 2.…