尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Python进阶教程:19_量化交易 零基础超详细入门教程

Python进阶教程:19_量化交易 零基础超详细入门教程 Python 量化简单说就是用 Python 编程语言 配套工具库自动完成金融数据获取、分析、交易策略开发、历史回测、甚至自动交易的过程。它不是某种神奇的 “赚钱公式”而是一套用程序替代人工盯盘、人工计算、人工决策的工具方法 —— 核心优势是高效、客观、可验证能避免人性的贪婪恐惧带来的决策失误。本文从概念、工具、流程到完整实战案例全程用通俗语言 可运行代码 逐行解释零基础也能理解量化的完整逻辑跑通第一个入门策略。⚠️ 重要风险提示本文所有内容仅为技术学习演示不构成任何投资建议。股市有风险投资需谨慎新手务必先从历史回测练手不要盲目实盘交易。一、先搞懂Python 量化能做什么核心优势1. 通俗类比就像你开奶茶店人工交易 老板自己每天手工算账、手工进货、手工做奶茶效率低、容易累、情绪不好的时候还容易做错Python 量化 买了一套自动化设备 管理系统自动统计销量、自动算进货量、自动做奶茶严格按规则来不会累、不会情绪化2. 核心用途批量数据分析一次性分析几千只股票的历史数据筛选符合条件的标的人工筛选要几天程序几秒搞定策略回测验证用过去几年的历史数据模拟你的买卖规则跑一遍看看过去赚不赚钱、最大亏多少不用真金白银试错自动盯盘交易程序 24 小时监控行情满足条件自动下单不用天天盯盘风险控制严格执行止损、止盈规则避免亏损时舍不得卖、盈利时贪多等人性问题3. 新手最容易有的误区❌ 错误量化 稳赚不赔 ✅ 事实量化只是工具策略本身好不好才决定盈亏差的策略用程序跑只会亏得更快 ❌ 错误量化必须懂复杂的数学、算法 ✅ 事实入门级的均线策略、网格策略只需要基础 Python 简单逻辑就能实现新手也能上手二、新手必备量化核心工具库Python 量化的生态非常成熟不同工具负责不同环节新手先掌握最核心的几个即可不用一次性全学。分类工具库作用新手推荐度数据获取AkShare免费开源的财经数据库股票、基金、期货、宏观数据都能拿不用注册、不用积分新手首选⭐⭐⭐⭐⭐数据获取Tushare数据更全更专业但高级数据需要积分适合进阶⭐⭐⭐数据处理pandas表格数据处理神器算指标、清洗数据、筛选标的全靠它是量化的基础⭐⭐⭐⭐⭐数值计算numpypandas 的底层专门做数值运算处理大规模数据更快⭐⭐⭐⭐可视化matplotlib / mplfinance画收益曲线、K 线图、指标图直观查看策略效果⭐⭐⭐⭐回测框架Backtrader经典本地回测框架功能完整适合本地开发策略⭐⭐⭐在线平台聚宽、米筐、优矿网页端量化平台自带数据、回测环境不用自己搭环境新手入门也可以从这里开始⭐⭐⭐⭐ 新手入门建议先学pandasAkShare手动实现简单策略的回测搞懂底层逻辑再去学专业回测框架。三、量化交易的标准流程不管是简单还是复杂的策略完整的量化流程都分 5 步新手按这个顺序学就不会乱获取数据拿到股票 / 基金的历史行情、基本面数据清洗处理补全缺失值、调整复权、计算技术指标均线、MACD 等制定策略写清楚买卖规则比如什么条件买、什么条件卖历史回测用历史数据模拟运行策略算收益、最大回撤、胜率等指标优化与风控调整参数、加止损止盈、仓位管理降低风险四、实战入门第一个量化策略双均线策略双均线策略是量化入门最经典的策略逻辑简单、容易理解非常适合新手练手。策略原理短期均线比如 5 日均线反映短期价格走势长期均线比如 20 日均线反映长期价格走势金叉买入短期均线从下往上穿过长期均线 → 行情转强买入死叉卖出短期均线从上往下穿过长期均线 → 行情转弱卖出准备工作先安装需要的库打开终端执行pip install akshare pandas matplotlib完整代码 逐段解释我们以贵州茅台股票代码600519为例用 2020-2023 年的日线数据实现 5 日均线 20 日均线的双均线策略并计算策略收益。第 1 步导入库 获取历史行情数据import akshare as ak import pandas as pd import matplotlib.pyplot as plt # 设置中文显示避免画图乱码 plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False # 获取A股单只股票的日线数据 # 参数说明 # symbol股票代码600519是贵州茅台 # period周期daily日线 # start_date/end_date数据起止日期格式YYYYMMDD # adjust复权方式qfq前复权处理过分红拆股后的真实价格回测必须用复权数据 df ak.stock_zh_a_hist( symbol600519, perioddaily, start_date20200101, end_date20231231, adjustqfq ) # 查看数据前5行 print(数据前5行) print(df.head()) print(\n数据列名, df.columns.tolist())代码解释ak.stock_zh_a_hist是 AkShare 专门获取 A 股日线数据的函数免费不用登录前复权股票分红、拆股会导致价格跳空前复权会把历史价格调整成连续可比的价格回测必须用复权数据否则收益计算会错返回的df是 pandas 的 DataFrame 表格包含日期、开盘、收盘、最高、最低、成交量等字段第 2 步数据预处理 计算均线指标# 1. 把日期列转成日期格式设为索引方便后续画图和计算 df[日期] pd.to_datetime(df[日期]) df df.set_index(日期) # 2. 只保留我们需要的收盘价列简化计算策略只用收盘价 df df[[收盘]] df.rename(columns{收盘: close}, inplaceTrue) # 3. 计算5日均线和20日均线 # rolling(5).mean()滚动5天求平均值也就是过去5天收盘价的均值 df[ma5] df[close].rolling(5).mean() df[ma20] df[close].rolling(20).mean() # 查看前30行前19天20日均线是空值因为没有足够的历史数据 print(\n带均线的数据) print(df.head(30))代码解释均线MAMoving Average过去 N 天收盘价的平均值用来平滑价格波动判断趋势方向rolling(5).mean()是 pandas 的滚动计算函数非常适合算各类均线指标是量化最常用的函数之一前 N-1 天的 N 日均线是空值因为没有足够的历史数据属于正常现象第 3 步生成买卖信号核心逻辑金叉昨天 MA5 ≤ 昨天 MA20并且今天 MA5 今天 MA20 → 上穿买入信号死叉昨天 MA5 ≥ 昨天 MA20并且今天 MA5 今天 MA20 → 下穿卖出信号# 1. 新增两列昨天的5日均线、昨天的20日均线 # shift(1) 表示把数据往下挪一行也就是取前一天的值 df[ma5_yesterday] df[ma5].shift(1) df[ma20_yesterday] df[ma20].shift(1) # 2. 生成信号1买入信号-1卖出信号0无信号 df[signal] 0 # 金叉买入信号 df.loc[(df[ma5_yesterday] df[ma20_yesterday]) (df[ma5] df[ma20]), signal] 1 # 死叉卖出信号 df.loc[(df[ma5_yesterday] df[ma20_yesterday]) (df[ma5] df[ma20]), signal] -1 # 查看有信号的日期 print(\n买卖信号日期) print(df[df[signal] ! 0][[close, signal]])代码解释shift(1)是量化里非常重要的函数用来取前一天的数据避免用到 “未来数据”比如不能用今天收盘的均线判断今天的买卖实际交易中收盘后才能算出当天均线第二天才能交易loc[条件, 列名]是 pandas 按条件赋值的标准写法这里的信号是 “收盘后发出”实际交易要第二天才能成交后面计算收益的时候会处理这个细节第 4 步模拟持仓 计算策略收益# 1. 计算持仓状态1持有股票0空仓 # 遇到买入信号就变成持有遇到卖出信号就变成空仓 df[position] 0 position 0 # 初始持仓空仓 for date, row in df.iterrows(): if row[signal] 1: position 1 elif row[signal] -1: position 0 df.loc[date, position] position # 2. 计算股票本身的每日涨跌幅买入持有策略的收益 df[daily_return] df[close].pct_change() # 3. 计算策略的每日收益 # 注意信号是收盘后产生的第二天才持仓所以持仓要往后挪一天shift(1)避免未来函数 df[strategy_return] df[daily_return] * df[position].shift(1) # 4. 计算累计收益从1开始1代表初始本金 df[buy_hold_cum] (1 df[daily_return]).cumprod() df[strategy_cum] (1 df[strategy_return]).cumprod() # 打印最终收益 print(f\n买入持有最终收益{(df[buy_hold_cum].iloc[-1] - 1)*100:.2f}%) print(f双均线策略最终收益{(df[strategy_cum].iloc[-1] - 1)*100:.2f}%)关键解释什么是未来函数这是新手最容易踩的致命坑未来函数回测时用到了 “交易当天还不可能知道的数据”比如用当天收盘价算的均线当天就买入现实中当天的收盘价要收盘才知道均线也要收盘后才能算出来只能第二天开盘交易所以我们用shift(1)把持仓往后挪一天信号第二天才生效这样回测结果才真实可信不然回测收益虚高实盘完全用不了第 5 步可视化结果plt.figure(figsize(12, 6)) # 画收盘价和均线 plt.plot(df[close], label收盘价, colorgray, alpha0.5) plt.plot(df[ma5], label5日均线, colorred) plt.plot(df[ma20], label20日均线, colorblue) # 标记买入点绿色向上箭头 buy_points df[df[signal] 1] plt.scatter(buy_points.index, buy_points[close], marker^, colorgreen, s100, label买入信号) # 标记卖出点红色向下箭头 sell_points df[df[signal] -1] plt.scatter(sell_points.index, sell_points[close], markerv, colorred, s100, label卖出信号) plt.title(贵州茅台 双均线策略回测 (5日20日)) plt.xlabel(日期) plt.ylabel(价格元) plt.legend() plt.grid(alpha0.3) plt.show() # 画收益对比曲线 plt.figure(figsize(12, 5)) plt.plot(df[buy_hold_cum], label买入持有, colorgray) plt.plot(df[strategy_cum], label双均线策略, colorred) plt.title(策略收益对比) plt.xlabel(日期) plt.ylabel(累计净值1初始本金) plt.legend() plt.grid(alpha0.3) plt.show()运行后会弹出两张图第一张价格走势 均线 买卖点可以直观看到什么时候买、什么时候卖第二张策略和买入持有的收益对比能直观看出策略有没有跑赢大盘五、进阶专业回测框架 Backtrader 简介上面的手动回测适合理解原理但真实量化开发会用专门的回测框架它们已经封装好了手续费、滑点、仓位管理、绩效统计等功能不用自己从零写。Backtrader 是最经典的本地回测框架核心特点内置几十种技术指标不用自己算自动处理交易成本、滑点、成交逻辑支持股票、期货、外汇等多品种可以输出完整的绩效报告胜率、盈亏比、最大回撤、夏普比率等极简示例了解即可import backtrader as bt # 定义策略类 class DoubleMAStrategy(bt.Strategy): def __init__(self): # 定义5日和20日均线 self.ma5 bt.indicators.SimpleMovingAverage(self.data.close, period5) self.ma20 bt.indicators.SimpleMovingAverage(self.data.close, period20) def next(self): # 每个交易日执行一次 if not self.position: # 没持仓 if self.ma5[0] self.ma20[0] and self.ma5[-1] self.ma20[-1]: self.buy() # 金叉买入 else: # 有持仓 if self.ma5[0] self.ma20[0] and self.ma5[-1] self.ma20[-1]: self.sell() # 死叉卖出框架会自动帮你处理成交、计算收益、统计绩效比手动写严谨得多新手理解原理后可以深入学习。
返回列表