VectorBT量化入门系列:第四章 高级策略开发与优化
VectorBT量化入门系列:第四章 高级策略开发与优化
本教程专为中高级开发者设计,系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标,深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署,全面提升量化交易能力,助力开发者构建高效、稳健的交易系统。
文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。适合量化新手建立系统认知,为策略开发打下基础。
学习对象
- 中高级水平的开发者和数据分析师
- 具备 Python 编程基础和一定的数据分析能力
- 对量化交易和金融数据处理有一定了解
- 熟悉 A 股市场,了解 Tushare 数据源和 TA-Lib 技术指标
教程目标
- 系统学习 VectorBT 技术,掌握其在量化交易中的应用
- 熟练使用 Tushare 数据源获取 A 股市场数据,并使用 Parquet 文件存储
- 掌握基于 VectorBT 的策略开发、回测和性能评估流程
- 学会使用 TA-Lib 计算技术指标,并将其应用于交易策略
- 理解并实现多因子策略、机器学习策略等高级策略
- 掌握策略优化、风险管理以及策略组合的方法
- 能够独立构建和评估量化交易策略,并部署到生产环境
教程目录
第一章 VectorBT基础与环境搭建
1.1 VectorBT简介与应用场景
1.2 环境搭建与依赖安装
1.3 数据源与Tushare集成
1.4 数据存储与Parquet文件格式
第二章:VectorBT核心功能与数据处理
2.1 数据加载与预处理
2.2 时间序列数据处理
2.3 技术指标计算与TA-Lib集成
2.4 数据可视化与探索性分析
第三章:VectorBT策略回测基础
3.1 策略定义与实现
3.2 回测流程与关键参数
3.3 性能评估指标与解读
3.4 策略优化与参数调整
第四章:高级策略开发与优化
4.1 多因子策略开发
4.2 机器学习策略集成
4.3 风险管理与交易成本模拟
4.4 策略组合与资产配置
第五章:VectorBT性能评估与分析
5.1 性能评估框架
5.2 统计指标与回测报告
5.3 敏感性分析与压力测试
5.4 策略对比与选择标准
第六章:VectorBT实战案例
6.1 基于MACD的动量策略
6.2 基于RSI的均值回归策略
6.3 多因子选股策略
6.4 机器学习预测策略
第七章:VectorBT扩展与最佳实践
7.1 自定义指标与策略
7.2 高效回测与并行计算
7.3 代码优化与性能提升
7.4 生产环境部署与监控
第四章 高级策略开发与优化
本章将深入探讨如何开发更复杂的交易策略,并通过优化提升策略表现。我们将涵盖多因子策略、机器学习策略、风险管理以及策略组合等内容。
4.1 多因子策略开发
多因子策略结合多个技术指标来生成交易信号,通常能提高策略的鲁棒性。
4.1.1 定义多因子信号
import vectorbt as vbt
import pandas as pd
import talibdef generate_multi_factor_signals(df: pd.DataFrame) -> pd.DataFrame:# 计算动量因子 (Momentum)# 动量因子是过去20天的收益率均值df["Momentum"] = df["close"].pct_change(periods=20).rolling(window=20).mean()# pct_change(periods=20) 计算每20天的收益率# rolling(window=20).mean() 计算这些收益率的20天滚动平均值# 计算波动性因子 (Volatility)# 波动性因子是过去20天的日收益率标准差df["Volatility"] = df["close"].pct_change().rolling(window=20).std()# pct_change() 计算每天的收益率# rolling(window=20).std() 计算这些收益率的20天滚动标准差# 计算相对强弱指数 (RSI)# RSI 是一个技术分析指标,用于衡量资产价格变动的速度和变化df["RSI"] = talib.RSI(df["close"], timeperiod=14)# talib.RSI 计算14天的RSI# 计算移动平均收敛/发散指标 (MACD)# MACD 是一个趋势跟踪动量指标,显示了两条移动平均线之间的关系df["MACD"], _, _ = talib.MACD(df["close"], fastperiod=12, slowperiod=26, signalperiod=9)# fastperiod=12: 快速移动平均线的周期# slowperiod=26: 慢速移动平均线的周期# signalperiod=9: 信号线的周期# 返回值包括 MACD 线、信号线和 MACD 柱状图,这里我们只取 MACD 线# 给每个因子分配权重weights = {"Momentum": 0.3, "Volatility": -0.2, "RSI": 0.3, "MACD": 0.2}# 计算合成因子得分df["Factor_Score"] = sum([df[col] * weights[col] for col in weights])# 设定买入卖出阈值buy_threshold = 0.5sell_threshold = -0.5# 生成交易信号df["signal"] = np.where(df["Factor_Score"] > buy_threshold,1,np.where(df["Factor_Score"] < sell_threshold, -1, 0),)return df
4.1.2 运行多因子策略
def run_multi_factor_strategy(df: pd.DataFrame) -> vbt.Portfolio:"""运行多因子策略。:param df: 包含多因子信号的DataFrame:return: 回测结果"""# 创建投资组合portfolio = vbt.Portfolio.from_signals(close=df["close"],entries=df["signal"] == 1,exits=df["signal"] == -1,freq="D",init_cash=100000,)return portfolio# 示例:运行多因子策略
data = load_data_from_parquet("./data/600519.SH.parquet") # 贵州茅台
data = generate_multi_factor_signals(data)
portfolio = run_multi_factor_strategy(data)
# 评估策略性能
evaluate_performance(portfolio)
输出:
总回报率: 31.69%
夏普比率: 0.42
最大回撤: -46.72%
总利润: 31691.35
4.2 机器学习策略集成
机器学习可以用于预测市场走势,从而生成交易信号。我们将使用随机森林模型作为示例。
4.2.1 准备特征和标签
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoredef prepare_features_and_labels(df: pd.DataFrame) -> tuple[pd.DataFrame, pd.Series]:"""准备机器学习的特征和标签。:param df: 输入的DataFrame:return: 特征矩阵和标签向量"""# 计算技术指标作为特征df["macd"], df["macd_signal"], _ = talib.MACD(df["close"])df["rsi"] = talib.RSI(df["close"], timeperiod=14)df["bb_upper"], df["bb_middle"], df["bb_lower"] = talib.BBANDS(df["close"], timeperiod=20)# 创建标签(1表示上涨,0表示下跌)df["target"] = (df["close"].shift(-1) > df["close"]).astype(int)# 去除NaN值df.dropna(inplace=True)# 分离特征和标签X = df[["macd", "rsi", "bb_upper", "bb_lower"]]y = df["target"]return X, y# 示例:准备特征和标签
X, y = prepare_features_and_labels(data)
4.2.2 训练和预测
def train_and_predict(X: pd.DataFrame, y: pd.Series) -> pd.Series:"""训练机器学习模型并进行预测。:param X: 特征矩阵:param y: 标签向量:return: 预测结果"""# 分割数据集X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练随机森林模型model = RandomForestClassifier(n_estimators=100, random_state=42)model.fit(X_train, y_train)# 预测y_pred = model.predict(X_test)# 评估模型print(f"模型准确率: {accuracy_score(y_test, y_pred):.2%}")# 返回预测结果return pd.Series(y_pred, index=X_test.index)# 示例:训练和预测
predictions = train_and_predict(X, y)
输出:
模型准确率: 56.60%
4.3 风险管理与交易成本模拟
风险管理是策略开发的重要组成部分。我们将模拟交易成本和设置止损、止盈点。
4.3.1 模拟交易成本
def simulate_trading_costs(df: pd.DataFrame, fee_rate: float = 0.0015, slippage_rate: float = 0.0015
) -> vbt.Portfolio:"""模拟交易成本。:param df: 输入的DataFrame:param fee_rate: 交易费用率:param slippage_rate: 滑点率:return: 包含交易成本的回测结果"""# 重新运行回测,包含交易成本portfolio_with_costs = vbt.Portfolio.from_signals(close=df["close"],entries=df["signal"] == 1,exits=df["signal"] == -1,freq="D",init_cash=100000,fees=fee_rate,slippage=slippage_rate,)return portfolio_with_costs# 示例:模拟交易成本
portfolio_with_costs = simulate_trading_costs(data)
# 评估策略性能
evaluate_performance(portfolio_with_costs)
输出:
总回报率: 25.90%
夏普比率: 0.38
最大回撤: -48.80%
总利润: 25896.88
4.3.2 设置止损和止盈
def run_strategy_with_stop_loss_and_take_profit(df: pd.DataFrame, stop_loss: float = 0.03, take_profit: float = 0.07
) -> vbt.Portfolio:"""运行包含止损和止盈的策略。:param df: 输入的DataFrame:param stop_loss: 止损率:param take_profit: 止盈率:return: 回测结果"""# 创建投资组合,包含止损和止盈portfolio = vbt.Portfolio.from_signals(close=df["close"],entries=df["signal"] == 1,exits=df["signal"] == -1,freq="D",init_cash=100000,fees=0.0015,slippage=0.0015,sl_stop=stop_loss,tp_stop=take_profit,)return portfolio# 示例:运行包含止损和止盈的策略
portfolio_with_sl_tp = run_strategy_with_stop_loss_and_take_profit(data, stop_loss=0.05, take_profit=0.10
)
# 评估策略性能
evaluate_performance(portfolio_with_sl_tp)
输出:
总回报率: 8.97%
夏普比率: 0.24
最大回撤: -52.46%
总利润: 8968.03
4.4 策略组合与资产配置
策略组合通过将多个策略或资产组合在一起,分散风险并提高整体表现。
4.4.1 创建策略组合
def create_strategy_portfolio(df: pd.DataFrame) -> vbt.Portfolio:"""创建策略组合。:param portfolios: 包含多个策略的回测结果列表:return: 组合后的回测结果"""# 应用策略df["signal1"] = generate_signals(df)["signal"]df["signal2"] = generate_multi_factor_signals(df)["signal"]# 组合信号df["combined_signal"] = (df["signal1"] + df["signal2"]) / 2df["final_signal"] = np.where(df["combined_signal"] > 0.5,1,np.where(df["combined_signal"] < -0.5, -1, 0),)# 创建组合投资组合combined_portfolio = vbt.Portfolio.from_signals(close=df["close"],entries=data["final_signal"] == 1,exits=data["final_signal"] == -1,freq="D",init_cash=100000,fees=0.001,slippage=0.001,sl_stop=0.05,tp_stop=0.10,)return combined_portfolio# 示例:创建策略组合
data = load_data_from_parquet("./data/600519.SH.parquet")
combined_portfolio = create_strategy_portfolio(data)
4.4.2 评估组合性能
def evaluate_portfolio_performance(portfolio: vbt.Portfolio) -> pd.DataFrame:"""评估组合性能。:param portfolio: 组合后的回测结果:return: 性能报告"""# 打印关键指标evaluate_performance(portfolio)# 生成性能报告report = generate_performance_report(portfolio)return report# 示例:评估组合性能
evaluate_portfolio_performance(combined_portfolio)
输出:
性能报告:
Start 2020-01-02 00:00:00
End 2024-12-31 00:00:00
Period 1212 days 00:00:00
Start Value 100000.0
End Value 125896.878873
Total Return [%] 25.896879
Benchmark Return [%] 34.867257
Max Gross Exposure [%] 100.0
Total Fees Paid 3108.780065
Max Drawdown [%] 48.79735
Max Drawdown Duration 941 days 00:00:00
Total Trades 8
Total Closed Trades 7
Total Open Trades 1
Open Trade PnL 12166.653858
Win Rate [%] 28.571429
Best Trade [%] 53.223844
Worst Trade [%] -14.092116
Avg Winning Trade [%] 29.915815
Avg Losing Trade [%] -6.885613
Avg Winning Trade Duration 283 days 00:00:00
Avg Losing Trade Duration 95 days 00:00:00
Profit Factor 1.280865
Expectancy 1961.460716
Sharpe Ratio 0.375743
Calmar Ratio 0.147171
Omega Ratio 1.059886
Sortino Ratio 0.558034
dtype: object
总结
通过本章,你已经掌握了以下内容:
- 多因子策略:如何结合多个技术指标生成交易信号。
- 机器学习策略:如何使用机器学习模型预测市场走势。
- 风险管理:如何模拟交易成本并设置止损和止盈。
- 策略组合:如何将多个策略组合在一起并评估组合性能。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。
相关文章:
VectorBT量化入门系列:第四章 高级策略开发与优化
VectorBT量化入门系列:第四章 高级策略开发与优化 本教程专为中高级开发者设计,系统讲解VectorBT技术在量化交易中的应用。通过结合Tushare数据源和TA-Lib技术指标,深度探索策略开发、回测优化与风险评估的核心方法。从数据获取到策略部署&am…...
JVM虚拟机篇(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解
JVM垃圾回收器全面解析与G1深度探秘及四种引用详解 JVM虚拟机(七):JVM垃圾回收器全面解析与G1深度探秘及四种引用详解一、JVM有哪些垃圾回收器1. Serial回收器2. ParNew回收器3. Parallel Scavenge回收器4. Serial Old回收器5. Parallel Old回…...
【蓝桥杯】15届JAVA研究生组F回文字符串
一、思路 1.这题去年考的时候想的是使用全排列进行尝试,实际不用这么麻烦,只用找到第一个和最后一个非特殊字符串的位置,然后分别向内检查是否对称,向外检查是否对称直到左指针小于0(可以通过添加使其对称) 2.至于如何找到第一个…...
TDengine 语言连接器(Python )
简介 taospy 是 TDengine 数据库面向 Python 语言提供的官方连接器,连接器对外提供对数据库写入、查询、订阅等多种访问接口。 安装连接器命令如下: # 原生连接和 REST 连接 pip3 install taospy# WebSocket 连接,可选装 pip3 install tao…...
Android compose源码浅析——Modifier
Modifier浅析 Modifier的使用foldOutfoldInanyall总结Modifier的使用 先来一段代码1: @Preview(showBackground = true) @Composable fun GreetingPreview() {ComposeTestTheme {Box(modifier = Modifier.size(DpSize(Dp(100f),Dp(100f))).padding(Dp(10f)).background(Colo…...
基于机器视觉的多孔零件边缘缺陷检测(源码C++、opencv、凸包、凸缺陷检测)
👑主页:吾名招财 👓简介:工科学硕,研究方向机器视觉,爱好较广泛… 💫签名:面朝大海,春暖花开! 基于机器视觉的多孔零件边缘缺陷检测(源码C、ope…...
JAVAWeb_Servlet:前置准备与理论简易介绍
要写JAVA_Web:首先就得建个项目——如何在Eclipse新建一个Web项目-CSDN博客 然后我们考虑具体的代码细节(接下来就是我们的前置准备) 一、导包: 在 Eclipse 中,如果需要快速导入缺失的包(例如࿰…...
反射 tcp
反射 临时越过权限 获取成员变量1并进行修改 成员方法 TCP客户端...
UML综合实验四
1. 计算机包含内存(RAM)、CPU等硬件设备,根据下面的“产品等级结构-产品族”示意图,使用抽象工厂模式实现计算机设备创建过程并绘制相应的类图。 2. 电脑组装工厂可以将CPU、内存、硬盘、主机、显示器等硬件设备组装在一起构成一台完整的电脑,…...
<《AI大模型应知应会100篇》第8篇:大模型的知识获取方式及其局限性
第8篇:大模型的知识获取方式及其局限性 摘要 大模型(如GPT、BERT、Qwen、DeepSeek等)凭借其卓越的自然语言处理能力,已经成为人工智能领域的明星。然而,这些模型“知道”什么?它们如何获取知识?…...
【回眸】Linux 内核 (十六) 之 多线程编程 下
前言 前面介绍了互斥锁,本篇博文介绍死锁及其他多线程遇到的情况。 什么情况会造成死锁 死锁指的是两个或两个以上的运算单元(进程、线程或协程),互相持有对方所需的资源,导致它们都无法向前推进,从而导…...
学习笔记083——Java Stream API
文章目录 1、过滤数据 filter()2、转换元素 map()3、排序 sorted()3.1、自定义排序规则 4、去重 distinct()5、限制元素数量 limit()6、收集结果 collect()6.1、收集为List6.2、收集为Set6.3、转为Map6.4、基本用法(注意键冲突会抛异常)6.5、处理键冲突&…...
逍遥模拟器ARM过检测技术全解析
逍遥模拟器ARM框架安装magisk和修改设备型号隐藏应用隐藏root过检测 逍遥模拟器ARMmagisk改设备型号隐藏应用隐藏root 引言 逍遥模拟器以其出色的性能和丰富的功能,深受广大用户喜爱,让用户能在电脑上轻松运行各类安卓应用和游戏。然而,为保…...
Easysearch VS Opensearch 数据写入与存储性能对比
本文记录 Easysearch 和 Opensearch 数据写入和数据存储方面的性能对比。 准备 压测工具:INFINI Loadgen 对比版本: Easysearch 1.11.1(lucene 8.11.4)Opensearch 2.19.1(lucene 9.12.1) 节点 JVM 配置…...
C++中STL学习(一)——向量、栈、堆、集合
#include “bits/stdc.h” using namespace std; int main() { // -------------------- 1、向量vector:可以替换数组,不需要事先指定长度 // ------------------------- vector arr; // 构建int数组 vector arr1(100); // 构建初始长度100的int向量 ve…...
柑橘病虫害图像分类数据集OrangeFruitDataset-8600
文章目录 1. 前言2. 数据类别介绍3. 数据集地址 1. 前言 柑橘,作为水果界的 “宠儿”,不仅以其酸甜可口的味道深受大众喜爱,更是在全球水果产业中占据着举足轻重的地位。无论是早餐中的一杯橙汁,还是下午茶里的柑橘甜点ÿ…...
leetcode刷题-单调栈
代码随想录单调栈|739. 每日温度、496.下一个更大元素 I、503.下一个更大元素II、42. 接雨水、84.柱状图中最大的矩形 739. 每日温度496.下一个更大元素 I503.下一个更大元素II42. 接雨水 -- 面试常考题84.柱状图中最大的矩形 739. 每日温度 leetcode题目链接 代码随想录文档讲…...
【设计模式】访问者模式
**简介 假设你有一个购物车(对象结构),里面有多种商品(元素),如苹果、牛奶、书籍。每个商品的计价规则不同: 水果按重量计价牛奶按数量计价书籍按固定价格计价 现在需要实现两种功能࿱…...
【ISP】ISP pipeline(AI)
ISP Pipeline 全流程概览 ISP(Image Signal Processing,图像信号处理)流程通常从原始 Bayer 数据出发,经过一系列模块处理,逐步完成图像校正和增强,最终生成用于显示或编码的标准图像。常见处理模块包括&a…...
【设计模式】模板模式
简介 假设你要冲泡咖啡和茶,两者的流程相似但部分步骤不同: 烧水(公共步骤)加入主材料(咖啡粉/茶叶)添加调料(糖/牛奶)→ 可选步骤倒进杯子(公共步骤) 模板…...
GDB调试程序的基本命令和用法(Qt程序为例)
1. 引言 GDB(GNU Debugger)是一个强大的命令行调试工具,它可以帮助开发者在程序运行时查找和修复错误。当调试Qt程序时,GDB同样适用,并且能够帮助开发者定位诸如数组越界挂死等复杂问题。 2. 基本命令 2.1 启动GDB …...
vue3腾讯云直播 前端推流
1、在index.html文件中引入(在body体中) <script src"https://video.sdk.qcloudecdn.com/web/TXLivePusher-2.1.1.min.js" charset"utf-8"></script> 2、vue文件中,添加video推流(我用的推流地…...
DP_AUX辅助通道介绍
DisplayPort(简称DP)是一个由PC及芯片制造商联盟开发,视频电子标准协会(VESA)标准化的数字式视频接口标准。该接口免认证、免授权金,主要用于视频源与显示器等设备的连接,并也支持携带音频、USB…...
【微机及接口技术】- 第九章 串行通信与串行接口(下)
文章目录 第二节 串行通信协议一、异步串行通信协议二、同步串行通信协议 第三节 串行接口标准RS-232C一、RS-232C信号线定义二、电气特性 第四节 可编程串行接口芯片8251A一、基本性能二、内部结构三、外部引脚功能1. 同CPU的连接信号2. MODEM控制信号(4个…...
人形机器人制造—3D打印推动微型化与轻量化设计
在人形机器人仿生架构的构建中,多模态传感器集群与仿生关节矩阵的拓扑融合,正催生第三代具身智能的力学革命。通过分布式触觉薄膜、双目视觉惯性测量单元(200Hz采样率)与肌电模拟传感器的三重耦合,机器人获得了超越人类…...
前端性能优化高频面试题解析与实战指南(2025版)
一、前端性能优化核心面试题汇总 1. 浏览器加载优化相关问题 Q1:浏览器从输入URL到页面渲染的完整流程中,有哪些关键性能节点? 核心流程:DNS解析 → TCP连接(TLS握手)→ HTTP请求 → 资源下载 → 解析HT…...
【教程】xrdp修改远程桌面环境为xfce4
转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 xfce4 vs GNOME对比 配置教程 1. 安装 xfce4 桌面环境 2. 安装 xrdp 3. 配置 xrdp 使用 xfce4 4. 重启 xrdp 服务 5. 配置防火墙ÿ…...
递增子序列
递增子序列 难点: 结果集如何加:每次进入递归都判断是否sub中的个数>2;不允许对数组排序,如何在每层去重:不可以再用nums[i] nums[i-1](没有意义,重复的元素不一定挨着)&#x…...
Linux磁盘管理双雄:lsblk与df深度解析
在Linux系统管理的日常工作里,磁盘管理占据着极为重要的地位,这里重点介绍lsblk和df这两个命令。 一、lsblk命令:呈现磁盘物理架构 lsblk是用于罗列块设备信息的实用命令,它以直观的树状结构呈现系统中的块设备,帮助…...
C#里设计Modbus-RTU(Remote Terminal Unit)协议
Modbus-RTU(Remote Terminal Unit)是一种串行通信协议,广泛用于工业自动化领域,支持主从式(Master-Slave)通信架构。它是Modbus协议的两种传输模式之一(另一种是ASCII模式),具有高效、简洁、可靠性强的特点,常用于RS-485或RS-232物理层通信。 核心特性 物理层 通常基…...
spark学习内容总结
Spark运行架构总结 一、核心结构 Spark框架的核心是一个计算引擎,整体采用标准的master-slave结构。其中,Driver作为master,负责管理整个集群中的作业任务调度;Executor作为slave,负责实际执行任务。 二、核心组件 …...
MySQL多表查询、事务与索引的实践与应用
摘要:本文围绕MySQL数据库操作展开,通过构建部门与员工管理、餐饮业务相关的数据库表,并填充测试数据,系统地阐述了多表查询的多种方式,包括内连接、外连接和不同类型的子查询,同时介绍了事务的处理以及索引…...
MySQL【8.0.41版】安装详细教程--无需手动配置环境
一、MySQL 介绍 1. 概述 MySQL 是一个开源的关系型数据库管理系统,由瑞典公司 MySQL AB 开发,现属于 Oracle 旗下。它基于 SQL(结构化查询语言)进行数据管理,支持多用户、多线程操作,广泛应用于 Web 应用、…...
FRP练手:hello,world实现
方案一:使用 Flask(推荐) from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "你好啊世界"if __name__ __main__:# 监听所有网络接口(0.0.0.0),端口 3344app.…...
Mysql | 主从复制的工作机制
主从复制的工作机制 Mysql的主从复制 从库主要是读取主库的binlog日志来完成数据同步的, binlog中存储了对数据库所有修改SQL的语句。 首先Master开启BinLog二进制的写入。Slave从库通过ip、port、账号、密码链接到Master主数据库,链接成功后从库会向主数据库获取B…...
清明之后叙
经历了漫长的冬季,春天的脚步近了,要说讲这一年的开始,绝大数人说是从春季,但是我说应该是从冬季开始,中国传统讲冬至是一阳生,冬季收藏好了,开始收敛精气,养精蓄锐,好好…...
Docker新型容器镜像构建技术,如何正确高效的编写Dockerfile
一、容器与容器镜像之间的关系 说到Docker管理的容器不得不说容器镜像,主要因为容器镜像是容器模板,通过容器镜像我们才能快速创建容器。 如下图所示: Docker Daemon通过容器镜像创建容器。 二、容器镜像分类 操作系统类 CentOSUbuntu在do…...
Starrocks的Bitmap索引和Bloom filter索引以及全局字典
写这个的主要作用是梳理一下Starrocks的索引效率以及使用场景。 Starrocks Bitmap索引 原理: Bitmap 索引是一种使用 bitmap 的特殊数据库索引。bitmap 即为一个 bit 数组,一个 bit 的取值有两种:0 或 1。 每一个 bit 对应数据表中的一行&…...
从 0 到上线:Java 项目打包 Docker 镜像全流程实战
📖 摘要 本文是一份超详细的Java项目Docker化实战手册,从环境准备到最终上线,手把手带你完成整个容器化部署流程。你将学会: Docker基础概念与核心原理如何为Java项目编写高效的Dockerfile多阶段构建优化镜像体积镜像推送与容器…...
【符号引用和直接引用是什么?有什么作用?什么场景下使用?为什么符号引用和直接引用在常量池里?】
符号引用与直接引用详解 1. 符号引用(Symbolic Reference) 定义: 符号引用是编译阶段使用的抽象标识符,通过全限定名、方法签名等符号描述目标(如类、方法、字段)。它不涉及具体内存地址,仅作为…...
ESModule和CommonJS在Node中的区别
ESModule console.log(require);//>errorconsole.log(module);//>errorconsole.log(exports);//>errorconsole.log(__filename);//>errorconsole.log(__dirname);//>error全部报错commonjs console.log(require);console.log(module);console.log(exports);co…...
阿里发布实时数字人项目OmniTalker,实时驱动技术再突破~
简介 OmniTalker 是一个由 阿里巴巴集团 Tongyi Lab(通义实验室) 开发的研究项目,专注于实时文本驱动的说话头像生成技术。该项目旨在通过文本输入生成同步的语音和视频内容,同时保留参考视频中的音视频风格。以下是关于 OmniTalk…...
Kubernetes-如何进入某POD中
Kubernetes 如何进入某POD中 工作中需要进入pod中查询比如pod 网络等问题 步骤: 1、 查询某pod, 比如该pod 为namespace test 下的 ip 为 192.168.1.100 #查询namespace 列表 #kubectl get ns #查询该ns下ip 为 192.168.1.100的pod # kubectl -n test get pods …...
java导出postgis空间数据几何对象shapefile文件
项目开发中,需要java后端实现导出postgis空间数据几何对象shapefile文件,以便能直观查看数据详情。注意事项Shapefile 默认的几何字段名为 the_geom,若导出时未显式指定或字段名被修改,部分软件(如 ArcGIS、QGI&#x…...
蓝桥杯嵌入式按键长按双击
直接上代码这个代码里面我们简单实现了如果按键按下时间超过0.8秒K1的值增加,短按只增加一次,按键2长按K2值增加,按键3双击K1的值减1,按键4双击K2的值减1 #include "fun.h" #define long_press_time 800//定义长按时间…...
深入解析Java中的栈:从JVM原理到开发实践
一、栈的双重身份:JVM运行时数据区 vs 数据结构 1. JVM层面的栈 线程私有:每个线程独立拥有自己的栈 LIFO结构:后进先出的方法调用模型 栈帧存储:每个方法对应一个栈帧(Stack Frame) 2. 数据结构中的栈…...
408 计算机网络 知识点记忆(6)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
从ETL到ELT:大数据时代下两者的选型建议及优势
随着大数据时代的到来,数据量呈爆炸式增长,数据类型日益复杂,ETL与ELT两种技术路径的抉择直接影响着数据处理效率。我们这次来深入解析下两种模式的本质差异与应用场景,为企业提供选型建议。 一、ETL架构的优势 ETL架构遵循“提…...
Java蓝桥杯习题一:for循环和字符串的应用
知道循环次数用for循环 练习题1 小明对数位中含有2.0.1.9的数字很感兴趣,在1到40中这样的数包含1.2.9.10至32.39.40,共28个,他们的和是574.请问,在1到2019中,所有这样的数的和是多少?(2019Jav…...
Windows 图形显示驱动开发-WDDM 2.0功能_分配用法跟踪
随着分配列表的消失,视频内存管理器 (VidMm) 不再能够查看特定命令缓冲区中引用的分配。 因此,VidMm 不再能够跟踪分配使用情况和处理相关同步。 此责任现在由用户模式驱动程序 (UMD) 承担。 具体而言,UMD 需要处理与直接 CPU 访问分配和重命…...