一、前言
1.1 开发背景与定位
在基金定投过程中,许多投资者都会面临"择时"的困扰:" 周四定投好还是周五好? " 、" 每月几号扣款收益最高? "。市面上的通用软件往往只提供简单的收益率查看,缺乏针对不同时间维度的精细化对比。
本系统 " 基金定投策略回测 " 应运而生。它是一个轻量级的Web应用,定位为辅助投资决策工具。它利用历史数据,模拟在不同时间点(周一至周五、每月1-30日)进行定投的收益情况,用数据回答"什么时候买最划算"。
基金定投回测系统演示
1.2 核心优势
- 数据实时准确:直接对接开发免费的基金净值接口,获取最新数据。
- 策略覆盖全面:涵盖日定投、周定投、避雷针策略(特定日不投)、月定投四种模式。
- 智能辅助决策:自动计算并高亮显示每组策略中的**"最佳收益"**,无需人工比对。
- 交互体验极佳:支持前端对收益率、投入成本等字段进行点击排序,快速筛选数据。
1.3 本文用途
- 对于使用者:了解系统各项指标含义,掌握如何寻找最佳定投策略。
- 对于开发者:解析PHP后端数据处理逻辑与前端交互实现,作为轻量级数据分析工具的开发参考。
二、系统概述
2.1 基本信息
- 系统名称:基金定投策略回测
- 开发语言:PHP (7.0+)
- 前端技术:HTML5, CSS3 (Flex/Grid布局),原生 JavaScript (ES6)
- 数据源:外部公开免费的JSON接口
2.2 运行环境
本系统基于B/S架构,兼容性极强:
- 服务器端:任意支持PHP的Web服务器(Apache/Nginx/IIS)。
- 客户端:支持现代浏览器的PC端及移动端(自适应布局)。
2.3 核心架构
系统采用经典的 MVC ( Model-View-Controller ) 的简化变体模式:
1.输入层:用户提交基金代码与回测天数。

2.逻辑层( PHP ):抓取远程数据 -> 清洗数据 -> 遍历策略算法 -> 计算收益。

3.表现层( HTML/JS ):渲染数据表格 -> 标记最佳策略 -> 提供排序交互。

[ 架构示意图 ]

2.4 核心功能总览
| 功能模块 | 描述 |
|---|---|
| 数据获取 | 根据基金代码自动拉取历史净值,支持自定义回测时长(如1年、3年)。 |
| 基准测试 | 计算"每日都买"的收益情况,作为衡量其他策略好坏的基准线。 |
| 周策略对比 | 对比"周一"到"周五"定投的收益差异,找出由于市场效应导致的最佳扣款日。 |
| 避雷针策略 | 独创策略,模拟"除了周X,其他四天都买",用于规避"黑色星期X"。 |
| 月定投扫描 | 扫描每月1号至30号的收益率,寻找月中最佳扣款日。 |
| 智能排序 | 前端支持按"收益率"、"总投入"等字段正序/倒序排列。 |
三、系统功能详细说明
本章节将结合源代码,深入解析系统的四大核心模块。
3.1 数据获取与预处理模块
这是系统的基础。系统通过HTTP请求获取基金的JSON格式净值数据,并按日期进行清洗和截取。
功能逻辑:
- 接收用户POST提交的基金代码和天数。
- 构建API URL,使用file_get_contents抓取数据。
- 使用正则解析JSON,并按日期排序。
- 根据设定的回测天数,过滤掉过早的数据。
3.2 核心算法:定投收益计算器
为了复用代码,系统封装了一个通用的计算函数 calculate_profit。
算法原理:
- 定投原理:金额固定,份额 = 金额 / 当日净值。
- 高阶函数:利用PHP的闭包(Closure)$condition_func 来决定某一天是否扣款。这使得同一个函数可以计算周一投、每月5号投等各种情况。
核心代码解析:
php
/**
* 通用定投计算函数
* @param array $data 历史净值数组
* @param callable $condition_func 条件判断闭包函数 (传入时间戳,返回true则买入)
* @param float $amount 单次定投金额
* @param float $final_nav 期末净值(用于计算最终市值)
*/
function calculate_profit($data, $condition_func, $amount, $final_nav) {
$total_cost = 0;
$total_shares = 0;
foreach ($data as $day) {
// 调用闭包判断今天是否符合买入策略(例如:是否是周一?)
if ($condition_func($day['timestamp'], $day['date'])) {
$total_cost += $amount; // 累加投入本金
$total_shares += $amount / $day['nav']; // 累加获得份额
}
}
// 计算最终市值与收益
$val = $total_shares * $final_nav;
$profit = $val - $total_cost;
return [
'cost' => $total_cost,
'profit' => $profit,
'yield' => ($profit / $total_cost) * 100 // 收益率百分比
];
}
3.3 策略生成与最佳策略高亮
系统通过循环生成不同的策略条件,并自动识别哪一种策略收益最高。
功能展示:
系统会自动在表格中为收益率最高的一行添加黄色背景和"最佳"标签。
实现逻辑:
- 周策略:循环1-5(代表周一到周五),生成对应的闭包函数。
- 月策略:循环1-30,生成对应日期的闭包。
- 比较:使用 array_column 和 max 函数找出数组中的最大收益率,并在前端渲染时进行比对。
核心代码解析:
php
// 定义周一到周五的映射
$week_map = [1 => '周一', 2 => '周二', ...];
foreach ($week_map as $i => $n) {
// 策略A:仅周几买入
// date('N', $ts) 返回 1-7 (ISO-8601)
$res_weekly[$n] = calculate_profit($analysis_data, function($ts) use ($i) {
return date('N', $ts) == $i;
}, ...);
}
// 寻找最大收益率,用于前端高亮
function get_max_yield($arr) {
if (empty($arr)) return -999;
return max(array_column($arr, 'yield'));
}
$max_weekly = get_max_yield($res_weekly);
3.4 前端交互与可视化
为了让枯燥的数据表格更易读,系统在前端进行了精细化设计。
特色功能:
- 状态着色:使用CSS变量定义盈亏颜色(--win: #d93025 红色代表盈利,--loss 绿色代表亏损,符合A股习惯)。
- 交互排序:原生的JavaScript实现了点击表头排序功能,支持数值和中文字符串排序。
界面截图示意:

表头带有 ↕ 图标。
"周四"行背景为淡黄色,且标记有红色"最佳"字样。
收益率列:正收益显示红色,负收益显示绿色。
四、总结与后续优化
本文总结:
本系统通过简练的代码实现了一个功能完整的量化回测工具。它展示了如何将后端的数据处理能力与前端的交互体验相结合,解决实际生活中的投资决策问题。
下一步优化建议:
- 增加图表:引入 ECharts 或 Chart.js,绘制资金曲线图,直观展示波动。
- 多基金对比:允许同时输入多个基金代码,横向对比同类基金的定投效果。
- 定投金额策略:目前是固定金额(定期定额),可升级为"定期不定额"(低位多买,高位少买)的价值平均策略。
通过掌握本系统,您不仅获得了一个实用的投资工具,更深入理解了Web全栈开发中数据处理与交互设计的核心流程。
项目完整代码:下载地址
优惠下载(一折) :关注+回复关键字:基金回测
