金融量化学习---Python, MySQL, Pandas

这里用来记录一些在金融领域,尤其是银行相关的资金、债券、票据中应用到的数据管理与分析, 编程等心得或笔记,以及个人的一点小小兴趣(易经八卦、藏密禅修)等

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

Step by Step 在Docker中运行inStock股票系统


背景介绍:
InStock⁠股票系统,抓取每日股票、ETF关键数据,计算股票技术指标、筹码分布,识别K线各种形态,综合选股,内置多种选股策略,支持选股验证回测,支持自动交易,支持批量时间,运行高效,支持PC、平板、手机移动设备显示,是量化投资的好帮手。

项目地址:https://github.com/myhhub/stock⁠
Docker镜像:https://hub.docker.com/r/mayanghua/instock

以上两个地址,尤其是Docker地址不是每个人都能访问,本项目需要使用instock和mariadb/mysql两个容器,找来找去,找到cherry这个人的网盘:
解决网络问题无法下载容器镜像的问题。通过网盘进行下载EXE文件后,双击解压成容器镜像。原文在此:https://www.zhihu.com/tardis/zm/art/12452736874?source_id=1005
阿里云盘:https://www.alipan.com/s/WFKpViJaf7g
夸克网盘:https://pan.quark.cn/s/6583aa99b455

环境准备

方法一:windows11下安装ORACLE的Virtual Box,在其中安装Ubuntu系统

Virtual BOX: https://www.virtualbox.org/wiki/Linux_Downloads
Ubuntu桌面版:https://cn.ubuntu.com/download/desktop

方法二:windows10以上,可以直接安装WSL2,再安装Ubuntu,也很流行

官方方法:https://learn.microsoft.com/zh-cn/windows/wsl/install

Ubuntu之后的安装流程

Python 安装

Docker 及 portainer-ce安装

Mysql 安装

MariaDB 安装

原文指示:(参考原项目地址,以下用截图表示)

本人实际操作如下:
为了数据保存,先创建一个目录作为容器的映射目录(此处目录和原文不同)
mkdir /var/lib/mariadb

然后配置文件,把该目录映射到宿主机(因为我的3306端口留给mysql用了,所以改用3307)

docker run --name InStockDbService \
           -p 3307:3307 \
           -e MYSQL_ROOT_PASSWORD=root \
           -v /var/lib/mariadb:/var/lib/mariadb \
           -d mariadb:latest

-name 启动容器设置容器名称为 mariadb
-p 设置容器的3306端口映射到主机3306端口
-e MYSQL_ROOT_PASSWORD 设置环境变量数据库 root 用户密码为输入数据库 root 用户的密码
-v 设置容器目录/var/lib/mariadb 映射到本地目录 /var/lib/mariadb
-d 后台运行容器 mariadb 并返回容器id

此命令一般格式如下:
sudo docker run --name my_mariadb \  
  -e MYSQL_ROOT_PASSWORD=root_password \  
  -e MYSQL_DATABASE=database_name \  
  -e MYSQL_USER=user_name \  
  -e MYSQL_PASSWORD=user_password \  
  -v mariadb_data:/var/lib/mysql \  
  -d my_mariadb  

运行结果如下:

然后在portainer中可以看到InStockDbService容器已经在运行中:

接下来,我们查看一下容器中的数据库
方法一:docker exec进入容器,查看

在容器中使用ip addr命令

方法二:在portainer中,查看该容器的ip

获得了IP还不死心,还要PING一下看看,再用命令连接
mysql -h 172.17.0.3 -u root -p

终于让我给连上了

(以 ID 为 f5605d02f9f5 的 MariaDB 容器为例)

docker exec -it f5605d02f9f5 bash
> root@f5605d02f9f5:/#
# 已经进入容器 f5605d02f9f5 中

root@f5605d02f9f5:/# mysql -u root -p
Enter password: my-secret-pw

> Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 9
Server version: 10.2.8-MariaDB-10.2.8+maria~jessie mariadb.org binary distribution

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]>
# 以 root 身份进入 mysql client

MariaDB [(none)]> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
+--------------------+
3 rows in set (0.00 sec)
# 可以看到数据库内数据库信息

python依赖库安装


于是我来到instock的目录,找到requirements.txt

准备用下面的命令直接升级
python pip install -r requirements.txt --upgrade
但是不幸却遇到错误提示

这次机智的我耐心的询问了DeepSeek,它教我配置 python 指向 python3

