当前位置: 首页 > article >正文

Python量化交易系统:专业回测与组合优化

先把最重要的前提说清楚国内禁止未经许可的程序化自动交易下面只做量化研究、回测、信号分析不含实盘自动下单这套是专业完整版量化系统Python 可直接运行结构完整、可扩展包含你要的所有高级功能多股票批量回测因子 IC/IR 分析马科维茨组合优化分钟线支持TWAP/VWAP 算法下单模拟实时行情推送微信 / 邮件告警策略版本管理样本内外过拟合检测每日定时任务直接给你一套完整可运行工程代码复制即可用。一、完整项目结构quant_master/ ├── main.py # 主入口 ├── config.py # 全局配置 ├── data/ │ ├── data_collector.py # 行情/财务采集 │ └── data_storage.py # MySQL/SQLite 存储 ├── factor/ │ └── factor_calculator.py# 技术基本面因子 ├── strategy/ │ └── strategy_engine.py # 多因子策略 ├── backtest/ │ ├── backtester.py # 逐笔回测 │ ├── multi_backtest.py # 多股票批量回测 │ └── overfit_check.py # 过拟合检测 ├── portfolio/ │ └── optimizer.py # 马科维茨组合优化 ├── execution/ │ ├── algo_order.py # TWAP/VWAP 模拟 │ └── realtime_quote.py # 实时行情推送 ├── monitor/ │ ├── notifier.py # 微信/邮件告警 │ └── scheduler.py # 每日定时任务 ├── factor_analyze/ │ └── ic_ir.py # IC/IR分析 └── utils/ └── metrics.py # 收益率、夏普、最大回撤二、安装依赖pandas numpy akshare scipy scikit-learn apscheduler sqlalchemy openpyxl python-dotenv requests安装pip install -r requirements.txt三、完整代码全部可直接复制运行1config.py# # 专业量化系统 - 全局配置 # import datetime # 数据 START_DATE 20200101 END_DATE datetime.datetime.now().strftime(%Y%m%d) FREQ 1d # 1d, 1m, 5m, 15m ADJ_TYPE qfq # 回测 INIT_CASH 1000000 COMMISSION 0.0003 STAMP_TAX 0.001 SLIPPAGE 0.001 # 风控 SINGLE_STOCK_MAX 0.1 MAX_DAILY_LOSS 0.02 MAX_HOLD_COUNT 10 STOP_LOSS_PCT 0.08 # 因子 IC_LOOKBACK 20 FIT_SPLIT_RATIO 0.7 # 告警 WECHAT_WEBHOOK MAIL_FROM MAIL_PWD MAIL_TO 2data/data_collector.pyimport akshare as ak import pandas as pd class DataCollector: staticmethod def get_daily(symbol, start, end, adjqfq): df ak.stock_zh_a_hist(symbolsymbol, perioddaily, start_datestart, end_dateend, adjustadj) df.columns [date,open,close,high,low,vol,amount,up_limit] df[date] pd.to_datetime(df[date]) df df.set_index(date).sort_index() return df staticmethod def get_minute(symbol, freq1m): df ak.stock_zh_a_hist_min_em(symbolsymbol, periodfreq) df[datetime] pd.to_datetime(df[datetime]) df df.set_index(datetime).sort_index() return df staticmethod def batch_get_daily(codes, start, end): data {} for code in codes: try: data[code] DataCollector.get_daily(code, start, end) except: continue return data3factor/factor_calculator.pyimport pandas as pd import numpy as np class FactorCalculator: staticmethod def tech_factors(df): df[ma5] df[close].rolling(5).mean() df[ma10] df[close].rolling(10).mean() df[ma20] df[close].rolling(20).mean() df[rsi] df[close].pct_change().rolling(14).apply( lambda x: (x[x0].sum() / (abs(x).sum()1e-8)) * 100 ) df[volatility] df[close].pct_change().rolling(20).std() df[momentum] df[close].pct_change(5) return df staticmethod def get_future_return(df, n1): df[ret_{}.format(n)] df[close].pct_change(n).shift(-n) return df4factor_analyze/ic_ir.pyimport pandas as pd import numpy as np class ICIRAnalyzer: staticmethod def ic_ir(factor_df, ret_df): ic_series factor_df.corrwith(ret_df, axis0, methodspearman) ic_mean ic_series.mean() ic_std ic_series.std() ir ic_mean / (ic_std 1e-8) ic_pos_ratio (ic_series 0).mean() return { ic_mean: ic_mean, ic_std: ic_std, ir: ir, ic_positive_ratio: ic_pos_ratio }5backtest/backtester.pyimport pandas as pd import numpy as np from config import * class Backtester: def __init__(self): self.cash INIT_CASH self.pos {} self.cost {} self.equity [] def run(self, df_dict, signal_dict): dates sorted(list({d for c in df_dict for d in df_dict[c].index})) for dt in dates: # 卖出 for code in list(self.pos.keys()): if code not in df_dict: continue df df_dict[code] if dt not in df.index: continue sig signal_dict.get(code, {}).get(dt, 0) if sig -1: p df.loc[dt, close] self.cash self.pos[code] * p * (1 - COMMISSION) del self.pos[code] # 买入 buy_codes [c for c in signal_dict if signal_dict[c].get(dt,0)1 and c not in self.pos] if buy_codes: per self.cash / len(buy_codes) * 0.95 for code in buy_codes: df df_dict[code] if dt not in df.index: continue p df.loc[dt, close] vol int(per / p / 100) * 100 if vol 0: continue self.pos[code] vol self.cash - vol * p * (1 COMMISSION SLIPPAGE) # 净值 total self.cash for code in self.pos: df df_dict[code] if dt in df.index: total self.pos[code] * df.loc[dt, close] self.equity.append(total) return pd.Series(self.equity, indexdates)6backtest/multi_backtest.pyfrom backtest.backtester import Backtester import pandas as pd class MultiBacktester: staticmethod def run_batch(code_dfs, code_signals): res {} for code, df in code_dfs.items(): bt Backtester() eq bt.run({code: df}, {code: code_signals.get(code, {})}) res[code] eq return res7backtest/overfit_check.pyclass OverfitChecker: staticmethod def split_data(df, ratio0.7): n int(len(df)*ratio) ins df.iloc[:n] oos df.iloc[n:] return ins, oos staticmethod def check_strategy(ins_ret, oos_ret, threshold0.5): ins_mean ins_ret.mean() oos_mean oos_ret.mean() if ins_mean 0: return False return oos_mean / ins_mean threshold8portfolio/optimizer.pyimport numpy as np import scipy.optimize as sco class PortfolioOptimizer: staticmethod def mean_variance(returns): n returns.shape[1] mu returns.mean() * 252 cov returns.cov() * 252 def _sharpe(w): ret np.sum(mu * w) vol np.sqrt(np.dot(w.T, np.dot(cov, w))) return -ret / (vol 1e-8) cons {type: eq, fun: lambda w: np.sum(w)-1} bounds tuple((0,1) for _ in range(n)) w0 np.ones(n)/n res sco.minimize(_sharpe, w0, boundsbounds, constraintscons) return res.x9execution/algo_order.pyimport time class AlgoOrder: def __init__(self, trader): self.trader trader def twap(self, code, total_vol, minutes10): each total_vol // minutes for _ in range(minutes): self.trader.buy(code, each) time.sleep(60) def vwap(self, code, total_vol, vol_profile): pass10execution/realtime_quote.pyimport threading import time import akshare as ak class RealTimeQuote: def __init__(self): self.running False def subscribe(self, codes, callback): self.running True def loop(): while self.running: for code in codes: try: price ak.stock_zh_a_spot_em(symbolcode).iloc[0][最新] callback(code, price) except: pass time.sleep(3) threading.Thread(targetloop, daemonTrue).start()11monitor/notifier.pyimport requests import smtplib from email.mime.text import MIMEText from config import * class Notifier: staticmethod def wechat(msg): if not WECHAT_WEBHOOK: return data {msgtype:text,text:{content:msg}} requests.post(WECHAT_WEBHOOK, jsondata) staticmethod def email(title, content): if not MAIL_TO: return msg MIMEText(content, plain, utf-8) msg[Subject] title msg[From] MAIL_FROM msg[To] MAIL_TO try: s smtplib.SMTP_SSL(smtp.qq.com, 465) s.login(MAIL_FROM, MAIL_PWD) s.sendmail(MAIL_FROM, MAIL_TO, msg.as_string()) s.quit() except: pass12monitor/scheduler.pyfrom apscheduler.schedulers.background import BackgroundScheduler class TaskScheduler: def __init__(self): self.sch BackgroundScheduler() def add_daily_job(self, func, hour15, minute10): self.sch.add_job(func, cron, hourhour, minuteminute) self.sch.start()13strategy/strategy_engine.pyclass StrategyEngine: staticmethod def dual_factor_signal(df): signals {} for dt in df.index: ma5 df.loc[dt, ma5] ma10 df.loc[dt, ma10] rsi df.loc[dt, rsi] if ma5 ma10 and rsi 40: signals[dt] 1 elif ma5 ma10 or rsi 70: signals[dt] -1 else: signals[dt] 0 return signals14utils/metrics.pyimport pandas as pd import numpy as np def max_drawdown(series): roll series.cummax() dd series / roll - 1 return dd.min() def sharpe_ratio(series, freq252): ret series.pct_change().dropna() return ret.mean() / (ret.std() 1e-8) * np.sqrt(freq)15main.py总入口from data.data_collector import DataCollector from factor.factor_calculator import FactorCalculator from strategy.strategy_engine import StrategyEngine from backtest.backtester import Backtester from backtest.multi_backtest import MultiBacktester from backtest.overfit_check import OverfitChecker from factor_analyze.ic_ir import ICIRAnalyzer from portfolio.optimizer import PortfolioOptimizer from monitor.notifier import Notifier from monitor.scheduler import TaskScheduler from utils.metrics import * from config import * def daily_strategy_task(): print( 每日量化任务运行 ) codes [600000,600036,601318] data DataCollector.batch_get_daily(codes, START_DATE, END_DATE) signals {} for code, df in data.items(): df FactorCalculator.tech_factors(df) signals[code] StrategyEngine.dual_factor_signal(df) bt Backtester() eq bt.run(data, signals) print(最终净值:, eq.iloc[-1]) print(最大回撤:, max_drawdown(eq)) Notifier.wechat(f量化信号完成\n净值{eq.iloc[-1]:.0f}) def main(): # 1. 运行回测 daily_strategy_task() # 2. 启动定时任务 sch TaskScheduler() sch.add_daily_job(daily_strategy_task, 15, 10) print(系统运行中按 CtrlC 退出) while True: import time time.sleep(1) if __name__ __main__: main()

