Python量化实战(二):回测-银行低估值选股策略

Step1:写独立模块utils

首先,写一个独立的python文件,汇总一些常用的函数,实现数据分组、仓位/权重计算等功能。
废话不说,上代码。

# 导入必要的模块
import pandas as pd
import numpy as np
from scipy.stats import rankdata

然后,写一个函数,根据某条件(如:市盈率)对传入的数据进行分组。

# 定义一个函数,根据市盈率PE Ratio对原始数据进行分组
def group_1d(arr, nog):
    """
    根据某条件对一维数据进行分组
    :param arr: 分组前的原始数据
    :param nog: 组数,要把原始数据分成几组
    :return: 以Numpy数组形式返回分组的结果
    """
    # 创建一个全零数组,用于存放最终的分组结果
    results = np.zeros_like(arr, dtype=int)
    # 接受一个数组,返回该数组中元素对应的顺序编号,如果元素相同,则返回该元素对应顺序的平均值
    ranks = rankdata(arr)
    
    total_num = len(arr)  # 数据总量
    nan_num = np.isnan(arr).sum()  # nan数据量
    no_nan_num = total_num - nan_num  # 非空数据量
    # 下面计算每个分组中有多少个元素,考虑到实际意义,在此四舍五入
    d = round(no_nan_num / nog)
    
    # 下面开始分组
    # 除了最后一组,其余分组中包含的全部元素个数是相同的
    for i in range(1, nog):
        rank1 = 1 + (i - 1) * d  # 当前分组开始元素对应的顺序编号值
        rank2 = rank1 + d  # 当前分组结束元素对应的顺序编号值
        results[(ranks >= rank1) & (ranks < rank2)] = i  # 写入对应元素的分组结果

    # 最后一组的分组情况
    rank1 = 1 + (nog - 1) * d
    rank2 = no_nan_num
    results[(ranks >= rank1) & (ranks < rank2)] = nog  # 剩下的全部是最后一组

    return results  # 返回分组结果

再写一个函数,对二维数据分组。

def grouping(arr2d, nog):
    """
    对二维数据进行分组
    :arr2d:传入需要分组的二维数据集
    :nog:组数
    :return:返回分组的结果
    """
    results = np.zeros_like(arr2d, dtype=int)  # 创建一个全零数组,用于保存分组的结果
    # 分组
    for i in range(len(results)):  # 对第i行数据进行分组
        results[i] = group_1d(arr2d[i], nog)  # 调用函数,对某一行数据进行分组
    
    return results  # 返回二维数据的分组结果

再写一个函数,根据分组结果计算权重。

def getting_weight(group
  • 2
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
股票回测量化交易中非常重要的一环,它可以通过历史数据对交易策略进行模拟和评估,从而评估策略的可行性和优劣性。在Python中,有很多开源的量化交易框架可以用来进行股票回测,如zipline、backtrader等。 下面是一个使用zipline框架进行简单交易策略回测的例子: 1. 安装zipline ```python pip install zipline ``` 2. 编写交易策略代码 ```python from zipline.api import order_target_percent, record, symbol def initialize(context): context.asset = symbol('AAPL') def handle_data(context, data): # 获取过去10天的收盘价 prices = data.history(context.asset, 'price', 10, '1d') # 计算平均价 mean_price = prices.mean() # 如果当前价格于平均价,则买入 if data.current(context.asset, 'price') < mean_price: # 调整持仓比例至100% order_target_percent(context.asset, 1.0) # 否则卖出 else: # 调整持仓比例至0% order_target_percent(context.asset, 0.0) # 记录当前持仓比例 record(position=context.portfolio.positions[context.asset].amount) ``` 3. 运行回测 ```python from zipline import run_algorithm from zipline.api import symbol from datetime import datetime start = datetime(2016, 1, 1) end = datetime(2017, 1, 1) result = run_algorithm( start=start, end=end, initialize=initialize, capital_base=10000, handle_data=handle_data, bundle='quandl' ) ``` 在上述代码中,我们定义了一个简单的交易策略,即如果当前价格于过去10天的平均价,则买入,否则卖出。然后我们使用zipline框架进行回测,设定回测开始和结束时间、初始资本、数据来源等参数,最终得到回测结果。 需要注意的是,这只是一个简单的例子,实际的交易策略可能会更加复杂,需要考虑更多的因素。另外,在进行股票回测时,也需要注意避免过度拟合或过度优化,以免出现回测虚高的情况。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值