这种方式无需自建后端数据库,直接通过前端(或脚本)调用公开接口获取数据,适合轻量级基金分析工具的快速实现。
//我想把那理由,移动到原本显示操作建议(右边的那个地方),然后理由。以及,我记录备注的按钮在checkbox下面,点击复选框和记录按钮现在分开来。不需要跳出操作类型啥的,让我直接打字,当作我操作的思考即可,然后上面要有个清除操作记录的按钮,方便下次记录。当日如果没删除,点击就还可以再看到我的备注记录,可以更改。
1.脚本根据提供基金名,进行模糊搜索,并匹配得到基金代码。 //基金代码_未匹配候选项.csv(未匹配项 + difflib 给出的候选名称与相似度,方便人工选定) 有相似度阈值,先返回,人工确认 2.同向涨跌幅,连续n天,超过x%,则触发交易信号
自动规则计算信号强度(简单实用)
根据涨跌幅的绝对值或连续涨跌的程度,自动生成一个 0~1 的强度数值。 比如:
strength = min(1.0, abs(consecutive_change_pct) / 10)
如果连续涨跌 10% 以上就算强度满格(1.0), 涨跌 3% 就是 0.3,涨跌 6% 就是 0.6。
你的意思是:
连续方向判定不是单纯看最后一天,而是看最近 5 天里“多数天”的方向。
如果出现持平(涨跌为 0),就不算入统计天数,但不改变方向判断。
例如,最近 4 天涨跌:[-1.0, -0.5, 0.0, -0.8]
跌 3 天,平 1 天 → 方向判定为 跌
连续天数统计时,零天不算入连续计数,但不改变方向。
可以这样改逻辑:
统计最近 5 天的涨跌(不包括零天)。
判断方向:
recent_history = [delta for delta in history[-5:] if delta != 0] if not recent_history: direction = 0 else: pos_count = sum(1 for x in recent_history if x > 0) neg_count = sum(1 for x in recent_history if x < 0) direction = 1 if pos_count >= neg_count else -1
计算连续天数:
从最近一天开始往前,只要方向和 direction 一致,就累加天数。
零天直接跳过。
示例
//连续同向天数 根据多数方向判定,从最近一天开始统计,零天不计入
假设最近 5 天涨跌:
history = [-1.0, -0.5, 0.0, -0.8, 0.3] # 最近一天在最后
最近 5 天非零:[-1.0, -0.5, -0.8, 0.3]
统计方向:跌 3 天,涨 1 天 → 方向 = 跌
连续天数从最后一天往前:
0.3 → 与方向不符,连续中断
前面 0.0 → 跳过
-0.8 → 符合 → count = 1
-0.5 → 符合 → count = 2
-1.0 → 符合 → count = 3
最终:连续跌 3 天,方向 = 跌。
3.数据获取 api,获取当日
原来的方式 history = fetch_history(code, days=20) + [daily_change_pct]
fetch_history 用天天基金 API 获取最近 N 天净值涨跌(接口可能不稳定,或者返回空)
然后 强行在末尾加上 daily_change_pct(来自 fundgz 或 eastmoney)
问题:
如果今天 fundgz 数据没更新,今天涨跌就算 0
连续统计结果直接受今天数据影响 → 所以你看到连续天数永远是 1 或 0
历史抓取的天数多也没用,因为连续统计总是被末尾的今天数据覆盖
2️⃣ 现在的方式 history = fetch_history_nav(code, days=5) daily_change_pct = fetch_today_change(code) # fundgz 或 eastmoney
历史净值抓最近 5 个交易日的涨跌百分比,不加今天的数据
今日涨跌单独用 fundgz API 或 eastmoney API 获取
连续统计可以选择是否包含今天:
如果今天有数据 → 就把今日涨跌加到历史列表末尾计算连续
如果今天还没数据 → 只用历史连续统计到昨天
优点:
历史连续计算不被今天数据干扰
今天数据独立,真实可靠
连续天数统计更稳健
4.没抓到到数据,要先测试
5.它显示的排序逻辑有问题。先看超不超,超了再按单日涨跌从大到小,再按连续的涨跌大小一次排序。只展示超了的基金 6.我的需求,中间不显示连续天数,总共显示的基金都是超阈值的,先显示单日上涨超阈值,再显示连续的超阈值。右边数字可以标红色 7.运行
source venv/bin/activate # 激活后终端应显示 (venv)
(venv) ➜ trade git:(main) python3 app.py
8.如果你的需求中没有数据库操作(比如不需要存储数据、读取本地数据库文件等),且原本后端的逻辑仅涉及数据请求、简单计算、数据处理等功能,那么完全可以把后端代码迁移到前端(JavaScript)中,实现 “无后端依赖” 的效果。 具体来说,满足以下条件时,适合迁移到纯前端: 无数据库交互:不需要读写 MySQL、SQLite、MongoDB 等数据库(包括本地文件型数据库)。 逻辑可被前端实现:后端代码主要做这些事: 调用公开的第三方 API(如天气、股票等公开接口)。 对数据进行简单计算、过滤、格式化(如统计、排序、转换格式)。 处理前端传递的参数并返回结果(无复杂业务逻辑)。 无敏感操作:不需要处理用户登录、权限验证、加密解密等必须在后端完成的安全相关逻辑。
9.方法 A:部署到服务器/云端,让服务一直运行
把代码部署到一台服务器(例如你自己的 VPS、或云服务如 AWS EC2、DigitalOcean、阿里云等)
在服务器上启动服务(比如 python app.py 或 flask run)并确保它一直在后台运行(用 nohup、systemd、pm2、supervisor 等进程管理工具)
配置域名或 IP,让用户访问这个地址即可,不需要每次手动启动。
优点:用户直接访问网页就看到;缺点:需要服务器、网络、运维成本。
方法 B:在本地电脑让服务开机启动
如果只是你自己使用,在本机就可以设置“开机启动”或“服务自动启动”:
在 Linux/Ubuntu 上你可以写一个 systemd 服务,或者在 ~/.bashrc、cron @reboot 等中启动 app.py。
在 Windows 上可以用 “任务计划程序” 在登录时运行 python app.py。
然后你访问 localhost:端口 即可。
但这种方式只适合你自己使用,不适合别人从外网访问。
方法 C:用容器 + PaaS(平台即服务)部署
把应用做成 Docker 容器,然后用 Heroku、Render、Railway、Fly.io 等平台部署。
这些平台支持 “自动部署 + 持续运行” 的模式。
你只要 push 代码,配置好环境和启动命令(如 python app.py),PaaS 会帮你保持线上服务。
这样用户访问网站时,服务已在后台运行。比较省运维。
我给你的建议(适合你这种刚起步的小项目)
你说你是大一学生、电子信息工程专业、做一个轻量项目。我建议你从 “方法 C” 开始比较好:
先把项目改造为 “启动命令可在环境变量里配置”;
在 GitHub 上配置一个 CI/CD(或手工)把代码推到 Render/Heroku 之类平台;
配置自动 “启动命令” 和 “端口” 信息;
之后你打开网址就能看到你的网页,无需手动在终端运行。 这样你以后展示项目给别人时更稳、更专业。
//前端后端本质就是客户端和服务器,客户端从服务器那里获取数据。所以,app.py 也是启动服务器的意思。
后端(app.py): 定义了多个 API 路由(如/api/funds、/api/funds/signals等) 这些路由通过调用success.py中的函数(如fetch_fundgz、generate_signal等)获取基金数据并进行处理 最后通过jsonify()方法将处理后的字典数据转换为 JSON 格式返回给前端 python 运行
@app.route("/api/funds/signals") def get_all_signals(): results = [] for fund in success.FUNDS: # 处理数据... results.append({ "date": today, "code": code, "name": name, "daily_change_pct": daily_change_pct, # 其他字段... }) return jsonify(results) # 返回JSON数据给前端 前端(HTML 中的 JavaScript): 通过fetch()函数请求后端 API 接口 接收 JSON 格式的响应数据后,渲染到页面中 javascript 运行 // 示例:前端获取并渲染数据 fetch('/api/funds/signals') .then(response => response.json()) .then(data => { allFunds = data; renderFundList(data); // 渲染到页面 }) 2. 必须运行app.py的原因 app.py是整个 Flask 应用的入口文件,其作用包括: 初始化 Flask 应用实例 定义前端页面路由(如/对应首页)和 API 接口路由 启动 Web 服务器(默认在5000端口) 只有运行app.py,才能启动后端服务,此时: 前端页面(如index.html)才能通过浏览器访问 前端的fetch()请求才能被后端接口接收并处理 基金数据才能从后端传递到前端展示