☰
PythonStock V2 全栈股票系统实战指南:基于 akshare、pandas 与 Tornado 的数据抓取、指标计算与可视化部署
2026/9/27 10:10:24 网站建设 项目流程
  • 后端
  • 数据分析
  • 数据可视化
  • 金融科技

【免费下载链接】stock

stock,股票系统。使用python进行开发。

项目地址:https://gitcode.com/gh_mirrors/st/stock
点击查看免费下载

导读

本文以 PythonStock V2(下称 stock 项目)为核心,系统讲解一个基于 Python 生态(pandas、akshare、bokeh、tornado、stockstats 等)构建的全栈股票系统的完整技术脉络:从 Docker 一键部署、cron 定时任务与每日 18 点数据抓取计算,到 17 个技术指标的批量计算、KDJ/RSI/CCI 买卖信号二次筛选,再到基于 Tornado + DataTables + Bokeh 的通用数据展示与绘图。读完本文,你将掌握这套"数据抓取 → 数据处理 → 指标计算 → Web 展示"全流程的实现思路与可复制的部署方法。

特别说明:股市有风险投资需谨慎,本项目只能用于 Python 代码学习与股票分析,投资失败亏钱不负责,不算 BUG。


一、项目定位与整体架构

1.1 项目简介

PythonStock V2 是基于 Python 的 pandas、akshare、bokeh、tornado、stockstats、ta-lib 等框架开发的全栈股票系统(项目创建于 2017 年 7 月 17 日,README 存档时间为 2023-06-02)。项目具备以下核心特性:

  1. Docker 一键部署:整个项目在 Docker Hub 上压缩后约 200MB,本地占用约 500MB 磁盘空间,可直接本地部署运行。
  2. 存储与数据源:使用 Mariadb(MySQL)存储数据,借助 akshare 抓取数据,用 Docker 解决 Python 库安装问题。
  3. 定时任务:使用 cron 做定时任务,每天进行数据抓取计算;每天 18 点开始计算当日数据,使用 300 天数据进行计算,大约需要 15 分钟计算完毕。
  4. 防封缓存机制:股票数据接口防止被封,按天进行数据缓存,储存最近 3 天数据、每天定时清除,同时使用read_pickle/to_pickle的 gzip 压缩模式存储。
  5. Tornado Web 系统:支持每日股票数据(东财)、龙虎榜-个股上榜(新浪)、数据中心-大宗交易行情等数据展示。
  6. 通用数据展示系统:配置字典模板之后页面自动加载数据并完成展示,后续自己开发的指标数据可以加入进去。
  7. 曲线数据分析:查看股票时可跳转东方财富页面,点击指标后使用 Bokeh 将多达 17 个指标的数据绘图展示。
  8. 2.0 最大更新:替换 tushare 库(因部分库不能使用),改用 akshare 进行数据抓取。

1.2 基础库版本

依赖库版本
pandas1.3.5
numpy1.21.5
akshare1.3.50
bokeh2.4.2
stockstats0.3.2

1.3 目录架构设计

全系统使用 Python 实现,从数据抓取、数据处理到数据展示、数据运算都是 Python 实现,最终数据都到前端展示。主要分为 4 个文件夹:

jobs抓取数据并存储实现类。

libs通用工具类。

web前端展示框架。

supervisor进程管理工具。

这一目录划分直接对应代码库:数据抓取与指标计算脚本位于 jobs(如 18h_daily_job.py、guess_indicators_daily_job.py、basic_job.py);通用工具类位于 libs(如 common.py 提供数据库连接、缓存读写等公共方法,stock_web_dic.py 提供 Web 通用数据字典配置);Web 展示框架位于 web(Tornado 应用 main.py 及各 Handler);进程管理配置位于 supervisor。


二、Docker 部署:从拉镜像到本地调试

2.1 使用 mariadb 和 stock 两个镜像

项目依赖 Docker 部署,需要使用 mariadb 和 stock 两个镜像:

mkdir -p /data/mariadb/data docker pull pythonstock/pythonstock:latest docker pull mariadb:latest docker run --name mariadb -v /data/mariadb/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=mariadb -p 3306:3306 -d mariadb:latest docker run -itd --link=mariadb --name stock \ -v /data/notebooks:/data/notebooks \ -p 8888:8888 \ -p 9999:9999 \ pythonstock/pythonstock:latest

其中--link=mariadb让 stock 容器通过主机名mysqldb访问数据库。从 libs/common.py 源码可以看到,数据库配置默认值正是mysqldb:

MYSQL_HOST = os.environ.get('MYSQL_HOST') if (os.environ.get('MYSQL_HOST') != None) else "mysqldb" MYSQL_USER = os.environ.get('MYSQL_USER') if (os.environ.get('MYSQL_USER') != None) else "root" MYSQL_PWD = os.environ.get('MYSQL_PWD') if (os.environ.get('MYSQL_PWD') != None) else "mysqldb" MYSQL_DB = os.environ.get('MYSQL_DB') if (os.environ.get('MYSQL_DB') != None) else "stock_data"

即:支持通过环境变量MYSQL_HOST / MYSQL_USER / MYSQL_PWD / MYSQL_DB覆盖数据库连接配置,兼容开发模式与 Docker 模式。

2.2 直连外部 MySQL:环境变量方式

如果直接启动 stock、使用其他 MySQL 数据库,需要配置变量方式:

docker run -itd --name stock \ -v /data/notebooks:/data/notebooks \ -p 8888:8888 \ -p 9999:9999 \ -e MYSQL_HOST=127.0.0.1 \ -e MYSQL_USER=root \ -e MYSQL_PWD=mariadb \ -e MYSQL_DB=stock_data \ pythonstock/pythonstock:latest

libs/common.py 中根据这些环境变量拼出 SQLAlchemy 连接串:

MYSQL_CONN_URL = "mysql+mysqldb://" + MYSQL_USER + ":" + MYSQL_PWD + "@" + MYSQL_HOST + ":3306/" + MYSQL_DB + "?charset=utf8mb4"

可见连接固定使用 3306 端口与charset=utf8mb4字符集。

2.3 使用 docker-compose 一键启动

在仓库根目录 docker-compose.yml 中直接执行:

docker-compose up -d

如果想要修改文件进行调试,可以增加当前目录映射,将宿主机的 jobs、libs、web 三个目录挂载进 stock 容器:

volumes: - "./jobs:/data/stock/jobs" - "./libs:/data/stock/libs" - "./web:/data/stock/web"

这与镜像内约定的代码目录/data/stock保持一致(run_init.sh 中设置了export PYTHONPATH=/data/stock)。

2.4 进入镜像手动执行任务

docker exec -it stock bash sh /data/stock/jobs/cron.daily/run_daily

说明:启动容器后,会调用run_init.sh进行数据初始化,同时第一次执行会后台执行当日数据;以后每日 18 点(只有 18 点左右才有今日的数据)进行股票数据抓取并计算。

从 jobs/run_init.sh 可以看到初始化流程的完整实现:

export PYTHONIOENCODING=utf-8 export LANG=zh_CN.UTF-8 export PYTHONPATH=/data/stock ... sleep 120 # 等待 mysqldb 启动 /usr/local/bin/python3 /data/stock/jobs/basic_job.py >> /data/logs/run_init.log printenv | grep -v "no_proxy" >> /etc/environment # 解决环境变量输出问题 nohup bash /data/stock/jobs/cron.daily/run_daily & # 第一次后台执行日数据 /usr/sbin/cron -f # 启动 cron 服务(前台)

2.5 本地访问端口

http://localhost:9999 股票系统

Tornado 服务监听端口在 web/main.py 中定义:port = 9999,与 Docker 的-p 9999:9999端口映射对应。


三、应用部署与数据库初始化

3.1 数据库准备

需要 MySQL 数据库启动,项目放到/data/stock目录。首次部署创建数据库:

CREATE DATABASE IF NOT EXISTS `stock_data` CHARACTER SET utf8 COLLATE utf8_general_ci;

