资源简介

量化交易策略之动量与反转交易python版,用户可修改参数进行自定义,可借助米匡、聚宽等网站平台实现量化交易。动量反转策略被证实为长久以来仍有明显效果的交易策略。

资源截图

代码片段和文件信息

# coding=utf-8
from __future__ import division
from backtest import *
import os
import pandas as pd
from math import floor


# 计算复权价格
def cal_right_price(input_stock_data type=‘前复权‘):
    “““
    :param input_stock_data: 标准股票数据,需要‘收盘价‘ ‘涨跌幅‘
    :param type: 确定是前复权还是后复权,分别为‘后复权‘,‘前复权‘
    :return: 新增一列‘后复权价‘/‘前复权价‘的stock_data
    “““
    # 计算收盘复权价
    stock_data = input_stock_data.copy()
    num = {‘后复权‘: 0 ‘前复权‘: -1}
    price1 = stock_data[‘close‘].iloc[num[type]]
    stock_data[‘复权价_temp‘] = (stock_data[‘change‘] + 1.0).cumprod()
    price2 = stock_data[‘复权价_temp‘].iloc[num[type]]
    stock_data[‘复权价‘] = stock_data[‘复权价_temp‘] * (price1 / price2)
    stock_data.pop(‘复权价_temp‘)

    # 计算开盘复权价
    stock_data[‘复权价_开盘‘] = stock_data[‘复权价‘] / (stock_data[‘close‘] / stock_data[‘open‘])
    return stock_data[[‘复权价_开盘‘ ‘复权价‘]]


# 获取股票数据
def get_stock_data():
    # 遍历数据文件夹中所有股票文件的文件名,得到股票代码列表
    stock_code_list = []
    # 此处为股票数据文件的本地路径,请自行修改
    for root dirs files in os.walk(‘e:/data/stock data‘):
        if files:
            for f in files:
                if ‘.csv‘ in f:
                    stock_code_list.append(f.split(‘.csv‘)[0])

    all_stock = pd.Dataframe()

    for code in stock_code_list:
        # 此处为股票数据文件的本地路径,请自行修改
        stock_data = pd.read_csv(‘e:/data/stock data/‘ + code + ‘.csv‘ parse_dates=[‘date‘])
        stock_data = stock_data[[‘code‘ ‘date‘ ‘open‘ ‘close‘ ‘change‘]].sort_values(by=‘date‘)
        stock_data.reset_index(drop=True inplace=True)
        # 计算复权价
        stock_data[[‘open‘ ‘close‘]] = cal_right_price(stock_data type=‘后复权‘)
        # 判断每天开盘是否涨停
        stock_data.ix[stock_data[‘open‘] > stock_data[‘close‘].shift(1) * 1.097 ‘limit_up‘] = 1
        stock_data[‘limit_up‘].fillna(0 inplace=True)

        all_stock = all_stock.append(stock_data ignore_index=True)

    return all_stock[[‘code‘ ‘date‘ ‘change‘ ‘limit_up‘]]


def momentum_and_contrarian(all_stock start_date end_date window=3):
    “““
    :param all_stock: 所有股票的数据集
    :param start_date: 起始日期(包含排名期)
    :param end_date: 结束日期
    :param window: 排名期的月份数,默认为3个月
    :return: 返回动量策略和反转策略的收益率和资金曲线
    “““
    # 取出指数数据作为交易天数的参考标准 此处为指数数据文件的本地路径,请自行修改
    index_data = pd.read_csv(‘e:/data/index data/sh000001.csv‘ parse_dates=True index_col=‘date‘)
    index_data.sort_index(inplace=True)
    index_data = index_data[start_date:end_date]
    # 转换成月度数据
    by_month = index_data[[‘close‘]].resample(‘M‘ how=‘last‘)
    by_month.reset_index(inplace=True)

    momentum_portfolio_all = pd.Dataframe()
    contrarian_portfolio_all = pd.Dataframe()

    for i in range(window len(by_month) - 1):
        start_month = by_month[‘date‘].iloc[i - window]  # 排名期第一个月
        end_month = by_month[‘date‘].iloc[i]  # 排名期最后一个月

        # 取出在排名期内的数据
        stock_temp = all_stock[(all_stock[‘date‘] > start_month) & (all_stock[‘date‘] <= end_month)]

        # 将指数在这段时间的数据取出

评论

共有 条评论