社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

【Python】用Python实现量化个股选择

机器学习初学者 • 2 周前 • 69 次点击  

Python凭借其在数据科学领域积累的丰富生态,已然成为专业「量化分析」中必不可少的技术手段。今天要给大家分享的例子,就展示了如何基于Python中常用的numpypandas等常用数据分析处理框架,针对「沪深市场全量股票」,基于示例技术指标,示范「个股量化选择」的基本过程:

1 相关库的导入

分析过程需要用到的库如下,其中numpypandas等库用于实现分析过程的「数据处理」「运算」xtquant用于快捷「获取」股票历史行情数据,matplotlib则用于对策略过程及效果进行「可视化」

import numpy as np
import pandas as pd
from tqdm import tqdm
from xtquant import xtdata # qmt行情数据模块
from datetime import datetime, timedelta

2 获取沪深市场全部股票历史行情数据

在导入相关库后,我们首先需要获取沪深市场「全量」股票的「历史行情数据」

我们基于xtquant中的行情数据模块,直接下载并提取沪深市场「近1年」的日线行情数据(xtquant调用股票行情数据使用需配合本机QMT程序):

QMT免费获取方式见文章末尾
# 获取沪深全量股票代码
stock_codes = xtdata.get_stock_list_in_sector('沪深A股')

# 剔除上市晚于一年前的个股
start_time = (datetime.now() - timedelta(days=365)).strftime('%Y%m%d')
stock_codes = [
    stock_code for stock_code in stock_codes
    if xtdata.get_instrument_detail(stock_code)['OpenDate'] ]

# 批量下载沪深全部股票近1年历史日线行情数据
for target_stock in tqdm(stock_codes):
    xtdata.download_history_data(
        target_stock, 
        period='1d'
        start_time=start_time
    )

# 提取数据,限定所需的字段为收盘价
raw_history = xtdata.get_market_data(
    stock_list=stock_codes, 
    period='1d'
    start_time=start_time,
    field_list=['close']
)

3 历史行情数据清洗转换

为了进行下一步的指标计算,我们需要对先前下载提取的日线历史行情数据进行「清洗转换」,通过下面的代码,即可将上一步的原始数据转换为标准的「数据框」格式:




    
# 转换为分析所需标准数据框格式
history_df = (
    raw_history['close']
    .T
    .reset_index(drop=False)
    .melt(id_vars='index', var_name='code', value_name='close')
    .rename(columns={'index''datetime'})
)
history_df.tail()

4 计算各股票年化波动率

以计算年化波动率为例,我们基于pandas分组聚合运算,快捷统计出全部个股的年化波动率,进行降序排列后查看年化波动率最大的「前10」只个股:

# 计算个股年化波动率

(
    history_df
    .groupby('code', as_index=False)
    .agg(
        年化波动率=pd.NamedAgg(
            column='close',
            aggfunc=lambda s: ((s / s.shift()) - 1).std() * np.sqrt(len(s))
        )
    )
    .sort_values('年化波动率', ascending=False, ignore_index=True)
    .head(10)
)

5 回测模拟

挑选年化波动率靠前的个股中「非st」的,譬如其中的301182.SZ,以用Python实现量化策略回测一文中示例的简单均线策略为例,其中相关参数设置如下,这里使用了较小的均线窗口大小,以尝试捕捉更小的波动周期:

# 回测模拟相关参数设置

initial_cash = 100000  # 初始资金
commission_rate = 0.0001  # 交易佣金率
min_commission = 5  # 交易最低佣金
short_window = 5 # 短期均线窗口大小
long_window = 20 # 长期均线窗口大小

针对301182.SZ在过去一年内的回测结果如下,周期内回测收益率达到「45%」




    
往期精彩回顾




  • 交流群

请备注:”昵称-学校/公司-研究方向“,例如:”张小明-浙大-CV“加群。

也可以加入机器学习交流qq群772479961



Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/177843
 
69 次点击