实际上 jobs/basic_job.py 会自动完成数据库创建:先尝试连接stock_data库执行select 1,失败则连接mysql系统库执行CREATE DATABASE IF NOT EXISTS,保证容器冷启动时数据库可用:

create_sql = " CREATE DATABASE IF NOT EXISTS %s CHARACTER SET utf8 COLLATE utf8_general_ci " % common.MYSQL_DB

3.2 数据写入与主键约束

libs/common.py 提供通用的数据入库方法insert_db/insert_other_db:使用 SQLAlchemy 的data.to_sql写入,列类型统一转为NVARCHAR(length=255),并通过inspect.get_pk_constraint检查主键,若不存在则执行ALTER TABLE ... ADD PRIMARY KEY,从而保证重跑数据时索引唯一:

if insp.get_pk_constraint(table_name)['constrained_columns'] == []: with engine_mysql.connect() as con: con.execute('ALTER TABLE `%s` ADD PRIMARY KEY (%s);' % (table_name, primary_keys))

3.3 数据重跑机制

common.run_with_args支持三种命令行参数模式(libs/common.py):

  • 无参数:默认跑当日数据(若在每天 12 点之前运行,则自动回退到昨天数据);
  • python xxx.py 2017-07-01:指定单个日期重跑;
  • python xxx.py 2017-07-01 10:指定起始日期并循环重跑 N 天历史数据。
if len(sys.argv) == 3: tmp_year, tmp_month, tmp_day = sys.argv[1].split("-") loop = int(sys.argv[2]) tmp_datetime = datetime.datetime(int(tmp_year), int(tmp_month), int(tmp_day)) for i in range(0, loop): tmp_datetime_new = tmp_datetime + datetime.timedelta(days=i) run_fun(tmp_datetime_new)

四、每日数据抓取:akshare 接口与定时任务

4.1 每日任务脚本 run_daily

每日数据流水线由 jobs/cron.daily/run_daily 驱动,依次执行两个 Python 脚本并清理 20 天前的历史缓存:

/usr/local/bin/python3 /data/stock/jobs/18h_daily_job.py >> /data/logs/daily.${DATE}.log /usr/local/bin/python3 /data/stock/jobs/guess_indicators_daily_job.py >> /data/logs/daily.${DATE}.log # 清除前 20 天数据(原文注释为前3天,脚本按 20 天执行清理) DATE_20=`date -d '-20 days' +%Y-%m-%d` rm -f /data/cache/hist_data_cache/${MONTH_20}/${DATETIME_20}

对应容器内的 cron 调度配置可参考 jobs/cron.hourly/run_hourly、jobs/cron.minutely/run_1minute 等目录结构,README 明确每日 18 点(只有 18 点左右才有当日数据)执行抓取计算。

4.2 数据源与股票代码过滤

18h_daily_job.py 通过 akshare 抓取三类核心数据:

数据类型akshare 接口数据来源
每日股票实时行情ak.stock_zh_a_spot_em()东方财富
龙虎榜-个股上榜统计ak.stock_sina_lhb_ggtj(recent_day="5")新浪财经
大宗交易每日统计ak.stock_dzjy_mrtj(start_date, end_date)东方财富数据中心

股票代码过滤规则(README 原文):600 开头的股票是上证 A 股,属于大盘股,其中 6006 开头是最早上市的股票,6016 开头为大盘蓝筹股;900 开头是上证 B 股;000 开头是深证 A 股,001、002 开头也都属于深证 A 股,其中 002 开头是深证 A 股中小企业股票;200 开头是深证 B 股;300 开头是创业板股票;400 开头是三板市场股票。

代码过滤包括:600、6006、601、000、001、002,且不包括 ST 的股票数据。源码中对应三个过滤函数:

def stock_a(code): if code.startswith('600') or code.startswith('6006') or code.startswith('601') \ or code.startswith('000') or code.startswith('001') or code.startswith('002'): return True def stock_a_filter_st(name): # name.find("ST") == -1 才保留 def stock_a_filter_price(latest_price): # np.isnan 过滤无价格(退市)股票

数据抓取后按date删除当日老数据再重新入库,保证幂等:

del_sql = " DELETE FROM `stock_zh_ah_name` where `date` = '%s' " % datetime_int common.insert(del_sql) common.insert_db(data, "stock_zh_ah_name", True, "`date`,`code`")

4.3 历史行情缓存机制

为防止股票数据接口被封,libs/common.py 实现了按天、按股票的 gzip pickle 缓存:

bash_stock_tmp = "/data/cache/hist_data_cache/%s/%s/" # 月目录/日目录 cache_file = cache_dir + "%s^%s.gzip.pickle" % (date_end, code) if os.path.isfile(cache_file): return pd.read_pickle(cache_file, compression="gzip") else: stock = ak.stock_zh_a_hist(symbol=code, start_date=date_start, end_date=date_end, adjust="") stock.to_pickle(cache_file, compression="gzip")

缓存按"月/日"目录组织、每次取约 100 天(指标计算时date_start = date_end - 100 天)行情,配合每日清理脚本,实现"储存最近数据、定时清除"的防封策略。

4.4 pandas 处理重复数据

README 更新日志第 2 条给出重复数据处理示例:取指定期间数据后按 code 去重、保留最新一条:

data = get_data(year, quarter) # 处理重复数据,保存最新一条数据。 data.drop_duplicates(subset="code", keep="last")

该用法在指标计算脚本中同样出现(jobs/guess_indicators_daily_job.py 中data = data.drop_duplicates(subset="code", keep="last")),保证插入数据库前无重复记录。


五、17 个技术指标的计算体系

每日股票指标数据计算结果存储在数据表guess_indicators_daily,共计算 17 个指标,实现位于 jobs/guess_indicators_daily_job.py,基于stockstats库(stockstats.StockDataFrame.retype(stock))批量计算:

计算指标说明
1,交易量 delta 指标分析The Volume Delta (Vol ∆)
2,计算 n 天差可以计算向前 n 天和向后 n 天的差
3,n 天涨跌百分比计算可以看到 -n 天数据和今天数据的百分比
4,CR 指标价格动量指标。CR 跌穿 a、b、c、d 四条线再由低点向上爬升 160 时,为短线获利良机,应适当卖出;CR 跌至 40 以下时是建仓良机;CR 高于 300~400 时应注意适当减仓
5,最大值、最小值计算区间最大值(如volume_-3,2,-1_max)、区间最小值(如volume_-3~1_min),实际使用 -2~2 可计算 5 天的最大、最小值
6,KDJ 指标随机指标,通过特定周期(常为 9 日)内最高价、最低价及收盘价比例计算 RSV,再以平滑移动平均计算 K、D、J 值;J 即 3K-2D,以领先 KD 找出底部和头部;J 大于 100 时为超买,小于 10 时为超卖
7,SMA 指标简单移动平均线,可动态输入参数获得几天的移动平均
8,MACD 指标平滑异同移动平均线;当市场呈牛皮盘整格局时 MACD 买卖讯号较不明显,可运用短期 K、D 图形作辅助并对买卖讯号作双重确认
9,BOLL 指标布林线指标 (Bollinger Bands)
10,RSI 指标相对强弱指标;高于 50 表示强势市场,低于 50 表示弱势市场;多在 70 与 30 之间波动;六日指标上升到达 80 表示超买,超过 90 为严重超买警戒区
11,W%R 指标威廉指数 (Williams %R),利用摆动点度量市场超买超卖现象
12,CCI 指标顺势指标,研判股价偏离度;默认 14 天;从下向上突破 +100 进入非常态区间应及时买入,从上向下突破 -100 进入另一个非常态区间应以持币观望为主
13,TR、ATR 指标均幅指标 (Average True Range),取一定周期内股价波动幅度的移动平均值,主要用于研判买卖时机
14,DMA 指标平行线差指标 (Different of Moving Average),中短期指标,常用于大盘指数和个股研判;即 10 与 50 移动平均之差stock['dma']
15,DMI、+DI、-DI、DX、ADX、ADXR 指标动向指数及其衍生指标;ADXR 是今日 ADX 与前面某一日 ADX 的平均值,在高位与 ADX 同步下滑可提前确认 ADX 调头;应用时以 ADX 为主、ADXR 为辅
16,TRIX、MATRIX 指标三重指数平滑移动平均指标 (Triple Exponentially Smoothed Average)
17,VR、MAVR 指标成交量比率 (Volume Ratio),通过分析股价上升日与下降日成交额比值掌握市场买卖气势的中期技术指标

