VeighNa量化社区
你的开源社区量化交易平台 | vn.py | vnpy

置顶主题

基于迅投研的股票多因子策略数据解决方案

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:VeighNa小助手 | 发布时间:2025-06-15
 
VeighNa 4.0.0 版本新增了面向 AI 量化策略的 vnpy.alpha 模块,为专业量化交易员提供从多因子机器学习(ML)策略研发到实盘交易的一站式解决方案。

在股票多因子策略中,精准的成分股数据至关重要。在 A 股市场,成分股数据不仅能明确投资范围、控制样本特征,还可通过追踪历史成分变动,避免回测中的幸存者偏差。成分股通常流动性较好,可降低实盘执行风险;同时,以指数作为业绩基准,可更客观地评估策略表现。需要注意的是,本文方法主要适用于股票市场,期货等其他资产类别在数据需求和处理流程上有所不同。

本文将演示如何借助迅投研数据服务与 VeighNa,完整下载 A 股指数成分股数据,并实现成分变动跟踪与历史行情获取。

 

环境准备与模块导入

 

from datetime import datetime                           # 日期时间处理
from tqdm import tqdm                                   # 进度条显示
from xtquant import xtdata                              # 迅投研数据API

# vnpy相关模块
from vnpy.trader.database import DB_TZ                  # 数据库时区
from vnpy.trader.datafeed import get_datafeed           # 数据服务接口
from vnpy.trader.constant import Exchange, Interval     # 交易所和时间周期常量
from vnpy.trader.object import HistoryRequest           # 历史数据请求对象
from vnpy.alpha import AlphaLab, logger                 # Alpha研究实验室和日志

上述模块涵盖了数据下载、处理与存储的核心功能。其中,xtquant 是迅投研提供的 Python API,而 vnpy.alpha 则是 VeighNa 专为因子策略投研推出的组件。

 

下载参数配置

 

task_name = "csi300"                # 任务名称,用于标识数据文件夹
index_symbol = "000300.SSE"         # vnpy格式的指数代码
xt_index_symbol = "000300.SH"       # 迅投研格式的指数代码

start_date = "20070101"             # 开始日期
end_date = "20231231"               # 结束日期

intervals = [
    Interval.DAILY,                 # 设置下载日线数据
]

示例中选取沪深 300 指数(csi300)作为研究对象,时间范围为 2007 年初至 2023 年底,数据周期为日线。可以按需扩展至其他指数(如中证 500、创业板指等)或其他周期(如分钟线)。

 

初始化研究环境

 

# 创建投研实验室
lab = AlphaLab(f"./lab/{task_name}")    # 指定数据文件夹

# 初始化数据服务(迅投研数据服务)
datafeed = get_datafeed()               # 获取配置的数据服务
datafeed.init()                         # 初始化数据服务连接

AlphaLab 是 VeighNa 的因子投研流程管理组件,集成了数据管理、模型训练、信号生成和策略回测等完整环节。此处创建其实例,并指定数据存储目录。

 

下载成分股变动数据

 

# 下载历史成分股信息
xtdata.download_sector_data()                                # 下载板块分类数据
xtdata.download_history_data("", "stocklistchange", "", "")  # 下载股票列表变更历史

在获取指数板块信息前,需要先执行 download_sector_data 下载板块分类;而获取板块成分股列表前,同样需通过 download_history_data 下载股票列表变更历史。

首次下载耗时较长,请耐心等待。如需查看进度,可在 xtquant 自动创建的 data/log 目录中查看日志,其中会出现 "download done [xxx/xxx]" 等提示。

 

获取指数成分股变动

 

# 查询交易日历
days = xtdata.get_trading_calendar(market="SZ", start_time=start_date, end_time=end_date)

# 轮询获取指数成分股
index_components = {}
end_datetime = datetime.strptime(end_date, "%Y%m%d")
for i in days:
    dt = datetime.strptime(i, "%Y%m%d")
    if dt > end_datetime:
        continue

    # 获取特定日期的指数成分股
    xt_symbols = xtdata.get_stock_list_in_sector(xt_index_symbol, i)

    # 将迅投研格式转换为vnpy格式
    vt_symbols: list = []
    for xt_symbol in xt_symbols:
        vt_symbol = xt_symbol.replace("SH", "SSE").replace("SZ", "SZSE")
        vt_symbols.append(vt_symbol)

    # 以日期为键,成分股列表为值,存储在字典中
    index_components[dt.strftime("%Y-%m-%d")] = vt_symbols

