当前位置: 首页 > news >正文

【炒股Zero To Hero】MACD金叉死叉到底是否有效,加上这个指标回报率增加197倍

移动平均收敛散度(MACD - Moving Average Convergence Divergence)是一种趋势跟踪动量指标,显示了证券价格的两个移动平均之间的关系。它用于识别趋势的方向和强度,属于技术分析中振荡器的一类。

MACD如何衡量股票及其趋势

有两条线和一个柱:

第一条叫DIF线(差离值)又叫快线,有时也称为MACD线:12周期指数移动平均线(EMA),减去26周期指数移动平均线(EMA),计算得出两个线的差距。

在持续的涨势中,12日EMA在26日EMA之上。其间的正差离值(+DIF)会愈来愈大。反之在下跌趋势中,差离值可能变负(-DIF),此时是绝对值愈来愈大。至于行情开始回转,正或负差离值要缩小到一定的程度,才真正是行情反转的信号。

第二条叫DEA线(信号线)又叫慢线:根据DIF值计算其指数9日移动平均值(EMA),即离差(DIF)的平均值。

除此之外,还有一个柱状图,即快线–慢线所得的值呈现出来的直方图。上图的绿色柱代表DIF在DEA上方运行,红色柱代表DIF在DEA下方运行。美股和A股可能颜色是相反的,但是不影响我们理解。

交易者可能会在DIF线穿越其DEA线以上时买入证券,并在DIF线穿越DEA线以下时卖出或做空证券。

为什么它可能有效

MACD之所以有效,是因为它将动量和趋势结合在一个指标中。MACD线和信号线之间的差异指示了价格运动的强度,使交易者能够识别趋势变化周围的潜在买入或卖出机会。其有效性基于动量往往会在价格之前改变方向的原理。因此,MACD可以提供趋势反转的早期信号。

举个例子,一个物体在加速运行的时候,它的动能是很大的,除非有很大的外力阻止它,否则它会受惯性影响一直运动下去,直到动能为0。

MACD背后的逻辑

MACD的逻辑在于其能够通过比较短期和长期价格趋势来监测动量变化。当短期价格趋势开始超过长期趋势时,它可以是价格运动动量增加的信号,可能标志着购买或出售的机会。相反,当短期趋势相对于长期趋势减弱时,它可以表明动量减少,可能标志着趋势的逆转或放缓。

使用MACD的有效交易模型

基于MACD指标,有几种有效的交易模型和策略:

  1. MACD交叉:当DIF线穿越DEA线以上时买入,当它穿越以下时卖出。
  2. MACD背离:寻找MACD趋势和价格趋势之间的差异作为可能的逆转信号。
  3. MACD超买/超卖条件:当MACD从零线延伸得太远时,标识潜在的买入或卖出点,指示超买或超卖条件。

以特斯拉股票为例,时间从2020.1.1 ~ 2024.1.1四年数据,初始资金为1万美元,以日线级别作为回测已经,假设条件触发就全仓买入或者全仓卖出,利用MACD金叉死叉策略回测结果。

a) 编写MACD金叉死叉策略:

当macd线穿越Singal线向上运行时,买入;相反,当macd线穿越Singal线往下运行时,卖出;