计算时实际产出的列清单(jobs/guess_indicators_daily_job.py 中stock_column)包括:adx, adxr, boll, boll_lb, boll_ub, cci, cci_20, close_-1_r, close_-2_r, cr, cr-ma1, cr-ma2, cr-ma3, dma, dx, kdjd, kdjj, kdjk, macd, macdh, macds, mdi, pdi, rsi_12, rsi_6, trix, trix_9_sma, vr, vr_6_sma, wr_10, wr_6。

从实现看,apply_guess对每只股票取最近约 100 天历史行情(通过common.get_hist_data_cache走缓存),交给 stockstats 重定型后取每个指标的最新值tail(1),并对np.isinf/np.isnan统一置 0;concat_guess_data将计算结果与当日行情pd.merge合并;stat_all_batch以 100 条为一批(batch_size = 100)分批处理全市场股票,每批执行删除老数据 → 查询当日股票 → 计算指标 → 入库guess_indicators_daily(主键date, code)的流程,最后统一保留两位小数。


六、KDJ / RSI / CCI 买卖信号筛选

README 给出基于 3 个指标的买卖规则,项目据此生成两张结果表:guess_indicators_lite_buy_daily(购买条件结果表)与guess_indicators_lite_sell_daily(卖出条件结果表),实现见 jobs/guess_indicators_daily_job.py 的stat_all_lite_buy/stat_all_lite_sell。

6.1 KDJ 指标规则

  • 超买区:K 值在 80 以上、D 值在 70 以上、J 值大于 90 时为超买。一般情况下股价有可能下跌,投资者应谨慎行事,局外人不应再追涨,局内人应适时卖出。
  • 超卖区:K 值在 20 以下、D 值在 30 以下为超卖区。一般情况下股价有可能上涨、反弹可能性增大,局内人不应轻易抛出股票,局外人可寻机入场。
  • 补充:J 大于 100 时为超买,小于 10 时为超卖。

6.2 RSI 指标规则

  1. 当六日指标上升到达 80 时,表示股市已有超买现象;如果一旦继续上升超过 90 以上,则表示已到严重超买的警戒区,股价已形成头部,极可能在短期内反转回转。
  2. 当六日强弱指标下降至 20 时,表示股市有超卖现象;如果一旦继续下降至 10 以下,则表示已到严重超卖区域,股价极可能有止跌回升的机会。

6.3 CCI 指标规则

  1. 当 CCI>+100 时,表明股价已经进入非常态区间——超买区间,股价的异动现象应多加关注。
  2. 当 CCI<-100 时,表明股价已经进入另一个非常态区间——超卖区间,投资者可以逢低吸纳股票。

6.4 源码中的筛选 SQL

买入候选(超买信号)的 SQL 条件:

SELECT `date`,`code`,`name`,`latest_price`,`quote_change`,`ups_downs`,`volume`,`turnover`, `amplitude`,`high`,`low`,`open`,`closed`,`quantity_ratio`,`turnover_rate`,`pe_dynamic`,`pb`, `kdjj`,`rsi_6`,`cci` FROM stock_data.guess_indicators_daily WHERE `date` = %s and kdjk >= 80 and kdjd >= 70 and kdjj >= 90

卖出候选(超卖信号)的 SQL 条件:

SELECT `date`,`code`,`name`,`latest_price`,`quote_change`,`ups_downs`,`volume`,`turnover`, `amplitude`,`high`,`low`,`open`,`closed`,`quantity_ratio`,`turnover_rate`,`pe_dynamic`,`pb`, `kdjj`,`rsi_6`,`cci` FROM stock_data.guess_indicators_daily WHERE `date` = %s and kdjk <= 20 and kdjd <= 30 and kdjj <= 10