# 保存到数据中心
lab.save_component_data(index_symbol, index_components)

下载完毕后,先使用 get_trading_calendar 获取交易日历,再对每个交易日调用 get_stock_list_in_sector 取得当天的成分股列表,并将代码从迅投研格式(如 000001.SZ)转换为 VeighNa 格式(如 000001.SZSE)。

最终得到的字典以日期为键、成分股列表为值,并通过 save_component_data 存入 AlphaLab 数据中心,为后续因子计算与策略回测奠定基础。

 

加载成分股列表

 

# 加载指数成分股代码
component_symbols = lab.load_component_symbols(index_symbol, start_date, end_date)

调用 load_component_symbols 即可从数据中心加载成分股数据。该方法会在指定日期区间内自动去重,返回所有历史成分股的列表,便于后续行情数据下载。

 

下载历史行情数据

 

# 加载指数成分股代码(去重后的所有历史成分股)
component_symbols = lab.load_component_symbols(index_symbol, start_date, end_date)

# 转换时间格式
start = datetime.strptime(start_date, "%Y%m%d")
start.replace(tzinfo=DB_TZ)  # 设置时区

end = datetime.strptime(end_date, "%Y%m%d")
end.replace(tzinfo=DB_TZ)    # 设置时区

# 除了成分股,还要下载指数数据
task_symbols = component_symbols + [index_symbol]

# 遍历下载数据,使用tqdm显示进度
for vt_symbol in tqdm(task_symbols):
    symbol, exchange_str = vt_symbol.split(".")  # 分离代码和交易所

    for interval in intervals:
        # 创建历史数据请求
        req = HistoryRequest(
            symbol=symbol, 
            exchange=Exchange(exchange_str), 
            start=start, 
            end=end, 
            interval=interval
        )

        # 查询历史数据
        bars = datafeed.query_bar_history(req)

        # 保存数据到数据库
        if bars:
            lab.save_bar_data(bars)
        else:
            logger(interval, vt_symbol)  # 记录下载失败的情况

拿到成分股列表后,需要进一步下载它们的K线历史行情数据。上述代码将去重后的成分股与指数本身合并为下载任务,并使用 tqdm 展示进度。遍历过程中,通过 query_bar_history 拉取历史行情并存储于 AlphaLab 数据库;若查询失败,则记录日志以便后续排查。

 

配置回测参数

 

# 添加回测参数配置
for vt_symbol in component_symbols:
    lab.add_contract_setting(
        vt_symbol,
        long_rate=5/10000,      # 多头费率:万分之五
        short_rate=10/10000,    # 空头费率:万分之十
        size=1,                 # 合约乘数:1
        pricetick=0.0001,       # 价格变动:0.0001
    )

为每只成分股配置回测参数。交易成本的合理设置对回测结果的准确性至关重要。本示例在 A 股市场中采用万分之五的多头费率和万分之十的空头费率,综合考虑了佣金、印花税及滑点。

 

完整代码

 

在文章的结尾还是老规矩附上完整的程序代码:

# 加载模块
from datetime import datetime

from tqdm import tqdm
from xtquant import xtdata

from vnpy.trader.database import DB_TZ
from vnpy.trader.datafeed import get_datafeed
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.object import HistoryRequest

from vnpy.alpha import AlphaLab, logger


# 设置下载参数
task_name = "csi300"
index_symbol = "000300.SSE"
xt_index_symbol = "000300.SH"

start_date = "20070101"
end_date = "20231231"

intervals = [
    Interval.DAILY,
]

# 创建投研实验室
lab = AlphaLab(f"./lab/{task_name}")    # 指定数据文件夹

# 初始化数据服务(这里配置使用的迅投研)
datafeed = get_datafeed()
datafeed.init()

# 下载历史成分股信息
xtdata.download_sector_data()

xtdata.download_history_data("", "stocklistchange", "", "")