如果你希望使用 python 命令而不是 python3,可以通过以下方法配置:
安装 python-is-python3 包,运行以下命令安装 python-is-python3 包:

bash
Copy

sudo apt update
sudo apt install python-is-python3

安装完成后,python 命令将指向 python3。但是。。。

完成这一步后,再安装instock镜像

原命令更新为:

docker run -dit --name InStock --link=InStockDbService \
    -p 9988:9988 \
    -e db_host=InStockDbService \
    instock:latest

遇到错误,这个COPY来的镜像文件可能有问题:

增加DNS试试

docker run -dit --name InStock --link=InStockDbService \
    --dns=8.8.8.8 \
    --dns=8.8.4.4 \
    -p 9988:9988 \
    -e db_host=InStockDbService \
    instock:latest

此路不通,暂且放下不表,刚好看到作者写的另外一条路:

docker run -dit --name InStock \
    -p 9988:9988 \
    -e db_host=localhost \
    -e db_user=root \
    -e db_password=root \
    -e db_database=instockdb \
    -e db_port=3307 \
    instock:latest

看来一定是哪里出了问题

本人是小白,但也不会轻易被困难吓倒,既然下载不了镜像文件,下了别人的镜像文件又挂载不上,那我只能自己上了
直接去github主页上下载zip文件,然后自己打包吧!

自己找一个目录,把zip文件放进去解压,我找的目录是这个:/home/Documents/MyData/Stocks

解压了stock-master.zip这个文件之后,得到目录stock,它下面有docker目录,里面有我们必须的build.sh和Dockerfile

接下来,是豆包教我的。
问:在stock目录下的docker目录里发现了Dockerfile和build.sh,应如何处理才能生成镜像?
豆包答:
若要依据stock目录下docker目录里的Dockerfile和build.sh来生成 Docker 镜像,可按如下步骤操作:

  1. 确认当前所在目录
    首先要保证你当前所在的目录是stock/docker,因为build.sh脚本中的相对路径是基于此目录的。你可以使用以下命令进入该目录:
bash #这一条我没运行,也不知道是干啥的
cd stock/docker
  1. 赋予build.sh脚本执行权限
    在 Linux 或者 macOS 系统中,脚本文件需要有执行权限才能运行。你可以使用chmod命令来赋予脚本执行权限:
bash
`chmod +x build.sh`
  1. 运行build.sh脚本
    运行该脚本就可以开始构建和推送 Docker 镜像,使用以下命令:
bash
./build.sh


看到如图过程就说明它在干了。。。耐心等等

  1. 查看脚本执行过程和结果(自动完成的部分)
    运行脚本之后,你会看到构建和推送镜像的过程信息。脚本中的命令会依次执行以下操作:
    清除旧的stock目录。
    同步stock目录下的文件到当前目录,同时排除一些不需要的文件和目录。
    复制cron目录到当前目录。
    使用docker build命令构建 Docker 镜像,会生成两个标签,一个是当前年月(例如202503),另一个是latest。
    使用docker push命令将构建好的镜像推送到 Docker 镜像仓库。

  2. 检查镜像是否生成成功
    你可以使用以下命令查看本地的 Docker 镜像列表,确认镜像是否已经构建成功:

bash
docker images

如果看到mayanghua/instock镜像,并且有对应的标签(如202503和latest),则说明镜像已经构建成功。

然后,确保刚才建的Mariadb的容器在运行的前提下,如图

再输入命令:

docker run -dit --name InStock --link=InStockDbService \
    -p 9988:9988 \
    -e db_host=InStockDbService \
    mayanghua/instock:latest

出现如下图示,则表示成功。

安装 TA-Lib 共享静态库和头文件

安装 TA-Lib C/C++ 共享静态库和头文件
按作者的指引做就安装好了:
https://ta-lib.org/install/ 下载最新 ta-lib 共享静态库和头文件,按照说明进行安装。
安装方式按官方建议,会更简单:

Windows Executable Installer
macOS Homebrew
Linux Debian packages

系统运行

启动InStock容器后,会自动运行,首先会初始化数据、启动web服务。然后每小时执行“基础数据抓取”,每天17:30执行所有的数据抓取、处理、分析、识别。
打开浏览器,输入:http://localhost:9988/⁠ ,即可使用本系统的可视化功能。
哈哈哈,历经千辛万苦,我终于取到真经!^^

每天运行/历史数据

