感谢你对 KHunter 项目的关注!我们欢迎各种形式的贡献。
如果你发现了Bug,请通过以下方式报告:
- 创建Issue: 在GitHub上创建新Issue,描述:
- Bug的具体表现
- 复现步骤
- 预期行为 vs 实际行为
- 系统环境(OS、Python版本等)
- 相关日志或错误信息
- 在GitHub上创建Issue,标题以
[Feature Request]开头 - 详细描述功能的用途和预期效果
- 提供使用场景示例
- Fork 项目到你的账户
- Clone 你的Fork:
git clone https://github.com/YOUR_USERNAME/khunter.git cd khunter - 创建特性分支:
git checkout -b feature/your-feature-name
代码风格
- 遵循 PEP 8 规范
- 使用 4 个空格缩进
- 最大行长 100 字符
- 使用有意义的变量名和函数名
注释规范
- 函数级注释:每个函数都要有docstring
- 代码注释:每5行代码至少有一条注释
- 中文注释:使用简体中文
示例:
def calculate_kdj(df, period=9):
"""
计算KDJ指标
Args:
df: 包含OHLC数据的DataFrame
period: KDJ周期,默认9
Returns:
DataFrame: 添加了K、D、J列的数据框
"""
# 计算最高价和最低价
high = df['high'].rolling(window=period).max()
low = df['low'].rolling(window=period).min()
# 计算RSV值
rsv = (df['close'] - low) / (high - low) * 100
# 计算K、D、J值
# ...
return df测试规范
- 为新功能编写单元测试
- 测试覆盖率不低于 80%
- 所有测试必须通过
-
提交代码:
git add . git commit -m "feat: 添加新功能描述"
-
推送到你的Fork:
git push origin feature/your-feature-name
-
创建Pull Request:
- 在GitHub上创建PR
- 标题清晰简洁
- 描述包含:
- 功能说明
- 相关Issue编号(如
Fixes #123) - 测试说明
- 截图或演示(如适用)
使用以下格式:
<type>(<scope>): <subject>
<body>
<footer>
Type 类型:
feat: 新功能fix: Bug修复docs: 文档更新style: 代码风格调整refactor: 代码重构perf: 性能优化test: 测试相关chore: 构建、依赖等
示例:
feat(strategy): 添加新的选股策略
- 实现了基于MACD的选股逻辑
- 添加了参数配置
- 编写了单元测试
Fixes #123
- 修复文档中的错误或不清楚的地方
- 添加使用示例
- 翻译文档到其他语言
- 改进README或其他文档
所有PR都会经过代码审查,审查内容包括:
- ✅ 代码质量和风格
- ✅ 功能完整性和正确性
- ✅ 测试覆盖率
- ✅ 文档完整性
- ✅ 向后兼容性
khunter/
├── strategy/ # 策略模块
│ ├── base_strategy.py # 策略基类
│ ├── *.py # 具体策略实现
│ └── strategy_registry.py # 策略注册器
├── utils/ # 工具模块
│ ├── akshare_fetcher.py # 数据获取
│ ├── technical.py # 技术指标
│ └── *.py # 其他工具
├── web/ # Web前端
│ ├── templates/ # HTML模板
│ └── static/ # 静态资源
├── config/ # 配置文件
├── test/ # 测试文件
├── doc/ # 文档
├── main.py # 主程序
├── web_server.py # Web服务器
└── requirements.txt # 依赖列表
# 运行所有测试
pytest
# 运行特定测试文件
pytest test/test_strategy.py
# 运行特定测试函数
pytest test/test_strategy.py::test_bowl_rebound
# 显示覆盖率
pytest --cov=strategy --cov=utils测试文件放在 test/ 目录,命名规范:test_*.py
import pytest
from strategy.bowl_rebound import BowlReboundStrategy
class TestBowlReboundStrategy:
"""碗口反弹策略测试"""
def setup_method(self):
"""测试前准备"""
self.strategy = BowlReboundStrategy()
def test_calculate_indicators(self):
"""测试指标计算"""
# 准备测试数据
df = self.prepare_test_data()
# 执行计算
result = self.strategy.calculate_indicators(df)
# 验证结果
assert 'K' in result.columns
assert 'D' in result.columns
assert 'J' in result.columns
def prepare_test_data(self):
"""准备测试数据"""
# ...
pass- 清晰的项目描述
- 快速开始指南
- 功能列表
- 技术栈
- 项目结构
- 使用示例
- 模块级注释:文件顶部说明模块用途
- 类级注释:说明类的用途和主要方法
- 函数级注释:使用docstring说明参数和返回值
- 行级注释:解释复杂逻辑
在 CHANGELOG.md 中记录每个版本的变更:
## [1.0.0] - 2026-03-01
### Added
- 新增功能1
- 新增功能2
### Changed
- 修改功能1
- 修改功能2
### Fixed
- 修复Bug1
- 修复Bug2
### Deprecated
- 废弃功能1- 更新版本号(遵循 Semantic Versioning)
- 更新 CHANGELOG.md
- 创建Git标签:
git tag v1.0.0 - 推送标签:
git push origin v1.0.0 - 在GitHub上创建Release
- GitHub Issues: 用于Bug报告和功能建议
- GitHub Discussions: 用于一般讨论和问题解答
- Pull Requests: 用于代码贡献
- 📧 Email: [项目维护者邮箱]
- 💬 GitHub Issues: [项目地址]/issues
- 🌐 项目主页: [项目地址]
感谢所有为项目做出贡献的人!
最后更新: 2026-03-26