# 查询交易日历
days = xtdata.get_trading_calendar(market="SZ", start_time=start_date, end_time=end_date)

# 轮询获取指数成本股
index_components = {}
end_datetime = datetime.strptime(end_date, "%Y%m%d")
for i in days:
    dt = datetime.strptime(i, "%Y%m%d")
    if dt > end_datetime:
        continue

    xt_symbols = xtdata.get_stock_list_in_sector(xt_index_symbol, i)

    vt_symbols: list = []
    for xt_symbol in xt_symbols:
        vt_symbol = xt_symbol.replace("SH", "SSE").replace("SZ", "SZSE")
        vt_symbols.append(vt_symbol)

    index_components[dt.strftime("%Y-%m-%d")] = vt_symbols

# 保存到数据中心
lab.save_component_data(index_symbol, index_components)

# 加载指数成分股代码
component_symbols = lab.load_component_symbols(index_symbol, start_date, end_date)

# 转换时间格式
start = datetime.strptime(start_date, "%Y%m%d")
start.replace(tzinfo=DB_TZ)

end = datetime.strptime(end_date, "%Y%m%d")
end.replace(tzinfo=DB_TZ)

# 除了成分股,还要下载指数数据
task_symbols = component_symbols + [index_symbol]

# 遍历下载数据
for vt_symbol in tqdm(task_symbols):
    symbol, exchange_str = vt_symbol.split(".")

    for interval in intervals:
        req = HistoryRequest(symbol, Exchange(exchange_str), start, end, interval)
        bars = datafeed.query_bar_history(req)

        if bars:
            lab.save_bar_data(bars)
        else:
            logger(interval, vt_symbol)

# 添加回测参数配置
for vt_symbol in component_symbols:
    lab.add_contract_setting(
        vt_symbol,
        long_rate=5/10000,
        short_rate=10/10000,
        size=1,
        pricetick=0.0001,
    )

 



vnpy代码阅读笔记


把你编写的指标用图表显示出来

用python编写指标和以往熟悉的文华,博弈大师等有很大的区别,你写的代码最终在图形上是什么样子,看一看才能心安。

于是有了下面这段代码:

from datetime import datetime
from typing import  Dict
from vnpy.trader.constant import Exchange, Interval
from vnpy.trader.database import database_manager
from vnpy.app.cta_strategy import ArrayManager
from vnpy.chart import ChartWidget, VolumeItem, CandleItem
import pyqtgraph as pg
from vnpy.trader.ui import create_qapp, QtCore, QtGui
from vnpy.trader.object import BarData
from vnpy.chart.manager import BarManager


class ZB(CandleItem):
    """自定义指标显示"""

    def __init__(self, manager: BarManager):
        """"""
        super().__init__(manager)

        self.blue_pen: QtGui.QPen = pg.mkPen(color=(100, 100, 255), width=2)
        self.sma_data: Dict[int, float] = {}

    def get_sma_value(self, ix: int) -> float:
        """"""
        if ix < 0:
            return 0

        if not self.sma_data:
            bars = self._manager.get_all_bars()
            sma_array = [bar.down_line for bar in bars]

            for n, value in enumerate(sma_array):
                self.sma_data[n] = value

        if ix in self.sma_data:
            return self.sma_data[ix]

        sma_value = sma_array[-1]

        return sma_value

    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        sma_value = self.get_sma_value(ix)
        last_sma_value = self.get_sma_value(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.blue_pen)

        # Draw Line
        start_point = QtCore.QPointF(ix-1, last_sma_value)
        end_point = QtCore.QPointF(ix, sma_value)
        painter.drawLine(start_point, end_point)

        # Finish
        painter.end()
        return picture

    def get_info_text(self, ix: int) -> str:
        """"""
        if ix in self.sma_data:
            sma_value = self.sma_data[ix]
            text = f"ZB {sma_value:.2f}"
        else:
            text = "ZB -"

        return text