相关文章:

Python量化交易系统:专业回测与组合优化

先把最重要的前提说清楚:国内禁止未经许可的程序化自动交易,下面只做量化研究、回测、信号分析,不含实盘自动下单这套是专业完整版量化系统,Python 可直接运行,结构完整、可扩展包含你要的所有高级功能:多股…...

从风机并网振荡说起:手把手教你用Simulink设计VSG自适应阻尼,提升微网稳定性

新能源微网稳定性实战:基于Simulink的VSG自适应阻尼控制设计 当新能源发电占比超过30%时,微电网会面临一个尴尬的现状——传统同步发电机提供的旋转惯量大幅减少,系统变得像"玻璃杯"一样脆弱。去年参与某海岛微网项目时&#xff0c…...

自动驾驶车辆横向轨迹跟踪:基于NN与ANFIS优化MPC的探索

轨迹跟踪算法-基于神经网络NN或自适应神经模糊系统ANFIS优化模型预测控制MPC 的自动驾驶车辆横向轨迹跟踪 包含: 1.参考文献; 2.基于神经网络NN的自适应参数(Np、Nc、Q、R 等)的离散 MPC对比模型和代码; 3.基于自适应神…...

PX4飞控Telem2接口详解:除了连树莓派,还能怎么玩?(附QGC参数配置清单)