本程序是根据上一日的历史数据,来抓取、处理、分析、识别、回测,
所以每天打开它之后,到Ubuntu的根目录下,运行下面命令:

docker exec -it InStock bash 
cat InStock/instock/bin/run_job.sh


第二天我打开它,再运行

后续我想把下面这些py文件一一细细研究学习一下
/usr/local/bin/python3 /data/InStock/instock/job/execute_daily_job.py
echo ------整体作业 支持批量作业------
echo 当前时间作业 python execute_daily_job.py
echo 1个时间作业 python execute_daily_job.py 2023-03-01
echo N个时间作业 python execute_daily_job.py 2023-03-01,2023-03-02
echo 区间作业 python execute_daily_job.py 2023-03-01 2023-03-21
echo ------单功能作业 除了创建数据库 其他都支持批量作业------
echo 创建数据库作业 python init_job.py
echo 综合选股作业 python selection_data_daily_job.py
echo 基础数据实时作业 python basic_data_daily_job.py
echo 基础数据收盘2小时后作业 python backtest_data_daily_job.py
echo 基础数据非实时作业 python basic_data_other_daily_job.py
echo 指标数据作业 python indicators_data_daily_job.py
echo K线形态作业 klinepattern_data_daily_job.py
echo 策略数据作业 python strategy_data_daily_job.py
echo 回测数据 python backtest_data_daily_job.py

数据库管理

自从运行容器的时候进入过数据库,到后面一直没进去看过,上次的命令:

docker run --name InStockDbService \
           -p 3307:3307 \
           -e MYSQL_ROOT_PASSWORD=root \
           -v /var/lib/mariadb:/v

这是portainer中容器运行的状态

可为了研究数据,我得再进去看看

可是为啥就连不上了呢?于是机智的我问了问豆包,它是这么回答的:

从你给出的错误信息来看,问题并非出在连接 MariaDB 容器这一步,而是本地 MySQL 客户端在读取配置文件 /etc/mysql/my.cnf 时碰到了问题。下面为你详细分析并提供解决办法:
错误原因分析
错误信息 mysql: [ERROR] Found option without preceding group in config file /etc/mysql/my.cnf at line 22. 表明,在配置文件 /etc/mysql/my.cnf 的第 22 行存在一个没有前置组(例如 [mysql]、[mysqld] 等)的选项。在 MySQL 配置文件里,所有选项都必须归属于某个组,不然客户端就无法正确解析该配置文件。

于是我用了命令:
sudo nano /etc/mysql/my.cnf
把配置文件改成这样(添加了倒数2行的信息):

!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/

[mysqld]
bind-address = 0.0.0.0

然后



真是把人搞的快没脾气了。。。把下面这两个命令运行一下,以便使我的root用户可用

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
FLUSH PRIVILEGES;


然后我就想转到图形界面继续深入研究一下这里的instockdb了
本来是想从windows上访问的,但试了好几次,都不行,可能是因为virtualbox套了Ubuntu, 再装docker再装了mariadb的缘故
我不如直接从ubuntu上查看数据库得了,于是安装了它

我是这么设置的(3307连不上,3306倒是连上了):

功夫不负有心人,终于见到庐山真面目了:

功能解析

execute_daily_job.py

用vs code打开这个文件,再让豆包出来解释一下代码

问题汇总

数据库连接

MySQL数据库连接

发生异常: ModuleNotFoundError
No module named 'mysql'
File "/home/chengjon/Documents/monitor_instock_mariadb", line 1, in
import mysql.connector
ModuleNotFoundError: No module named 'mysql'

去官网下载mysql.connector:https://dev.mysql.com/downloads/repo/apt/
保存到Ubuntu本地,在空白处右键“open in terminal”

运行命令:
sudo dpkg -i mysql-apt-config_0.8.33-1_all.deb


一顿操作猛如虎,弄完之后,ModuleNotFoundError: No module named 'mysql',问题还在,我也是懵了

哦,想起来了,这步弄完,还要执行命令:apt update

弄完也没搞定。。。唉
只好用虚拟环境来解决了(Deepseek告诉我的)

于是照猫画虎:


如果忘了建的虚拟环境咋办?由于在 Linux 系统中,虚拟环境本质上是一个包含 Python 解释器和相关依赖的目录。如果你创建了多个虚拟环境,可以通过以下命令查看和管理它们:

find ~ -name "activate" -type f


或者
sudo find / -type d -name "myenv"

posted on   chengjon  阅读(58)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示