class ZB2(CandleItem):
    """自定义指标显示"""

    def __init__(self, manager: BarManager):
        """"""
        super().__init__(manager)

        self.blue_pen: QtGui.QPen = pg.mkPen(color=(100, 100, 255), width=2)
        self.sma_data: Dict[int, float] = {}

    def get_sma_value(self, ix: int) -> float:
        """"""
        if ix < 0:
            return 0

        if not self.sma_data:
            bars = self._manager.get_all_bars()
            sma_array = [bar.up_line for bar in bars]

            for n, value in enumerate(sma_array):
                self.sma_data[n] = value

        if ix in self.sma_data:
            return self.sma_data[ix]

        sma_value = sma_array[-1]

        return sma_value

    def _draw_bar_picture(self, ix: int, bar: BarData) -> QtGui.QPicture:
        """"""
        sma_value = self.get_sma_value(ix)
        last_sma_value = self.get_sma_value(ix - 1)

        # Create objects
        picture = QtGui.QPicture()
        painter = QtGui.QPainter(picture)

        # Set painter color
        painter.setPen(self.blue_pen)

        # Draw Line
        start_point = QtCore.QPointF(ix-1, last_sma_value)
        end_point = QtCore.QPointF(ix, sma_value)
        painter.drawLine(start_point, end_point)

        # Finish
        painter.end()
        return picture

    def get_info_text(self, ix: int) -> str:
        """"""
        if ix in self.sma_data:
            sma_value = self.sma_data[ix]
            text = f"ZB {sma_value:.2f}"
        else:
            text = "ZB -"

        return text


if __name__ == "__main__":
    app = create_qapp()

    symbol = "CL-20210322-USD-FUT"
    exchange = Exchange.NYMEX
    interval = Interval.MINUTE_30
    start = datetime(2021, 1, 1)
    end = datetime(2022, 1, 1)

    bars = database_manager.load_bar_data(
        symbol=symbol,
        exchange=exchange,
        interval=interval,
        start=start,
        end=end
    )

    am = ArrayManager(50)
    new_data = bars[:]
    line_up = []
    line_down = []

    while new_data :
        bar = new_data.pop(0)
        am.update_bar(bar)
        up, down = am.boll(20,2)
        line_up.append(up)
        line_down.append(down)   #这里调用合适的公式就好了

    print("K线数量是", len(bars), "指标数据是", len(line_up))

    i = 0
    while line_down :
        bars[i].down_line = line_down.pop(0)
        bars[i].up_line = line_up.pop(0)
        i = i + 1
    print("共处理了", i, "数据")

    widget = ChartWidget()
    widget.add_plot("candle", hide_x_axis=True)
    widget.add_plot("volume", maximum_height=250)
    widget.add_item(CandleItem, "candle", "candle")
    widget.add_item(VolumeItem, "volume", "volume")

    widget.add_item(ZB, "ZB", "candle")
    widget.add_item(ZB2, "ZB2", "candle")
    widget.add_cursor()

    history = bars
    widget.update_history(history)

    def update_bar():
        bar = new_data.pop(0)
        widget.update_bar(bar)

    timer = QtCore.QTimer()
    timer.timeout.connect(update_bar)

    widget.show()
    app.exec_()

因为我使用的盈透可以随时下载各种周期的历史数据,所以我只要下载然后存在数据库中。直接用代码读取就可以看见最新的k线。
如果你需要下载盈透的数据,可以参考我的上一个帖子。
https://www.vnpy.com/forum/topic/6123-ying-tou-jie-kou-xia-zai-5fen-zhong-xian-bing-xian-shi-tu-biao?page=1#pid21676

其他的接口我不熟。



米筐答疑版块上线,欢迎选择 RQData 数据服务

熟悉我们的老用户可能知道,米筐自 2017 年开始与 VN.PY 形成战略合作伙伴关系。米筐的“数据”和“策略”解决方案 VN.PY 的“交易”服务互补,两年多来,我们已经联合为多位用户提供了高性价比的量化投研与交易服务。感兴趣的新朋友可以回顾我们的老帖子《米筐科技和 VN.PY 的战略合作重磅升级》

为了给各位用户带来更好的产品体验,RQData 相关的答疑功能来了。在这个版块中,我们将提供更好的售前答疑和售后服务,帮助您解决从数据购买到产品应用的技术性问题。欢迎大家在本版块中多多交流~

