Python中一个量化交易策略的常见结构是怎样的?

一个量化交易策略的常见结构

很多人读了巴菲特、索罗斯、道氏理论、波浪理论、江恩理论之后,都感觉很有道理。

怎么实践起来呢,究竟听谁的?

不用很纠结,在量化交易平台,可以很轻松的验证自己的想法。

一个交易策略,就是指一个交易的想法, idea ,逻辑,付诸于代码,让机器去自动执行,就这么简单。

这里描述一种经典的交易策略结构,总共分四个部分。

1 )选择想要交易的股票

你可以选择你喜爱的股票,家乡的股票,看好的股票;

也可以根据一些经典技术指标计算出一些指标;

也可以根据股票的财务数据来筛选,比如我只选中小盘股票;

或者按行业,我只选白酒股,因为哥哥爱喝。

这里用上次提到的选股技术,选出 SMA/MAX 比值,适中的股票,也即选择强势股,同时抛弃涨得差不多到头的股票。

2)选择时机入场

我们买股票的目的抽象为极限就是低买高卖,所以我们想低位买进,这样我们才可以高位卖出。

怎样低位买进,也可以借助一些自己熟悉的技术指标。

这里使用 KDJ 指标入场。

3 )指定止损、止盈策略

止盈止损策略,你可以选择分钟级别的指标,毕竟根据以往很多次的经验, A 股暴涨暴跌,一顿饭的功夫没准就跌停了。

这里使用分钟动态止损,价格跌破 120 日分钟线止损(止盈)。

4 )制定调仓周期

毕竟天天调仓光给券商交手续费了。这里设定的是一个月一调整。

毕竟公众号不是咱们研习代码的地方,以上逻辑看管清楚就好了。还是感觉下镭矿下这么复杂的逻辑,看看核心代码长啥样。

镭矿 raquant 还是挺棒的,上面这么复杂的逻辑涉及到 4 个技术指标,还是很少的代码能够完成。

只是为了示意整个交易策略的结构啊,所以小编写这个策略没咋用心,但看收益还是明显强于基准。

用量化平台构建交易策略,最典型的结构,包含哪四个部分?跟我复习一下:

a.选择想要交易的股票

b.选择时机入场

c.指定止损、止盈策略

d.制定调仓周期

如果你真的是程序员,欢迎去镭矿论坛看看一起探讨研究。

扫描二维码,关注微信公众号,获取更多量化故事。登陆镭矿,即可获取策略编写教程和数千个经典策略代码

『 RaQuant 镭矿』是一个集量化交易策略的学习、研究、开发、交易于一体的强大平台。致力于帮助有简单编程基础或投资基础的投资者快速入门,并可以高效的开发量化交易策略,帮助投资者进行更有效的分析决策。

Raquant.com,镭矿,全新量化投资平台拥有自带的一系列拷贝即可使用的策略,在镭矿平台编写 5 个以上策略可拥有申请策略实盘的权利。快来试试吧!


Python中一个量化交易策略的常见结构是怎样的?

2 回复

一个典型的量化交易策略代码结构可以这样组织:

import pandas as pd
import numpy as np
from datetime import datetime

class TradingStrategy:
    def __init__(self, initial_capital=100000):
        self.initial_capital = initial_capital
        self.positions = 0
        self.cash = initial_capital
        self.portfolio_value = initial_capital
        self.trade_history = []
    
    def calculate_indicators(self, data):
        """计算技术指标"""
        # 示例:简单移动平均
        data['SMA_20'] = data['close'].rolling(window=20).mean()
        data['SMA_50'] = data['close'].rolling(window=50).mean()
        return data
    
    def generate_signals(self, data):
        """生成交易信号"""
        signals = pd.DataFrame(index=data.index)
        signals['signal'] = 0
        
        # 金叉买入,死叉卖出
        signals.loc[data['SMA_20'] > data['SMA_50'], 'signal'] = 1
        signals.loc[data['SMA_20'] < data['SMA_50'], 'signal'] = -1
        
        return signals
    
    def execute_trades(self, current_price, signal, date):
        """执行交易逻辑"""
        if signal == 1 and self.positions == 0:  # 买入信号且空仓
            shares_to_buy = self.cash // current_price
            if shares_to_buy > 0:
                cost = shares_to_buy * current_price
                self.positions = shares_to_buy
                self.cash -= cost
                self.trade_history.append({
                    'date': date,
                    'action': 'BUY',
                    'price': current_price,
                    'shares': shares_to_buy
                })
                
        elif signal == -1 and self.positions > 0:  # 卖出信号且持仓
            proceeds = self.positions * current_price
            self.cash += proceeds
            self.trade_history.append({
                'date': date,
                'action': 'SELL',
                'price': current_price,
                'shares': self.positions
            })
            self.positions = 0
    
    def run_backtest(self, price_data):
        """运行回测"""
        data_with_indicators = self.calculate_indicators(price_data.copy())
        signals = self.generate_signals(data_with_indicators)
        
        for i in range(len(price_data)):
            if i < 50:  # 确保有足够数据计算指标
                continue
                
            current_price = price_data.iloc[i]['close']
            signal = signals.iloc[i]['signal']
            date = price_data.index[i]
            
            self.execute_trades(current_price, signal, date)
            
            # 更新投资组合价值
            self.portfolio_value = self.cash + self.positions * current_price
        
        return self.get_results()
    
    def get_results(self):
        """获取回测结果"""
        total_return = (self.portfolio_value - self.initial_capital) / self.initial_capital * 100
        return {
            'initial_capital': self.initial_capital,
            'final_portfolio': self.portfolio_value,
            'total_return': total_return,
            'cash': self.cash,
            'positions': self.positions,
            'trade_count': len(self.trade_history)
        }

# 使用示例
if __name__ == "__main__":
    # 模拟价格数据
    dates = pd.date_range('2023-01-01', periods=200, freq='D')
    np.random.seed(42)
    prices = 100 + np.cumsum(np.random.randn(200) * 2)
    
    price_data = pd.DataFrame({
        'close': prices
    }, index=dates)
    
    # 运行策略
    strategy = TradingStrategy(initial_capital=100000)
    results = strategy.run_backtest(price_data)
    
    print("回测结果:")
    for key, value in results.items():
        print(f"{key}: {value}")

这个结构包含了策略的核心组件:数据预处理、指标计算、信号生成、交易执行和回测框架。实际应用中还需要添加风险管理、手续费计算等模块。

总结:核心就是数据、信号、执行、回测四个模块。


这是什么鬼。。。

回到顶部