尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Python量化投资实战:从代码到策略的完整指南

Python量化投资实战:从代码到策略的完整指南 量化投资代码实现与策略开发全解析量化投资作为金融科技当中很重要的一个分支领域, 现在正在通过其自身所具备的强大生态系统来对传统的投资模式进行改变。因为它拥有非常丰富的金融库支撑, 同时还得到了开源社区的强力帮助与支持, 所以它已经自然而然地成为众多量化投资者在进行相关工作时最为优先选择的那一款工具了。本文将从数据是如何获取的这一环节开始讲起再到策略是如何开发的, 接着是回测框架的相关内容, 最后涉及到风险管理的部分, 会系统地对于量化投资核心代码的具体实现情况进行讲解。一、量化投资基础与生态量化投资这个概念, 它主要是依靠数学模型以及算法这些玩意儿去执行交易的决策动作的, 它所涵盖的核心流程通常包括数据的获取、策略的开发、回测的验证以及实际的盘中交易这一系列步骤。它之所以拥有优势, 是因为它具有简洁明快的语法形式, 同时还具备非常强大的数据处理能力, 这就好比是在结构方面的表现一样, 此外它还拥有丰富的量化库作为支持的支撑。可以举这样一个例子来看, 某个特定的库能够以快速的步伐获取股票市场中的数据信息, 而被称为 TA-Lib 的工具则可以提供多达两百多种技术指标进行计算操作的功能, 至于另外一些工具比如说某某或者某某之类的, 它们则是支持完整的策略回测这一过程的。我们来对比一下关键库的功能, 并列举出各个库的名称、核心功能以及其适用的场景。对数据进行清洗, 然后进行时间序列分析。基础数据处理NumPy高性能数值计算进行矩阵里面的那些计算, 还有把各个指标给算出来。进行策略回测的操作, 并且完成相应的可视化展示。中高频策略开发事件驱动回测框架在机构级别的背景下进行策略的验证工作。目前这个系统是可以支持实时交易接口的。就是把程序化交易相关的多个系统, 统统进行集成整合。二、在进行代码实现的这个过程里面, 我们首先要去获取一下市场数据, 然后还得把数据做一下预处理。利用能够进行获取关于股票的历史数据的这一种操作。import yfinance as yf# 获取苹果公司2020-2023年日线数据data yf.download(AAPL, start2020-01-01, end2023-12-31)print(data.head())请提供需要改写的句子。Open High Low Close Adj Close VolumeDate2020-01-02 74.059998 75.150002 73.797997 75.087997 73.690002 338701002020-01-03 74.287998 75.144001 74.125000 74.357998 72.970001 276324002. 把那些乱七八糟的东西清理掉, 并且对特征进行工程处理。import pandas as pd# 计算5日/20日均线data[MA5] data[Close].rolling(5).mean()data[MA20] data[Close].rolling(20).mean()# 添加波动率指标data[Volatility] data[Close].pct_change().rolling(20).std()# 删除缺失值data data.dropna()三、这是一段关于量化策略开发的代码示例, 具体展示的是第一种方法, 也就是使用双均线进行交叉的信号来制定交易策略的那个部分。def dual_moving_avee(data, short_window5, long_window20):signals pd.DataFrame(indexdata.index)signals[signal] 0.0# 计算均线signals[short_mavg] data[Close].rolling(windowshort_window, min_periods1).mean()signals[long_mavg] data[Close].rolling(windowlong_window, min_periods1).mean()# 生成交易信号signals[signal][short_window:] np.where(signals[short_mavg][short_window:] signals[long_mavg][short_window:], 1.0, 0.0)# 生成交易订单signals[positions] signals[signal].diff()return signals# 应用策略signals dual_moving_average(data)print(signals.head(25))2. 均值回归策略实现def mean_reversion(data, lookback20, zscore_threshold2.0):signals pd.DataFrame(indexdata.index)signals[price] data[Close]signals[rolling_mean] signals[price].rolling(lookback).mean()signals[rolling_std] signals[price].rolling(lookback).std()signals[zscore] (signals[price] - signals[rolling_mean]) / signals[rolling_std]# 当zscore低于阈值时买入高于阈值时卖出signals[signal] np.where(signals[zscore] -zscore_threshold, 1.0,np.where(signals[zscore] zscore_threshold, -1.0, 0.0))return signals四、回测框架与性能评估。1. 回测的实现。import backtrader as btclass DualMAStrategy(bt.Strategy):params ((short_period, 5), (long_period, 20),)def __init__(self):self.short_ma bt.indicators.SimpleMovingAverage(self.data.close, periodself.p.short_period)self.long_ma bt.indicators.SimpleMovingAverage(self.data.close, periodself.p.long_period)self.crossover bt.indicators.CrossOver(self.short_ma, self.long_ma)def next(self):if not self.position:if self.crossover 0:self.buy()elif self.crossover 0:self.sell()# 创建回测引擎cerebro bt.Cerebro()data bt.feeds.PandasData(datanamedata)cerebro.adddata(data)cerebro.addstrategy(DualMAStrategy)cerebro.broker.setcash(10000.0)print(初始资金: %.2f % cerebro.broker.getvalue())cerebro.run()print(最终资金: %.2f % cerebro.broker.getvalue())2. 对工作进行考核时, 用来衡量效果的标准。def calculate_performance(signals, data):# 计算持有期收益率data[returns] data[Close].pct_change()data[strategy_returns] signals[signal].shift(1) * data[returns]# 年化收益率annual_return (data[strategy_returns].mean() 1) ** 252 - 1# 夏普比率假设无风险利率为0sharpe_ratio (data[strategy_returns].mean() * 252) / (data[strategy_returns].std() * np.sqrt(252))# 最大回撤cum_returns (1 data[strategy_returns]).cumprod()peak cum_returns.cummax()drawdown (cum_returns - peak) / peakmax_drawdown drawdown.min()return {annual_return: annual_return,sharpe_ratio: sharpe_ratio,max_drawdown: max_drawdown}五、风险管理代码的实现工作, 第一步是先完成止损止盈模块的部分。def apply_risk_management(orders, data, stop_loss0.1, take_profit0.2):for i, order in enumerate(orders):entry_price data[Close].iloc[order[entry_idx]]# 止损逻辑if order[direction] long:stop_price entry_price * (1 - stop_loss)take_price entry_price * (1 take_profit)else:stop_price entry_price * (1 stop_loss)take_price entry_price * (1 - take_profit)# 检查是否触发止损/止盈current_price data[Close].iloc[-1]if (order[direction] long and current_price stop_price) or \(order[direction] short and current_price stop_price):orders[i][exit_type] stop_losselif (order[direction] long and current_price take_price) or \(order[direction] short and current_price take_price):orders[i][exit_type] take_profitreturn orders2. 在进行仓位控制的时候, 需要用到专门的算法。def position_sizing(account_value, risk_per_trade0.02, stock_priceNone, atrNone):基于ATR的仓位控制:param account_value: 账户总价值:param risk_per_trade: 每笔交易风险比例:param stock_price: 股票当前价格:param atr: 平均真实波幅:return: 建议交易股数if atr is None or stock_price is None:return 0risk_amount account_value * risk_per_tradeposition_size int(risk_amount / atr)return position_size六、实盘交易集成的这套方案, 里面包含了第一点, 就是拿一个示例, 来展示如何与券商的API进行对接。import requestsimport jsonclass BrokerAPI:def __init__(self, api_key, api_secret):self.api_key api_keyself.api_secret api_secretself.base_url def place_order(self, symbol, quantity, price, side, order_typelimit):headers {Content-Type: application/json,X-API-KEY: self.api_key}data {symbol: symbol,quantity: quantity,price: price,side: side, # buy or selltype: order_type}response requests.post(f{self.base_url}/orders,headersheaders,datajson.dumps(data))return response.json()# 使用示例broker BrokerAPI(your_api_key, your_api_secret)order_result broker.place_order(symbolAAPL,quantity100,price150.0,sidebuy)print(order_result)七、优化建议和实践指南, 我们要把数据质量放在首位, 使用Tick级的数据来替代日线数据能够提升策略的精度, 但是大家需要注意数据存储的成本。在参数优化技巧方面, 我们可以采用贝叶斯优化方法去替代网格搜索方法, 从而避免出现过拟合问题。关于实盘注意事项中的多因子策略开发部分, 建议结合价值因子包括市盈率、市净率和动量因子包括六个月收益率构建复合策略。此外还有未来发展方向, 比如机器学习集成可以通过使用长短期记忆网络预测价格趋势进而实现因子选股。在高频交易探索领域可以基于用户数据报协议实现微秒级的订单路由功能。最后另类数据的应用可以考虑整合社交媒体情绪数据、卫星图像数据等新型数据源。量化投资的核心意思, 就是说得不停地去改, 还要严格地把风险控制住, 这点非常重要。用了模块化开发这种办法之后, 投资者就能很快地把自己想要的那种策略想法给验证一下, 但是在这过程里需要一直牢记着的一个事情是, 不管是什么样的策略, 在它被放到实际市场里去交易之前, 都得先把它放在历史数据里头好好地测试一遍, 还要用模拟交易这种方式去验证一下, 这样才行。对于刚开始学的人来说, 我建议你是先从那种双均线策略这样简单的策略开始起步的, 一点点地把那些数据怎么处理成可以用样子的、怎么把策略开发出来还有怎么去管好风险管理这几整个流程全部掌握清楚, 最后再做出一个属于你自己的那些量化交易系统来, 这才是比较靠谱的做法。
返回列表