若您在投研过程中有金融数据需求,米筐的 RQData 产品可为您提供对应的数据服务。RQData 是一个基于 Python 的金融数据工具包,提供丰富整齐的历史数据以及简单高效的 API 接口,免除了您进行数据搜索、清洗的烦恼。

针对期货、商品期权,我们提供了对应的方案,欢迎您点击此处进行体验和购买

更多下单疑问,您可以在本帖中进行交流。感谢大家的关注~



windows上利用uv手动安装vnpy系统的完整过程

本文记录了利用python包管理生态管理工具uv,从源码恢复vnpy的运行环境的全过程。

一、采用uv作为python生态管理工具

python包管理生态中存在多种工具,如pip、pip-tools、poetry、conda等,各自具备一定功能。

uv新一代python生态管理工具,它是 Astral 公司推出的一款基于Rust编写的Python包管理工具,旨在成为“Python的 Cargo”。

它提供了快速、可靠且易用的包管理体验,在性能、兼容性和功能上都有出色表现,为 Python项目的开发和管理带来了新的选择。

为什么用uv

与其他 Python 中的包管理工具相比,uv 更像是一个全能选手,它的优势在于:

  1. 速度快:得益于 Rust,uv 工具的速度让人惊艳,比如安装依赖,速度比其他工具快很多
  2. 功能全面: uv 是“一站式服务”的工具,从安装 Python、管理虚拟环境,到安装和管理包,再到管理项目依赖,它统统都能处理得很好
  3. 前景光明:背后有风投公司 Astral支持,且采用了 MIT许可,即使未来出现问题,社区也有应对的办法

使用uv,也可以像 Node]s 或者 Rust 项目那样方便的管理依赖。

二、安装uv

windows上安装uv,在cmd窗口中执行下面命令:

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

注意:执行完毕后,会在C:\users\\<用户名称>\.local\bin目录下安装两个文件uv.exe和uvx.exe。

description

进入cmd或者powershell窗口,输入uv命令应该可以得到如下回应就表示uv已经安装成功了:

description

如果报告“uv不是内部或外部命令,也不是可运行的程序或批处理文件。”请打开“我的电脑”| “高级系统设置”| “环境变量”| “用户变量”| “Path”,把C:\users\\<用户名称>\.local\bin目录添加进去就可以。

description

description

三、下载vnpy 4.0源码

description
如图所示,从https://www.github.com下载到vnpy-master.zip源代码,解压后包含如下文件和目录:

description

四、恢复vnpy的运行环境

4.1 安装python 3.13.17

输入下面的命令,限定python版本3.13,实际安装的是python 3.13.17。

uv python install 3.13

4.2 重建虚拟环境

来到vnpy-master源码目录下,输入下面的目录创建虚拟环境目录,当前目录下会多出.venv目录,其中包含虚拟环境的配置文件。

cd d:\vnpy-master
uv venv

4.3 安装ta-lib

这一步是最关键的一步,我是好几天都无法通过这一步,最后在陈总——陈晓优的指导下才通过的。

先把ta-lib二进制包装了,注意这里必须先指明安装的源是https://pypi.vnpy.com。

uv pip install ta-lib --index=https://pypi.vnpy.com

4.4 安装vnpy核心模块

uv pip install . --index=https://pypi.vnpy.com

4.5 安装vnpy其他需要的模块

只有vnpy核心模块是不够的,还需要根据自己的需要安装其他的模块才能够运行实际的交易:

  • 如果采用ctp行情和交易接口需要安装vnpy_ctp模块
  • 如果采用米筐历史书需要安装vnpy_rqdata模块
  • 如果采用cta策略需要安装vnpy_ctastrategy模块
  • 如果要运行cta策略回测需要安装vnpy_ctastrategy模块
  • 如果使用mysql数据库作为数据存储pymysql和vnpy_mysql模块
  • 如果需要对本地数据存储进行管理 vnpy_datamanager 模块

可以合并也可以逐条执行如下命令:

uv add importlib_metadata pymysql
uv add vnpy_ctp vnpy_ctastrategy vnpy_ctabacktester vnpy_datamanager vnpy_mysql vnpy_rqdata

五、运行例子

5.1 运行example\verghna_trader\run.py