import os
import yfinance as yf
import backtrader as bt
from datetime import datetime
import matplotlib.pyplot as plt
import pandas as pd%matplotlib inline#Only MACD
class MACDStrategy(bt.Strategy):params = (('macd1', 12),('macd2', 26),('macdsignal', 9),)def log(self, txt, dt=None):''' Logging function for this strategy'''dt = dt or self.datas[0].datetime.date(0)print(f'{dt.isoformat()}, {txt}')def __init__(self):self.macd = bt.indicators.MACD(self.data.close,period_me1=self.params.macd1,period_me2=self.params.macd2,period_signal=self.params.macdsignal)self.crossover = bt.indicators.CrossOver(self.macd.macd, self.macd.signal)self.order = Noneself.buy_signals = []self.sell_signals = []#self.macd_hist = self.macd.macd - self.macd.signaldef notify_order(self, order):#print('notify_order')if order.status == order.Submitted:# Order has been submitted/accepted to/by brokerself.log('Order Submitted')if order.status == order.Accepted:# Order has been submitted/accepted to/by brokerself.log('Order Accepted')if order.status in [order.Completed]:if order.isbuy():self.log(f'BUY EXECUTED, Price: {order.executed.price}, Cost: {order.executed.value}, Commission: {order.executed.comm}')self.log(f'Cash after buying: {self.broker.getcash()}')self.buy_signals.append(self.datas[0].datetime.date(0))elif order.issell():self.log(f'SELL EXECUTED, Price: {order.executed.price}, Cost: {order.executed.value}, Commission: {order.executed.comm}')self.log(f'Cash after selling: {self.broker.getcash()}')self.sell_signals.append(self.datas[0].datetime.date(0))self.order = Nonedef next(self):if self.order:  # Check if an order is pending, if so, we cannot send a 2nd onereturncash_available = self.broker.getcash()  # Get the current cash levelcurrent_price = self.data.close[0]  # Current price of the stocksize = int(cash_available / current_price)  # Number of shares you can buy#print(f'Current Close: {self.data.close[0]}')if not self.position:  # Not in the marketif self.crossover > 0: # MACD crosses above signal line#self.log('BUY CREATE, %.2f' % self.data.close[0])#self.order = self.buy()  # MACD crosses above signal lineif cash_available > current_price:  # Check if you have enough cash to buy at least one shareself.log(f'BUY CREATE, %.2f' % current_price)self.order = self.buy(size=size)  # Adjust the size according to your strategy needselse:self.log(f'Insufficient cash to buy. Available cash: {cash_available}, Current price: {current_price}')elif self.crossover < 0:  # MACD crosses below signal lineself.log('SELL CREATE, %.2f' % self.data.close[0])self.order = self.close()#self.sell_signals.append(self.datas[0].datetime.date(0))

b) 开始回测:

#Back test only for one stock
cerebro = bt.Cerebro()
cerebro.addstrategy(MACDStrategy)
datapath = 'data.csv'data_df = yf.download('TSLA', start="2020-01-01", end="2024-01-01")
#print(data_df)
data = bt.feeds.PandasData(dataname=data_df)
#data = bt.feeds.YahooFinanceData(dataname=, fromdate=datetime(2019, 1, 1), todate=datetime(2020, 12, 31))
cerebro.adddata(data)
cerebro.addsizer(bt.sizers.FixedSize, stake=100)
cerebro.broker.set_cash(10000)
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe_ratio')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='draw_down')
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')  # For Total and Annualized Returns
cerebro.addanalyzer(bt.analyzers.SQN, _name='sqn')  # System Quality Number can hint at the win rate
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trade_analyzer')  # For Win Rate, Profit-Loss Ratioprint('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
strat = results[0]
buy_signals = strat.buy_signals
sell_signals = strat.sell_signals
# Sharpe Ratio
sharpe_ratio = strat.analyzers.sharpe_ratio.get_analysis()['sharperatio']
print(f"Sharpe Ratio: {sharpe_ratio}")# Maximum Drawdown
max_drawdown = strat.analyzers.draw_down.get_analysis()['max']['drawdown']
print(f"Maximum Drawdown: {max_drawdown}%")# Total Return
total_return = strat.analyzers.returns.get_analysis()['rtot']
print(f"Total Return: {total_return * 100}%")# Annualized Return
annual_return = strat.analyzers.returns.get_analysis()['rnorm100']
print(f"Annualized Return: {annual_return}%")# Sortino Ratio
#sortino_ratio = strat.analyzers.sortino_ratio.get_analysis()['sortino']
#print(f"Sortino Ratio: {sortino_ratio}")# Win Rate and Profit-Loss Ratio
trade_analysis = strat.analyzers.trade_analyzer.get_analysis()
total_closed = trade_analysis.get('total', {}).get('closed', 0)if total_closed > 0:win_rate = (trade_analysis.get('won', {}).get('total', 0) / total_closed) * 100won_avg = trade_analysis.get('won', {}).get('pnl', {}).get('average', 0)lost_avg = trade_analysis.get('lost', {}).get('pnl', {}).get('average', 0)profit_loss_ratio = abs(won_avg / lost_avg) if lost_avg != 0 else "undefined"print(f"Win Rate: {win_rate}%")print(f"Profit-Loss Ratio: {profit_loss_ratio}")
else:print("No trades closed.")print('Ending Portfolio Value: %.2f' % cerebro.broker.getvalue())#cerebro.plot()