两次筛选均先DELETE当日旧结果,再drop_duplicates(subset="code", keep="last")后写入对应结果表(主键date, code)。源码注释中保留了可调的扩展参数(如kdjj > 100 and rsi_6 > 80 and cci > 100),可按需调整阈值提前获得股票增长信号。


七、Tornado Web 展示系统

7.1 路由与端口

web/main.py 基于 Tornado 构建应用,路由配置如下:

路由Handler功能
/、/stock/HomeHandler首页,展示各依赖库版本号
/test_akshare、/test2TestHandler / Test2HandlerJS 测试页面
/stock/api_datadataTableHandler.GetStockDataHandlerDataTables 报表数据接口
/stock/datadataTableHandler.GetStockHtmlHandler通用数据展示页面
/data/editordataEditorHandler.GetEditorHtmlHandler数据编辑页面
/data/editor/savedataEditorHandler.SaveEditorHandler数据保存接口
/stock/data/indicatorsdataIndicatorsHandler.GetDataIndicatorsHandler股票指标数据(Bokeh 绘图数据)

Web 启动命令(README 更新日志第 5 条给出日志配置方式):

/usr/local/bin/python3 /data/stock/web/main.py -log_file_prefix=/data/logs/web.log

对应源码 web/main.py 中tornado.options.parse_command_line()接收该参数。

7.2 通用数据展示:配置字典即可上线

核心设计是"通用数据展示系统":在 libs/stock_web_dic.py 中配置StockWebData(mode, type, name, table_name, columns, column_names, primary_key, order_by)之后,页面自动加载数据完成展示,不用一个表一个表开发。

已内置的五张数据表配置:

modetypenametable_name
query1,股票基本数据每日股票数据-东财stock_zh_ah_name
query1,股票基本数据龙虎榜-个股上榜-新浪stock_sina_lhb_ggtj
query1,股票基本数据数据中心-大宗交易stock_dzjy_mrtj
query2,每日数据猜想股票指标 lite 猜想买入guess_indicators_lite_buy_daily
query2,每日数据猜想股票指标 lite 猜想卖出guess_indicators_lite_sell_daily
query2,每日数据猜想股票指标猜想原始数据guess_indicators_daily

以"每日股票数据-东财"为例,columns 与中文列名一一对应:

columns=['date','code','name','latest_price','quote_change','ups_downs','volume','turnover', 'amplitude','high','low','open','closed','quantity_ratio','turnover_rate','pe_dynamic','pb'], column_names=['日期','代码','名称','最新价','涨跌幅','涨跌额','成交量','成交额', '振幅','最高','最低','今开','昨收','量比','换手率','动态市盈率','市净率'],

配置加载时会自动在"代码"列后插入"查看股票"链接(跳转东方财富,WEB_EASTMONEY_URL = "http://quote.eastmoney.com/%s.html"),并校验 columns 与 column_names 长度一致。

7.3 DataTables 多字段排序与筛选

README 更新日志第 3 条总结了表格交互能力:

1,点击单个字段进行排序。 2,按住【shift】点击多个字段,即可完成多字段排序。 3,服务端分页排序。 4,按照多个字段进行筛选查询。

Web 前端静态资源(jquery.dataTables.min.js、buttons.dataTables.min.css 等)位于 web/static 目录,配合 web/dataTableHandler.py 实现服务端分页与排序。

7.4 Bokeh 指标绘图

查看股票时可直接跳转东方财富页面查看相关信息;点击指标之后使用 Bokeh 将多达 17 个指标的数据绘图、进行图表展示。Bokeh 相关代码入口为 web/chartHandler.py 与 web/tornado_bokeh_embed.py,前端模板 web/templates/stock_indicators.html 负责展示。README 还记录了 bokeh 的升级过程:升级到 2.1.1 后解决 JS 兼容问题(因 lib 包升级导致),最终稳定在 2.4.2,并配套 web/static/update_bokeh.sh 升级脚本。


八、版本演进与工程经验(更新日志要点)