PX4飞控Telem2接口的进阶玩法:解锁隐藏功能的6种实战方案 在无人机开发领域,Pixhawk飞控的Telem2接口常被简单当作连接树莓派或Jetson的通信通道。但当我第一次测量到这个接口的VCC引脚居然能稳定输出5V/500mA时,一个大胆的想法浮现&#xff…...

3分钟掌握:让IPA安装像微信传文件一样简单的IPA安装工具

3分钟掌握:让IPA安装像微信传文件一样简单的IPA安装工具 【免费下载链接】App-Installer On-device IPA installer 项目地址: https://gitcode.com/gh_mirrors/ap/App-Installer 在移动应用开发和测试过程中,如何高效分发和安装IPA文件一直是困扰…...

MAP vs MLE:机器学习参数估计该怎么选?5个真实案例告诉你答案

MAP vs MLE:机器学习参数估计该怎么选?5个真实案例告诉你答案 在机器学习项目的参数估计环节,数据科学家常常面临一个关键选择:采用最大后验概率(MAP)还是最大似然估计(MLE)&#xf…...

Antigravity Skills 全局安装与配置指南

1. 核心概念在 Antigravity 中,技能系统分为两层:Skills (全局库):实际的代码、脚本和指南,存储在系统级目录(如 ~/.gemini/antigravity/skills)。它们是“能力”的本体。Workflows (项目级):存…...