回测结果为:

  • 初始投资组合价值:10000.00元
  • 夏普比率:0.08717907196315927
  • 最大回撤:48.50573641490451%
  • 总回报率:-4.509942626137697%
  • 年化回报率:-1.1233697243742937%
  • 胜率:35.0%
  • 盈亏比:1.8030867851982686
  • 结束投资组合价值:9559.02元

注:每次触发条件一会我们会下单,但是并非每次都一定买到,有可能因为下单价格和实际价格有出入导致无法达成交易,但是不影响我们的回测结果。

我们发现,我们的回报率为负,初始资金未必能得到保障。我们展示下买入点:

# Assuming 'data' is a DataFrame with your price data and 'dates' as its index
plt.figure(figsize=(14, 7))
plt.plot(data_df['Close'], label='Close Price', alpha=0.5)# Convert buy and sell signal dates from datetime.date to pandas timestamps for indexing
buy_signals_dt = pd.to_datetime(buy_signals)
sell_signals_dt = pd.to_datetime(sell_signals)plt.scatter(buy_signals_dt, data_df.loc[buy_signals_dt, 'Close'], label='Buy Signal', marker='^', color='green')
plt.scatter(sell_signals_dt, data_df.loc[sell_signals_dt, 'Close'], label='Sell Signal', marker='v', color='red')plt.title("MACD Strategy Backtest")
plt.legend()
plt.show()

下面我们引入RSI(相对强弱指数)是技术分析中广泛使用的一个强大指标,特别是在股票交易领域。它主要用于帮助交易者识别股票或其他资产价格中的超买或超卖条件,这些条件暗示着潜在的反转点。我们结合MACD金叉死叉策略进行再次尝试:

