前面讲了量化所需要的量化数据,有了量化数据后就可以编写相关的量化策略。量化策略的编写没有想的那么复杂,几十行代码就能完成相关的策略编写,然后对量化策略的编写产生了初步的认识和信心。
下面是经典的双均线策略示例:使用免费开源数据*** adata*** 和回测框架 backtrader完成。
示例代码
python 3.11 或 3.6+
pandas==2.2.2
adata==2.1.0
backtrader==1.9.78.123
matplotlib==3.9.0
ma_strategy.py
# -*- coding: utf-8 -*-
"""
@desc: 均线策略
@author: 公众号:向阳花策略
"""
import adata
import backtrader as bt
import pandas as pd
class MaCrossStrategy(bt.Strategy):
def __init__(self):
# 初始化的时候,可以把常用的数据放在这里,这样在next函数中就可以直接使用
self.k_line = get_market_data_by_code(stock_code='601838')
data = self.k_line
data['ma3'] = data['volume'].rolling(window=3).mean()
data['ma5'] = data['volume'].rolling(window=5).mean()
data['ma20'] = data['volume'].rolling(window=20).mean()
# 信号计算:这里的买卖信号标准,可以根据自己的研究进行替换。
# 买入条件:3日线 上穿 5日线买入;卖出条件:5日线 下穿 20日线卖出
data["buy"] = (data['ma3'] > data['ma5']) & (data['ma3'].shift(1) < data['ma5'].shift(1))
data["sell"] = (data['ma5'] < data['ma20']) & (data['ma5'].shift(1) > data['ma20'].shift(1))
def next(self):
# 对买入卖出信号判断,进行相关交易。这里也可进行改进加入更多的限制条件。
datetime_str = self.data.datetime.datetime()
if self.k_line.loc[datetime_str]['buy']:
self.buy()
elif self.k_line.loc[datetime_str]['sell']:
self.sell()
def get_market_data_by_code(stock_code='601838'):
"""需要把数据格式,整理成 backtest 的格式"""
# 通过adata获取对应股票的日k数据
df = adata.stock.market.get_market(stock_code=stock_code)
numeric_columns = ['low', 'high', 'open', 'close', 'volume']
df[numeric_columns] = df[numeric_columns].apply(pd.to_numeric, errors='coerce')
df['datetime'] = pd.to_datetime(df['trade_date'], format='%Y-%m-%d')
df = df[['open', 'high', 'low', 'close', 'volume', 'datetime']]
df.reset_index(drop=True, inplace=True)
df.index = pd.to_datetime(df['datetime'])
return df
if __name__ == '__main__':
cerebro = bt.Cerebro()
# 1.设置回测参数,设置初始资金,设置手续费
cerebro.broker.setcash(100000000.0)
cerebro.broker.setcommission(commission=0.0001)
# 2.获取示例股票的数据:601838的日k数据
k_line = get_market_data_by_code(stock_code='601838')
k_line = k_line.loc[k_line['datetime'] > '2023-01-01']
k_line = bt.feeds.PandasData(dataname=k_line)
cerebro.adddata(k_line, name="成都银行")
# 3. 添加策略
cerebro.addstrategy(MaCrossStrategy)
# 4. 运行回测
print(f"初始资金:{cerebro.broker.getvalue()}")
cerebro.run()
print(f"最终总资产:{cerebro.broker.getvalue()}")
# 5. 可视化回测结果
cerebro.plot(style='candlestick', yscale='log', overlay=False)
代码的编写并没有使用backtrader框架太多的功能,数据的准备和信号的计算都是自己实现,这样灵活性、可扩展性和移植性会更高,方便迁移到别的平台。 当然你如果有了实盘的量化平台,这里的代码部分可以直接跳过,毕竟实盘的量化平台功能更齐全、更强大。
入门量化策略的核心逻辑
作为新手入门量化交易,最重要的是标准化、具体化和数据化,需要把以前的相关理论或者交易依据描述出来。比如突破买入,破位卖出的依据是什么?什么是突破?是价格大于之前的某一个高点价格,还是大于自己定的具体的某个价格?突破需要考虑交易量么?破位又是什么?是价格低于既定的某个具体的价格?还是动态的均线价格?是盘中达到就卖出?还是收盘的时候才卖出?卖出是市价成交?还是固定价格挂单??????
这所有模糊的地方都需要具体化,对于量化编程而言就需要用具体计算的数据和逻辑判断进行编程描述,只有这样才能编写出相关的策略。
策略的适用性
双均线策略本质是趋势策略、长线交易。适用于:趋势交易,一路上涨或者一路下跌的行情。
不适用:震荡行情,震荡行情的均线基本都是粘合的,会频繁产生错误的交易信号,进行高买低卖交易;波浪形的趋势行情,行情大起大落,振幅巨大,价格反复在均线上下大幅波动,同时产生的买卖点误差较大,典型的追涨杀跌交易。
策略优化方向
- 信号过滤器:利用其它相关指标(MACD,RSI ......)进行判断,适当减少假信号。
- 仓位管理:利用不同的仓位策略提升盈亏比,震荡的时候少亏点,趋势的时候多赚点。
- 股票池筛选:找到适合趋势交易的标的,通常情况下业绩良好的标的更适合一些。
关于优化,这里简单的提了几点,只是提供相应的方向,不做具体的指导,同时策略的优化并不是越多越好,过度优化可能会得到负反馈,并不能达到预期效果,只有不断的对策略进行回测,通过回测结果,找到最优的策略,然后再进行实盘验证。
最后再次展示这个流程,量化策略不是一直有效,需要不断的循环迭代优化,才能在这个市场得到。
PS:本文相关策略和股票标的,只做分享学习使用,不做推荐和实盘的买卖依据。股市有风险,入市需谨慎。
了解了量化策略编写后,量化交易入门又进了一步,已完成三分之二,还剩下实盘交易的测试部分。
向阳花策略换一种新的方式;简单的,快速的,通俗易懂的,更规范化的;拨开量化,开启你的量化人生。
8篇原创内容
公众号