Python函数在量化策略中的运用

原创 2017-11-24 mindgo MindGo 量化平台

关注 MindGo 量化平台微信公众号,获取量化投资教材视频

读懂量化策略的运行机制,只需要看懂这四个 Python 函数!

一般而言,量化策略的运行机制:1.账户➔2.时间➔3.数据获取及分析➔.条件判断并下单交易。

那么每一点的核心分别是什么?搞懂这四段话!(配四个案例)

1.账户

量化策略运行的第一步:账户初始化。它就如同是开户操作,任何人想要进入股市交易,他必须先到证券公司去开户,如果没有资金账户,是无法交易股票的。那么量化策略主要通过函数来实现账户初始化,也就是完成开户,并只需要一次即可。

初始化函数:def initialize(account):,该函数只有唯一一个参数 account,也就是说,量化策略在初始化函数中需要对账户信息初始化,账户信息包括账户持仓、账户可用资金、账户使用资金等等,除此之外,account 作为对象还可能存放变量,但一旦初始化后,都会全部清空,回归到最开始的时候。

在简单双线策略中,其在 account 对象中设置了 security 变量,也就是贵州茅台的股票代码。 #初始化账户
def initialize(account):
#设置要交易的证券(600519.SH 贵州茅台)
account.security = '600519.SH'

2.时间 量化策略运行的第二步:时间。中国的上海证券交易所和深圳证券交易所都是有对应的交易时间规定的,那么量化策略在运行过程中也必须尊重这个时间规定,比如:集合竞价时间为 9 点 15 分至 9 点 25 分、股票竞价交易时间为 9 点 30 分至 11 点 30 分和 13 点至 15 点。

量化策略通过函数来实现准时运行,最常见的是 def handle_data(account,data):函数,该函数可以设置两种模式:日级和分钟级。日级模式下,该函数会定时在每日 9 点 30 分准时运行一次。分钟级模式下,该函数会在竞价交易时间内的每个分钟定时运行一次,也就是一个交易日时长四小时,运行 240 次。 #设置买卖条件,每个交易频率(日 /分钟 /tick )调用一次
def handle_data(account,data):

在简单双线策略中,整个策略都是在 def handle_data 函数中运行,函数参数为 account 和 data,其中 account 是账户信息对象,而 data 是储存数据的对象。

3.据获取及分析

量化策略运行的第三步:数据获取及分析。行情、财务等等数据都是经过人工清洗整理后储存下来的,具有标准的格式,主要就是为了用户能够方便、统一的去获取这些数据,通过一系列的获取数据函数,用户可以获取到策略所需要的数据,然后进行数据分析,作出买卖决定。

数据获取函数与初始化函数和时间函数不同,因为数据获取函数是将储存的数据提取,因此其一般的格式:函数名(参数)。

简单双均线策略中:close = data.attribute_history(account.security, ['close'], 20, '1d'),其中就是运用 data.attribute_history()这个获取数据的函数来获取相应数据,用户只需要填写 4 个关键参数,分别是获取数据的标的、数据类型、数据长度、数据步长。成功获取到数据后,赋值到 close 上,进行数据分析,也就是前一章节的 Python 数学函数做简单数据分析。

#设置买卖条件,每个交易频率(日 /分钟 /tick )调用一次
def handle_data(account,data):
#获取证券过去 20 日的收盘价数据
close = data.attribute_history(account.security, ['close'], 20, '1d') #计算五日均线价格
MA5 = close.mean().values()
#计算二十日均线价格
MA20 = close.values.mean()
#如果五日均线大于二十日均线

4.条件判断并下单交易

量化策略运行的第四步:条件判断并下单交易。量化策略在完成对数据分析后,往往是需要进行判断,然后下单交易。就如同简单双均线中,策略获取到数据,然后计算 5 日、20 日均线,判断均线金叉则买入,死叉则卖出。

下单交易往往通过下单函数实现,常用的下单函数有根据资金下单、根据目标股数下单。其中 order_value()函数是根据资金下单交易的函数,内置两个参数,交易标的和交易金额。order_target()函数是根据目标股数下单,内置两个参数,交易标的和目标股数。

在简单双均线策略中,运用了这两个函数进行下单交易。 #如果五日均线大于二十日均线
if MA5 > MA20:
#使用所有现金买入证券
order_value(account.security,account.cash)
#如果五日均线小于二十日均线,并且目前有头寸
if MA5 < MA20 and account.positions_value > 0:
#卖出所有证券
order_target(account.security,0)


Python函数在量化策略中的运用

1 回复

在量化策略里,Python函数是组织逻辑的核心单元,能把复杂的策略拆解成清晰、可复用的模块。一个典型的策略函数结构是这样的:

import pandas as pd
import numpy as np

def calculate_sma(data, window=20):
    """计算简单移动平均线"""
    return data.rolling(window=window).mean()

def generate_signals(data, short_window=10, long_window=30):
    """生成双均线交易信号"""
    data['short_sma'] = calculate_sma(data['close'], short_window)
    data['long_sma'] = calculate_sma(data['close'], long_window)
    
    # 金叉做多,死叉做空
    data['signal'] = 0
    data.loc[data['short_sma'] > data['long_sma'], 'signal'] = 1
    data.loc[data['short_sma'] < data['long_sma'], 'signal'] = -1
    
    # 信号变化点
    data['position'] = data['signal'].diff()
    return data

def backtest_strategy(data, initial_capital=100000):
    """简单回测函数"""
    data['returns'] = data['close'].pct_change()
    data['strategy_returns'] = data['signal'].shift(1) * data['returns']
    
    # 计算累计收益
    data['cumulative_returns'] = (1 + data['strategy_returns']).cumprod()
    data['portfolio_value'] = initial_capital * data['cumulative_returns']
    
    return data[['close', 'signal', 'position', 'portfolio_value']]

# 使用示例
if __name__ == "__main__":
    # 模拟价格数据
    dates = pd.date_range('2023-01-01', periods=100, freq='D')
    prices = np.random.randn(100).cumsum() + 100
    sample_data = pd.DataFrame({'close': prices}, index=dates)
    
    # 执行策略
    result = generate_signals(sample_data)
    result = backtest_strategy(result)
    
    print(result.tail())
    print(f"最终净值: {result['portfolio_value'].iloc[-1]:.2f}")

关键点在于:用函数封装指标计算(如calculate_sma)、信号生成(generate_signals)和回测逻辑(backtest_strategy),这样策略就变得模块化,便于测试和调整参数。实际开发中还会用到闭包和装饰器来管理状态和添加日志等功能。

总结:把策略拆成函数写,好维护。

回到顶部