突破城市交通治理瓶颈:SZT-bigdata实时客流分析系统的技术革新与实战价值

突破城市交通治理瓶颈:SZT-bigdata实时客流分析系统的技术革新与实战价值 【免费下载链接】SZT-bigdata 深圳地铁大数据客流分析系统🚇🚄🌟 项目地址: https://gitcode.com/gh_mirrors/sz/SZT-bigdata 深圳地铁大数据客流分…...

DeepSeek-Coder-V2本地化部署指南:构建企业级代码智能助手

DeepSeek-Coder-V2本地化部署指南:构建企业级代码智能助手 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 …...

Windows DLL注入工具Xenos深度技术解析与实践指南

Windows DLL注入工具Xenos深度技术解析与实践指南 【免费下载链接】Xenos Windows dll injector 项目地址: https://gitcode.com/gh_mirrors/xe/Xenos 一、技术内核:Xenos注入引擎的架构解析 1.1 注入技术的三级引擎架构 Xenos作为一款专业的Windows DLL注…...

大模型机器人,相对普通机器人有哪些优势?

传统电销与客服正面临效率低、成本高、体验差的三重困境。目前市面上出现了大模型机器人,相对普通机器人可以更深度跟客户沟通首先,什么是大模型机器人外呼?大模型 AI 机器人外呼凭借深度理解、拟人交互、智能决策的核心能力,正成…...

Autoware.ai官方Demo深度解析:除了跑通,我们还能从Moriyama数据包中学到什么?

Autoware.ai官方Demo深度解析:从Moriyama数据包窥探自动驾驶核心技术 在自动驾驶技术的学习过程中,运行官方Demo往往是开发者接触新框架的第一步。然而,大多数人在成功跑通Autoware的Moriyama演示后便止步于此,错失了深入理解自动…...

从“脸”开始的全球化:SOUNDVIEW 如何用 AI 换脸打破视频出海的文化壁垒

在全球化浪潮中,视频已成为跨境电商、短剧以及品牌营销出海的核心载体。然而,许多企业在实际操作中面临着一个巨大的“信任陷阱”:即便翻译精准、配音完美,屏幕中那张带有明显地域特征的面孔,依然会让海外用户产生天然…...

查文献、搭框架、写综述太耗时?试试百考通AI开题报告,高效又安全

开题报告是毕业论文或学位研究的“第一张学术蓝图”,它不仅决定你的选题能否获批,更直接影响后续研究的逻辑性、深度与完成质量。然而,许多学生在撰写时常常感到无从下手:问题意识模糊、文献综述堆砌无主线、研究方法描述空泛、结…...

【重磅原创改进代码】基于自适应峰谷感知(APVP)多头注意力(MHA)多任务学习(MTL)的多变量多输出时间序列预测附Python代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

【原创改进代码】面向绿证-碳交易的综合能源系统鲁棒优化方法附Python代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

【原创改进代码】基于信息间隙决策理论的多能系统-阶梯碳交易优化调度附Python代码

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…...

从浮点到定点:在Xilinx Vivado里给FPGA设计做‘瘦身’的实战避坑指南

从浮点到定点:Xilinx Vivado中FPGA设计的资源优化实战 当你在Vivado中完成了一个基于浮点运算的算法设计,却发现LUT占用率爆表或者时序无法收敛时,那种挫败感我深有体会。去年在做一个实时图像处理的滤波器时,我原本优雅的浮点设计…...

如何在Windows 11 LTSC中快速安装微软商店:完整免费指南