import os
import yfinance as yf
import backtrader as bt
from datetime import datetime
import matplotlib.pyplot as plt
import pandas as pd%matplotlib inlineclass MACD_RSI_Strategy(bt.Strategy):params = (('macd1', 12),('macd2', 26),('macdsig', 9),('rsi_period', 14),('rsi_upper', 70),   # RSI overbought threshold('rsi_lower', 30),   # RSI oversold threshold)def log(self, txt, dt=None):''' Logging function for this strategy '''dt = dt or self.datas[0].datetime.date(0)print(f'{dt.isoformat()}, {txt}')def __init__(self):# Initialize MACD and RSI indicatorsself.macd = bt.indicators.MACD(self.data.close,period_me1=self.p.macd1,period_me2=self.p.macd2,period_signal=self.p.macdsig)self.rsi = bt.indicators.RSI(self.data.close, period=self.p.rsi_period)self.crossover = bt.indicators.CrossOver(self.macd.macd, self.macd.signal)# Attributes to track buy and sell signal datesself.buy_signals = []self.sell_signals = []# To keep track of pending ordersself.order = Nonedef notify_order(self, order):if order.status == order.Submitted:self.log('Order Submitted')if order.status == order.Accepted:self.log('Order Accepted')if order.status == order.Completed:if order.isbuy():self.log(f'BUY EXECUTED, Price: {order.executed.price}, Cost: {order.executed.value}, Commission: {order.executed.comm}')self.log(f'Cash after buying: {self.broker.getcash()}')self.buy_signals.append(self.datas[0].datetime.date(0))elif order.issell():self.log(f'SELL EXECUTED, Price: {order.executed.price}, Cost: {order.executed.value}, Commission: {order.executed.comm}')self.log(f'Cash after selling: {self.broker.getcash()}')self.sell_signals.append(self.datas[0].datetime.date(0))elif order.status in [order.Canceled, order.Margin, order.Rejected]:self.log('Order Canceled/Margin/Rejected')def next(self):if self.order:  # Check if an order is pending, if so, we cannot send a 2nd onereturncash_available = self.broker.getcash()current_price = self.data.close[0]size = int(cash_available / current_price)  # Simplistic size calculationif not self.position:if self.crossover > 0 and self.rsi < self.p.rsi_upper:  # Buy conditionif cash_available > current_price:  # Ensure sufficient cashself.log(f'BUY CREATE, {current_price}')self.order = self.buy(size=size)else:self.log(f'Insufficient cash to buy. Available cash: {cash_available}, Current price: {current_price}')elif self.crossover < 0 or self.rsi > self.p.rsi_upper:  # Sell conditionself.log(f'SELL CREATE, {current_price}')self.order = self.sell()  # Use self.close() if wanting to close the entire position

再次回测结果为

#Back test only for one stock
cerebro = bt.Cerebro()
cerebro.addstrategy(MACD_RSI_Strategy)
datapath = 'data.csv'data_df = yf.download('TSLA', start="2020-01-01", end="2024-01-01")
#print(data_df)
data = bt.feeds.PandasData(dataname=data_df)
#data = bt.feeds.YahooFinanceData(dataname=, fromdate=datetime(2019, 1, 1), todate=datetime(2020, 12, 31))
cerebro.adddata(data)
cerebro.addsizer(bt.sizers.FixedSize, stake=100)
cerebro.broker.set_cash(10000)
cerebro.addanalyzer(bt.analyzers.SharpeRatio, _name='sharpe_ratio')
cerebro.addanalyzer(bt.analyzers.DrawDown, _name='draw_down')
cerebro.addanalyzer(bt.analyzers.Returns, _name='returns')  # For Total and Annualized Returns
cerebro.addanalyzer(bt.analyzers.SQN, _name='sqn')  # System Quality Number can hint at the win rate
cerebro.addanalyzer(bt.analyzers.TradeAnalyzer, _name='trade_analyzer')  # For Win Rate, Profit-Loss Ratioprint('Starting Portfolio Value: %.2f' % cerebro.broker.getvalue())
results = cerebro.run()
strat = results[0]
buy_signals = strat.buy_signals
sell_signals = strat.sell_signals
# Sharpe Ratio
sharpe_ratio = strat.analyzers.sharpe_ratio.get_analysis()['sharperatio']
print(f"Sharpe Ratio: {sharpe_ratio}")# Maximum Drawdown
max_drawdown = strat.analyzers.draw_down.get_analysis()['max']['drawdown']
print(f"Maximum Drawdown: {max_drawdown}%")# Total Return
total_return = strat.analyzers.returns.get_analysis()['rtot']
print(f"Total Return: {total_return * 100}%")# Annualized Return
annual_return = strat.analyzers.returns.get_analysis()['rnorm100']
print(f"Annualized Return: {annual_return}%")# Sortino Ratio
#sortino_ratio = strat.analyzers.sortino_ratio.get_analysis()['sortino']
#print(f"Sortino Ratio: {sortino_ratio}")# Win Rate and Profit-Loss Ratio
trade_analysis = strat.analyzers.trade_analyzer.get_analysis()
total_closed = trade_analysis.get('total', {}).get('closed', 0)if total_closed > 0:win_rate = (trade_analysis.get('won', {}).get('total', 0) / total_closed) * 100won_avg = trade_analysis.get('won', {}).get('pnl', {}).get('average', 0)lost_avg = trade_analysis.get('lost', {}).get('pnl', {}).get('average', 0)profit_loss_ratio = abs(won_avg / lost_avg) if lost_avg != 0 else "undefined"print(f"Win Rate: {win_rate}%")print(f"Profit-Loss Ratio: {profit_loss_ratio}")
else:print("No trades closed.")print('Ending Portfolio Value: %.2f' % cerebro.broker.getvalue())#cerebro.plot()
 

起始投资组合价值:10000.00

夏普比率:0.6716775968520321

最大回撤:73.56996064486884%

总回报:197.974046126522%

年化回报:64.20066841327395%

胜率:未平仓交易。  

结束时的投资组合价值:72408.63

初始和结束投资组合价值

  • MACD的策略起始和结束投资组合价值从10000元降低到9559.02元,表明在策略执行期间投资组合价值下降了。
  • MACD-RSI策略的投资组合价值从10000元增加到72408.63元,显示出显著的正回报。

夏普比率

  • MACD的夏普比率为0.087,表明每承担一单位总风险获得的额外回报较低。
  • MACD-RSI的夏普比率为0.672,显著高于MACD策略,意味着相对于风险而言,回报率更优。

最大回撤

  • MACD策略的最大回撤为48.51%,指出最大的价值下降比例。
  • MACD-RSI策略有更高的最大回撤,为73.57%,表明其面临更高的价格波动和潜在的下跌风险。

总回报率和年化回报率

  • MACD策略的总回报率为-4.51%,年化回报率为-1.12%,表明投资组合在期间内亏损。
  • MACD-RSI策略的总回报率为197.97%,年化回报率为64.20%,显示出极高的盈利性。

胜率和盈亏比

  • MACD策略的胜率为35%,盈亏比为1.80,表明虽然盈利次数少,但盈利交易相对于亏损交易仍然具有较好的表现。
  • MACD-RSI策略的胜率未提供,但结束时投资组合的显著增值可能意味着高胜率或几笔大额盈利交易。

结论

比较这两种策略,MACD-RSI在总回报率和年化回报率方面表现显著优于单独使用MACD的策略。尽管MACD-RSI策略承受了更高的最大回撤,表明更大的价格波动和下行风险,但其显著的高夏普比率和总回报表明了其在风险调整后的回报方面的优越性。然而,投资者在选择策略时应考虑自己的风险容忍度和投资目标。

相关文章:

【炒股Zero To Hero】MACD金叉死叉到底是否有效,加上这个指标回报率增加197倍

移动平均收敛散度&#xff08;MACD - Moving Average Convergence Divergence&#xff09;是一种趋势跟踪动量指标&#xff0c;显示了证券价格的两个移动平均之间的关系。它用于识别趋势的方向和强度&#xff0c;属于技术分析中振荡器的一类。 MACD如何衡量股票及其趋势 有两…...

Linux网络名称空间和虚拟机有何区别

在Linux系统中&#xff0c;网络名称空间和虚拟机都是实现资源隔离和虚拟化的技术&#xff0c;但它们在设计理念、实现机制、资源消耗、使用场景等方面存在着显著的区别。本文旨在全方位、系统性地分析这两种技术的区别。&#x1f50d; 1. 设计理念与实现机制 1.1. 网络名称空…...

【UE Niagara】蓝图获取粒子数据

目录 效果 步骤 一、创建粒子 二、创建蓝图接收Niagara参数 效果 步骤 一、创建粒子 1. 新建一个Niagara发射器&#xff0c;使用Empty模板&#xff0c;打开后先添加“Spawn Rate”模块&#xff0c;这里设置粒子生成速率为0.7 在“Initialize Particle”模块中设置粒子颜色…...

更改el-cascade默认的value和label的键值

后端返回的树结构中&#xff0c;label的key不是el-cascade默认的label&#xff0c;我需要改成对应的字段&#xff0c;但是一直没有成功&#xff0c;我也在文档中找到了说明&#xff0c;但是我没注意这是在props中改&#xff0c;导致一直不成功 这是我一开始错误的写法&#xf…...

2024邮件工单系统排行揭晓:出海必备新宠

2024年各大榜单结果纷纷出炉&#xff0c;一起来看看2024十大邮件工单系统最新排行吧&#xff01; 2024十大邮件工单系统 1、Zoho Desk&#xff1b;2、FreshDesk&#xff1b;3、Service Desk Plus&#xff1b;4、Help Scout&#xff1b;5、Helpshift&#xff1b;6、HongDans&am…...

java题目17:以m行n列二维数组为参数进行方法调用,分别计算二维数组各列元素之和,返回并输出计算结果(MethodCalls17)

每日小语 伟大企业的一项特质是“利润之上的追求”。——段永平 思考 方法调用 方法调用是通过在代码中使用方法名和参数列表来实现的。 public class MethodExample {public static void main(String[] args) {// 调用方法add&#xff0c;并传入两个参数int sum add(3, 5…...

Python中Python-docx 包的run介绍

先对run做一个简单地介绍。每个paragraph对象都包含一个run对象的列表。举例&#xff1a; 这是一个简短的段落。 from docx import Document doc Document("1.docx") #上面这段话保存在1.docx中 print("这一段的run个数是&#xff1a;",len(doc.paragr…...

vue2升级到vue3的一些使用注意事项记录(三)

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://122.227.135.243:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a…...

SwiftUI Swift 显示隐藏系统顶部状态栏

Show me the code // // TestHideSystemTopBar.swift // pandabill // // Created by 朱洪苇 on 2024/4/1. //import SwiftUIstruct TestHideSystemTopBar: View {State private var isStatusBarHidden falsevar body: some View {Button {withAnimation {self.isStatusBa…...

PowerJob 分布式任务调度简介

目录 适用场景 设计目标 PowerJob 功能全景 任务调度 工作流 分布式计算 动态容器 什么是动态容器? 使用场景 可维护性和灵活性的完美结合 实时日志&在线运维 PowerJob 系统组件 PowerJob 应用场景 PowerJob 的优势 PowerJob&#xff08;原OhMyScheduler&…...

Java——数组练习

目录 一.数组转字符串 二.数组拷贝 三.求数组中元素的平均值 四.查找数组中指定元素(顺序查找) 五.查找数组中指定元素(二分查找) 六.数组排序(冒泡排序) 七.数组逆序 一.数组转字符串 代码示例&#xff1a; import java.util.Arrays int[] arr {1,2,3,4,5,6}; String…...

波士顿房价预测案例(python scikit-learn)---多元线性回归(多角度实验分析)

波士顿房价预测案例&#xff08;python scikit-learn&#xff09;—多元线性回归(多角度实验分析) 这次实验&#xff0c;我们主要从以下几个方面介绍&#xff1a; 一、相关框架介绍 二、数据集介绍 三、实验结果-优化算法对比实验&#xff0c;数据标准化对比实验&#xff0…...

在 Queue 中 poll()和 remove()有什么区别?

在Java的Queue接口中&#xff0c;poll()和remove()方法都用于从队列中删除并返回队列的头部元素&#xff0c;但是它们在队列为空时的行为有所不同。 poll()方法&#xff1a;当队列为空时&#xff0c;poll()方法会返回null&#xff0c;而不会抛出异常。这是它的主要特点&#x…...

实现鼠标在页面点击出现焦点及大十字星

近段时间&#xff0c;在完成项目进度情况显示时候&#xff0c;用户在操作鼠标时候&#xff0c;显示当鼠标所在位置对应时间如下图所示 代码实现步骤如下&#xff1a; 1.首先引用 jquery.1.7.js 2.再次引用raphael.js 3.然后引用graphics.js 4.最后引用mfocus.js 其中mfocu…...

如何在 7 天内掌握C++?

大家好&#xff0c;我是小康&#xff0c;今天我们来聊下如何快速学习 C 语言。 本篇文章适合于有 C 语言编程基础的小伙伴们&#xff0c;如果还没有学习过 C&#xff0c;请看这篇文章先入个门&#xff1a;C语言快速入门 引言&#xff1a; C&#xff0c;作为一门集面向过程和…...

FineBI概述

FineBI是一种商业智能&#xff08;BI&#xff09;软件&#xff0c;旨在帮助企业从数据中获取见解并做出更明智的业务决策。以下是FineBI的详细概述&#xff1a; 功能特性&#xff1a; 数据连接与整合&#xff1a;FineBI可以连接到各种数据源&#xff0c;包括数据库、数据仓库、…...

百度Create AI开发者大会剧透丨用好三大AI神器 ,人人都是开发者

程序员会消失&#xff0c;真的吗&#xff1f;大模型的下一站是什么&#xff1f;开发者的机会在哪里&#xff1f;什么才是最好用的AI应用开发工具&#xff1f;在4月16日举办的2024百度Create AI开发者大会上&#xff0c;百度创始人、董事长兼首席执行官李彦宏将就这些备受瞩目的…...

外包干了17天,技术倒退明显

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01; 而我已经在一个企业干了四年的功能…...

Unity类银河恶魔城学习记录12-8 p130 Skill Tree UI源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili UI.cs using UnityEngine;public class UI : MonoBehaviour {[SerializeFi…...

priority_queue的使用以及模拟实现

前言 上一期我们对stack和queue进行了使用的介绍&#xff0c;以及对底层的模拟实现&#xff01;以及容器适配器做了介绍&#xff0c;本期我们在来介绍一个容器适配器priority_queue&#xff01; 本期内容介绍 priority_queue的使用 仿函数介绍 priority_queue的模拟实现 什么…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列&#xff0c;以便知晓哪些列包含有价值的数据&#xff0c;…...

LRU 缓存机制详解与实现(Java版) + 力扣解决

&#x1f4cc; LRU 缓存机制详解与实现&#xff08;Java版&#xff09; 一、&#x1f4d6; 问题背景 在日常开发中&#xff0c;我们经常会使用 缓存&#xff08;Cache&#xff09; 来提升性能。但由于内存有限&#xff0c;缓存不可能无限增长&#xff0c;于是需要策略决定&am…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...