README 的更新日志记录了项目从 1.0 到 2.0 的关键决策,对理解当前代码很有价值:

  • 15:发布 2.0 版本(2021-10-11)。构建基础镜像 pythonstock/pythonstock:base-2021-09,使用 akshare 1.1.9。起因是 tushare 数据不能抓取、pro 版本有积分限制,于是换用 akshare 并大改代码;同时删除从未用到的 ta-lib、去掉未使用的 jupyter,进一步减小镜像体积。
  • 14:bokeh 升级到 2.4.0 版本。依赖安装于/usr/local/lib/python3.7/site-packages,使用脚本升级。
  • 13:升级 ak 到 v1.0.80,做好每日东方财经数据。增加数据库 utf8 参数--character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci。
  • 12:升级基础镜像到 Python 3.7。akshare 要求 Python 3.7 以上,升级后 akshare 支持按日期查询,解决了TypeError: stock_zh_a_daily() got an unexpected keyword argument 'start_date'问题。
  • 11:使用 akshare 做相关股票数据抓取。中国股市开盘时间:周一至周五 9:30—11:30、13:00—15:00,收盘为下午 3 点。实时行情接口stock_zh_a_spot(新浪财经,重复运行会被暂时封 IP,建议增加时间间隔,单次返回所有 A 股实时行情);历史行情日频率接口stock_zh_a_daily(其中 sh689009 为 CDR,需通过 stock_zh_a_cdr_daily 接口获取)。
  • 10:增加东方财经弹窗窗口、指标计算弹窗窗口。东方财富页面通过 iframe 引入,避免跨域和样式问题;指标页面改成窗口弹窗做页面适配。
  • 9:增加日历。日期类型搜索条件使用 jQuery datepicker,设置语言 zh-CN、格式yyyymmdd、todayHighlight: true等。
  • 8:发现 MariaDB 版本不兼容问题,最终切换成 mysql:5.7 镜像。相关数据执行只支持到 10.5.4,10.5.8 就有问题,因此限制版本使用 mysql:5.7 更通用。
  • 7:解决 Bokeh JS 兼容问题(升级 bokeh 到 2.1.1,升级 JS)。
  • 5:解决日志打印问题:配置tornado.options.parse_command_line(),启动时传-log_file_prefix=/data/logs/web.log。
  • 4:解决跑数据问题:通过数据库链接 engine(见上文 libs/common.py 的conn()函数,设置db.autocommit(on=True)),避免升级代码造成 db.cursor() 问题。
  • 2:使用 pandas 处理重复数据(drop_duplicates(subset="code", keep="last"))。
  • 1:web 使用 DataTables 显示报表,在 libs/stock_web_dic.py 配置数据后动态加载菜单、根据数据库表的行列显示数据。

另外,容器日志与进程管理可参考 supervisor/supervisord.conf 与 startStock.sh;仓库还保留了 docker/Dockerfile、根目录 Dockerfile 与 nginx.conf,可进一步了解镜像构建与反向代理配置。


九、小结

PythonStock V2 提供了一个"全 Python 化"的股票系统参考实现:akshare 负责数据抓取(实时行情、龙虎榜、大宗交易、历史行情),gzip pickle 缓存防封,cron + run_daily 定时驱动 18 点数据计算,stockstats 批量产出 17 个技术指标,KDJ/RSI/CCI 规则二次筛选出买卖候选,Tornado + DataTables + stock_web_dic 配置驱动通用报表,Bokeh 完成指标绘图。其"通用数据展示配置化""数据可重跑""缓存与主键幂等写入"等设计思路,均可迁移到其他金融数据采集与分析场景。

  • 后端
  • 数据分析
  • 数据可视化
  • 金融科技

【免费下载链接】stock

stock,股票系统。使用python进行开发。

项目地址:https://gitcode.com/gh_mirrors/st/stock
点击查看免费下载

相关推荐

上一篇:ERPNext开源ERP终极指南:中小企业数字化转型的3种部署方案
下一篇:Citra图形设置终极指南:从模糊到高清的完整解决方案

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询