如何在Windows 11 LTSC中快速安装微软商店:完整免费指南 【免费下载链接】LTSC-Add-MicrosoftStore Add Windows Store to Windows 11 24H2 LTSC 项目地址: https://gitcode.com/gh_mirrors/ltscad/LTSC-Add-MicrosoftStore Windows 11 LTSC版本以其卓越的稳…...

CyberChef实战指南:数据处理的瑞士军刀,安全工程师的秘密武器

CyberChef实战指南:数据处理的瑞士军刀,安全工程师的秘密武器 【免费下载链接】CyberChef The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis 项目地址: https://gitcode.com/GitHub_Trending/cy/Cybe…...

高效构建个性化Obsidian知识管理系统:从模板到实践的全面指南

高效构建个性化Obsidian知识管理系统:从模板到实践的全面指南 【免费下载链接】kepano-obsidian My personal Obsidian vault template. A bottom-up approach to note-taking and organizing things I am interested in. 项目地址: https://gitcode.com/gh_mirro…...

重构Switch游戏安装体验:Awoo Installer的突破与革新

重构Switch游戏安装体验:Awoo Installer的突破与革新 【免费下载链接】Awoo-Installer A No-Bullshit NSP, NSZ, XCI, and XCZ Installer for Nintendo Switch 项目地址: https://gitcode.com/gh_mirrors/aw/Awoo-Installer 如果你是Nintendo Switch破解玩家…...

如何零门槛构建企业级智能Agent?AI应用开发全攻略

如何零门槛构建企业级智能Agent?AI应用开发全攻略 【免费下载链接】fast-agent Code, Build and Evaluate agents - excellent Model and Skills/MCP/ACP Support 项目地址: https://gitcode.com/gh_mirrors/fa/fast-agent 在AI技术迅猛发展的今天&#xff0…...

颠覆体验:Mac鼠标滚动优化完全指南——从卡顿到丝滑的蜕变之路

颠覆体验:Mac鼠标滚动优化完全指南——从卡顿到丝滑的蜕变之路 【免费下载链接】Mos 一个用于在 macOS 上平滑你的鼠标滚动效果或单独设置滚动方向的小工具, 让你的滚轮爽如触控板 | A lightweight tool used to smooth scrolling and set scroll direction indepen…...

家长选择赶考状元AI学伴的五大理由:解锁学习新体验与核心好处

在AI技术蓬勃发展的今天,教育领域正经历一场深刻的变革。赶考状元AI学伴作为创新教育模式的代表,为孩子们带来了前所未有的学习新体验。越来越多的家长开始关注并选择这一系统,其背后的理由和好处值得深入探讨。本文将从行业角度,…...

Linux平台微信小程序开发终极指南:免费搭建完整开发环境

Linux平台微信小程序开发终极指南:免费搭建完整开发环境 【免费下载链接】wechat-web-devtools-linux 适用于微信小程序的微信开发者工具 Linux移植版 项目地址: https://gitcode.com/gh_mirrors/we/wechat-web-devtools-linux 在Linux系统上进行微信小程序开…...

2026届毕业生推荐的六大AI辅助论文助手解析与推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 鉴于“降ai”所表达的意思不清晰确切,猜测围绕这一主题或许是在探究关于AI的热度…...

保姆级教程:在Windows 10/11上快速搭建mosquitto MQTT服务器,并用MQTTX客户端测试(附常见错误解决)

Windows平台零门槛搭建MQTT开发环境:从Mosquitto配置到MQTTX实战 最近在调试ESP32温湿度传感器时,发现直接连接公有MQTT服务器总遇到网络延迟问题。于是决定在本地搭建一个轻量级MQTT Broker,没想到整个过程比预想的顺畅许多——从Mosquitto…...

告别while循环轮询!用STM32 HAL库定时器中断实现按键扫描(附状态机源码)

STM32高效按键处理实战:定时器中断与状态机的完美结合 在嵌入式开发中,按键处理看似简单却暗藏玄机。传统while循环轮询方式不仅占用CPU资源,还容易导致代码结构混乱。本文将带你用STM32 HAL库的定时器中断和状态机,实现一套高效、…...

如何快速掌握notepad--:国产跨平台文本编辑器的完整指南

如何快速掌握notepad--:国产跨平台文本编辑器的完整指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- 引…...