vnpy的源码中包含一个例子,位于example\verghna_trader子目录下,其中的run.py最具代表性,它演示了如何利用已经安装的核心和其他配套模块能够完成功能:

  • vntrader界面
  • CTA策略交易界面
  • CTA策略回测
  • 本地数据管理
  • 合约查询
cd d:\vnpy-master\examples\veighna_trader\
uv run run.py

vntrader界面

description

合约查询界面

description



30,000 Stars!

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2025-06-09
 
截至2025年6月3日,VeighNa(vn.py)项目在Github上收获的Star总数突破30,000(查看Star数据请戳这里的Github仓库),感谢开源社区用户们的长期支持!

description

VeighNa开发团队会继续坚持【By Traders, For Traders, AI-Powered】的核心理念,为大家带来更加强大和好用的量化交易平台产品!

附上自2015年初在Github上开源以来的Star增长曲线(截图来自Star History网站

description

 

FinRL投研平台学习系列社区活动第四场报名进行中,想要了解强化学习技术(Reinforcement Learning)在量化领域具体应用场景的同学强烈推荐!具体活动内容大纲请见:[2025年第4次社区活动 - 【FinRL投研平台学习系列4】 - 6月28日(上海)
 



VeighNa发布v4.0.0 - 迈向开源量化的下一个十年!

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2025-04-15
 
自2015年3月发布以来,VeighNa已经走过了作为开源项目的第一个十年。在这段时间里,VeighNa的成长离不开广大社区用户的持续贡献。在此,我们要向VeighNa社区的每一位成员表达最真挚的感谢!

上月底,VeighNa迎来了4.0.0版本的发布,这是VeighNa 4.0大版本的首次更新。此次更新的核心亮点包括全新推出的针对AI量化策略的vnpy.alpha子模块,并将核心支持版本升级至Python 3.13,大幅提升整体性能的同时,还进一步完善了VeighNa的软件工程架构。

鉴于本次更新涉及Python核心支持的升级(从3.10更新至3.13),因此无法通过VeighNa Station的自动更新功能完成升级。用户需要先卸载旧版的VeighNa Studio,然后重新下载并安装VeighNa Studio 4.0.0版本,下载链接:

https://download.vnpy.com/veighna_studio-4.0.0.exe

 

面向AI量化策略的vnpy.alpha

 

本次发布中新增了面向AI量化策略的vnpy.alpha模块,为专业量化交易员提供一站式多因子机器学习(ML)策略开发、投研和实盘交易解决方案:

description

📊dataset - 因子特征工程

  • 专为ML算法训练优化设计,支持高效批量特征计算与处理
  • 内置丰富的因子特征表达式计算引擎,实现快速一键生成训练数据
  • Alpha 158:源于微软Qlib项目的股票市场特征集合,涵盖K线形态、价格趋势、时序波动等多维度量化因子

💡 model - 预测模型训练

  • 提供标准化的ML模型开发模板,大幅简化模型构建与训练流程

  • 统一API接口设计,支持无缝切换不同算法进行性能对比测试

  • 集成多种主流机器学习算法:

    • Lasso:经典Lasso回归模型,通过L1正则化实现特征选择
    • LightGBM:高效梯度提升决策树,针对大规模数据集优化的训练引擎
    • MLP:多层感知机神经网络,适用于复杂非线性关系建模

🤖 strategy - 策略投研开发

  • 基于ML信号预测模型快速构建量化交易策略
  • 支持截面多标的和时序单标的两种策略类型

🔬 lab - 投研流程管理

  • 集成数据管理、模型训练、信号生成和策略回测等完整工作流程
  • 简洁API设计,内置可视化分析工具,直观评估策略表现和模型效果

📖 notebook - 量化投研Demo

  • download_data_rq:基于RQData下载A股指数成分股数据,包含指数成分变化跟踪及历史行情获取
  • research_workflow_lasso:基于Lasso回归模型的量化投研工作流,展示线性模型特征选择与预测能力
  • research_workflow_lgb:基于LightGBM梯度提升树的量化投研工作流,利用高效集成学习方法进行预测
  • research_workflow_mlp:基于多层感知机神经网络的量化投研工作流,展示深度学习在量化交易中的应用

vnpy.alpha模块的设计理念受到Qlib项目的启发,在保持易用性的同时提供强大的AI量化能力,特此向Qlib开发团队致以诚挚感谢!

由于截面多因子策略的开发涉及跨学科知识体系——包括金融理论建模、海量数据处理、以及机器学习算法实践,不少社区用户在阅读相关开源代码后仍反馈“无从下手、不知如何系统学习”。如果你也有类似困惑,我们强烈推荐即将于6月举办的2025年第二场小班特训营《机器学习截面多因子策略》,本次特训营将以实战为导向,从零搭建一套完整的机器学习因子策略开发流程,课程大纲及报名信息详见报名公告

 

Python 3.13核心支持升级

 

自Guido启动Shannon Plan项目以来,过去数年中每一个Python大版本的迭代都显著提升了解释器的执行性能。因此,在VeighNa 4.0版本中,我们将核心支持升级至最新的Python 3.13,并结合新引入的语言特性,对核心框架的代码进行了重构,以进一步提升系统的运行效率与代码可维护性。

同时,依据《2025年VeighNa项目计划》中所提出的路线,4.0版本也在软件工程层面进行了多项关键性改进,全面优化了项目的架构设计与开发流程,具体包括:

  • 构建系统升级:全面采用pyproject.toml 构建体系,替代传统的 setup.py/setup.cfg,对接更现代的Python构建工具生态。
  • 跨平台编译支持:交易接口模块中涉及C++封装的部分,现使用meson-python进行编译,支持模块化安装的pybind11,并实现对 Windows、Linux 和Mac的统一跨系统构建。
  • 代码质量管理:引入ruff作为默认的代码质量检查工具,替代传统的flake8;并使用mypy进行静态类型检查,全面提升代码的类型注解完整性与一致性。
  • 开发环境管理:在涉及VeighNa二次开发的使用场景中,推荐使用uv工具作为开发环境管理方案,覆盖从虚拟环境创建、依赖管理,到打包上传发布的全流程。
  • 日志系统优化:采用第三方库loguru替代原有内置的logging模块,为底层日志系统提供更强大、更灵活的输出功能。

 

4.0版本的功能模块移植计划

 

VeighNa 4.0核心框架在升级过程中始终坚持“兼容优先”的原则,尽可能保障现有插件模块的平稳过渡。除涉及C++ API封装的接口模块需进行重编译外,绝大多数功能模块可在无需修改的情况下直接使用。

但由于前述对 Python 3.13 的支持升级以及软件工程层面的结构性调整,部分模块仍需进行适配性更新。目前已完成适配并通过测试的模块包括:

  • vnpy_ctp
  • vnpy_rqdata
  • vnpy_sqlite
  • vnpy_ctastrategy

其余模块的适配工作计划将在 4.1.0 版本中完成(预计于2025年5月发布)。与此同时,我们也将清理部分使用量较低、长期无人关注的模块,具体清单和说明可参见GitHub上的相关Issue

 

CHANGELOG

 

新增

  1. 新增面向机器学习多因子策略的vnpy.alpha模块

调整

  1. 核心支持版本升级到Python 3.13
  2. 使用pyproject.toml统一项目配置
  3. 日志功能使用loguru替代logging
  4. 使用mypy优化静态类型声明
  5. 使用ruff优化代码细节质量
  6. 使用uv作为开发环境管理工具
  7. 升级扩展模块适配4.0版本:vnpy_ctp/vnpy_ctastrategy/vnpy_sqlite/vnpy_rqdata

修复

  1. 修复PySide6中单元格排序可能出现的乱序问题

 



2025年第4次社区活动 - 【FinRL投研平台学习系列4】 - 6月28日(上海)

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:VeighNa小助手 | 发布时间:2025-06-03
 
去年【社区活动尊享卡】的受欢迎程度大幅超出我们的预期,为了保证每场社区活动的交流质量,尊享卡已经变更为仅对部分专业交易员用户定向提供。对于参加活动较多的同学强烈推荐!购买请扫描二维码添加小助手咨询:

description

FinRL投研平台学习系列的社区活动迎来第四场,前三场在深圳、上海、成都的活动中,参与者的热情远远超出了我们的预期。今年年初,DeepSeek的现象级爆红使得人工智能(AI)和机器学习(ML)的概念更加深入人心。与此同时,量化领域的从业者们也正积极探索这些技术在投资和交易业务中的应用前景。

这里附上几张之前活动的照片:

description

description

description

列举一下目前整个系列活动计划的四场内容,分别是:

  1. 快速上手FinRL运行和项目背景介绍(已结束)
  2. FinRL投研数据获取扩展和环境交互剖析(已结束)
  3. 构建量化FinRL智能体和RL算法对比分析(已结束)
  4. FinRL的进阶开发应用和仿真交易环境接入(本场)

本次活动将于6月28日(周六)下午2:00至5:00在上海举办。普通报名仅支持线下参会,尊享卡持有者和Elite会员可通过线上直播参与。活动具体地址将在微信群中公布,请在报名成功后扫码加入社区活动群,以便获取相关信息!

 

活动内容大纲

 

  1. FinRL的进阶开发应用

    a. FinRL-Tutorials项目介绍

    i. 基础入门部分
    ii. 进阶应用部分
    iii. 实践优化部分

    b. 基于FinRL的量化投资组合配置

    i. Stock Trading v.s. Portfolio Allocation
    ii. 相似但不同的任务:Action、Reward、State
    iii. Dow 30投资组合实践结果分析

    c. 尝试中国A股市场的股票交易

    i. 使用tushare下载准备数据
    ii. A股交易强化学习任务运行
    iii. 对比沪深300指数基准的绩效分析

    d. 基于Ensemble Strategy的股票交易

    i. 什么是机器学习中的Ensemble Strategy
    ii. 和单一RL算法的绩效结果对比

  2. PaperTrading仿真交易

    a. 接入Alpaca仿真环境

    i. 行情订阅获取
    ii. 委托交易执行

    b. 整体任务执行流程分解

    i. 定义RL仿真交易任务
    ii. 基于历史数据训练Agent
    iii. Agent仿真环境接入运行

  3. FinRL系列4期内容回顾总结

  4. 闭门交流环节

 

时间:6月28日 14:00-17:00

地点:上海(具体地址后续在微信群中通知)

报名费:99元(Elite会员免费参加)

报名方式:扫描下方二维码报名(报名后请扫码加入社区活动微信群获取参会地址)

description

 



vnpy 的启动流程总结

作为初学者,面对 vnpy 无所不包、博大精深的丰富内容,试图用图形对 vnpy 的运行流程做一个归纳。
不到之处,还请各位多多指正

description



一张图理清《大模型量化AI应用实战》的知识要点

发布于VeighNa社区公众号【vnpy-community】
 
原文作者:用Python的交易员 | 发布时间:2025-05-22
 
在2025年第一季度收尾的《机器学习研修系列 - 大模型量化AI应用实战》课程中,我们使用VeighNa平台上的量化投研业务作为应用场景和实践案例,结合深入浅出的讲解,帮助学员构建大模型应用开发的完整知识体系

为了帮助大家更好地吸收课程精华,我们精心制作了这份【知识要点图】:

  • 对于已购课程的学员,可以通过此图更好地将所学知识系统化,构建个人专属的大模型量化应用开发知识框架
  • 对于目前还在自学的用户,这张图提供了一条明确的学习路径,可以**顺着循序渐进的目标一步一个脚印地学习前进**。

看完对课程感兴趣的话,请戳【课程传送门】

description

 

本课程同样包含在【VeighNa Elite版】的会员权益范围内,其他会员权益包括:

  • 全实战进阶小鹅通店铺中的线上系列课程;
  • VeighNa社区官方活动(包括历史回看);
  • 期货、期权分钟级历史数据服务(日内更新);
  • 专属微信服务群,及时解决使用中的各类问题;
  • 小班特训营优先报名通道以及7折优惠价格。

感兴趣的同学请扫描下方二维码:

description

 


新消息

1个月前

统计

主题
10255
帖子
38912
已注册用户
61949
最新用户
在线用户
165
在线来宾用户
8727
© 2015-2022 上海韦纳软件科技有限公司
备案服务号:沪ICP备18006526号

沪公网安备 31011502017034号

【用户协议】
【隐私政策】
【免责条款】