利用Python构建宁德时代、比亚迪、隆基绿能股票时间序列预测模型

news2024/9/20 16:44:20

存货

import tushare as ts
# 导包
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import find_peaks
from scipy.stats import norm
import datetime
import pandas as pd
import seaborn as sns # pip install seaborn
import matplotlib.patches as mpatches
#from empyrical import sharpe_ratio,omega_ratio,alpha_beta,stats # pip install empyrical
import warnings
warnings.filterwarnings('ignore')
ts.set_token('066decd1fadb71f9a675e3baa40bb0cb56e58815cf10682709b96315')
api = ts.pro_api()
#获取宁德时代股票数据
NDSD = api.query('daily',ts_code='300750.SZ',start_date='20190901',end_date='20220630')
#获取比亚迪股票数据
BYD = api.query('daily',ts_code='002594.SZ',start_date='20190901',end_date='20220630')
#获取隆基绿能股票数据
LJLN = api.query('daily',ts_code='601012.SH',start_date='20190901',end_date='20220630')
LJLN

在这里插入图片描述

#存放3家公司的收盘价
closeDf = pd.DataFrame()
#合并3家公司的收盘价
closeDf = pd.concat([closeDf,NDSD['trade_date'],NDSD['close'],BYD['close'],LJLN['close']],axis=1)
#重命名列名为公司名称
closeDf.columns=['日期','宁德时代','比亚迪','隆基绿能']
#将日期设置为行索引
closeDf['日期'] = pd.to_datetime(closeDf['日期'])
closeDf.set_index('日期',inplace=True)
closeDf = closeDf.sort_index(ascending=True)
closeDf

在这里插入图片描述

# 配对策略
# Analysis object:BYD&GM
# Comparison of closing price line chart
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #用来显示中文标签
plt.rcParams['axes.unicode_minus'] = False #用来正常显示负号
plt.style.use('ggplot')
ax1 = closeDf.plot(y='宁德时代',label='宁德时代',figsize=(16,8))
closeDf.plot(ax=ax1,y='比亚迪',label='比亚迪')
closeDf.plot(ax=ax1,y='隆基绿能',label='隆基绿能')
plt.title('Closing price comparison')
plt.xlabel('Date')
plt.ylabel('Close')
plt.grid(True)

在这里插入图片描述

# 收盘价走势
plt.style.use('ggplot') # 样式
color_palette=sns.color_palette("hls",10) # 颜色
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
fig = plt.figure(figsize = (16,12))
tickers = ['宁德时代','比亚迪','隆基绿能']
for i,j in enumerate(tickers):
    plt.subplot(2,2,i+1)
    closeDf[j].plot(kind='line', style=['-'],color=color_palette[i],label=j)
    plt.xlabel('')
    plt.ylabel('closing prices')
    plt.title('{} - 收盘价走势图'.format(j))
    plt.legend()
plt.tight_layout()

在这里插入图片描述

# 每日的收益率走势
plt.style.use('ggplot')
color_palette=sns.color_palette("hls",10)
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
fig = plt.figure(figsize = (16,15))
tickers = ['宁德时代','比亚迪','隆基绿能']
for i,j in enumerate(tickers):
    plt.subplot(5,2,i+1)
    closeDf[j].pct_change().plot(kind='line', style=['-'],color=color_palette[i],label=j)
    plt.xlabel('')
    plt.ylabel('percentage')
    plt.title('{} - 每日的收益率走势图'.format(j))
    plt.legend()
plt.tight_layout()

在这里插入图片描述

# 日平均收益
tickers = ['宁德时代','比亚迪','隆基绿能']
for i in tickers:
    r_daily_mean = ((1+closeDf[i].pct_change()).prod())**(1/closeDf[i].shape[0])-1
    #print("%s - Average daily return:%f"%(i,r_daily_mean))
    print("%s - 日平均收益:%s"%(i,str(round(r_daily_mean*100,2))+"%"))

在这里插入图片描述

# 日收益率的概率分布图
# 查看分布情况
plt.style.use('ggplot')
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
fig = plt.figure(figsize = (16,9))
for i,j in enumerate(tickers):
    plt.subplot(2,2,i+1)
    sns.distplot(closeDf[j].pct_change(), bins=100, color=color_palette[i])
    plt.ylabel('Daily Return')
    plt.title('{} - D日收益率的概率分布图'.format(j))
plt.tight_layout();

在这里插入图片描述

# 累积日收益率
# 累积日收益率有助于定期确定投资价值。可以使用每日百分比变化的数值来计算累积日收益率,只需将其加上1并计算累积的乘积。
# 累积日收益率是相对于投资计算的。如果累积日收益率超过1,就是在盈利,否则就是亏损。
plt.style.use('ggplot')
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
fig = plt.figure(figsize = (16,9))
for i,j in enumerate(tickers):
    plt.subplot(2,2,i+1)
    cc = (1+closeDf[j].pct_change()).cumprod()
    cc.plot(kind='line', style=['-'],color=color_palette[i],label=j)
    plt.xlabel('')
    plt.title('{} - 累积日收益率'.format(j))
    plt.legend()
plt.tight_layout()

在这里插入图片描述

# 月收益率
# 对月收益率进行可视化分析,标注收益率高于四分之三分位数的点。
# 月收益率围绕均线上下波动
fig = plt.figure(figsize = (16,9))
for i,j in enumerate(tickers):
    plt.subplot(2,2,i+1)
    daily_ret = closeDf[j].pct_change()
    mnthly_ret = daily_ret.resample('M').apply(lambda x : ((1+x).prod()-1))
    mnthly_ret.plot(color=color_palette[i]) # Monthly return
    start_date=mnthly_ret.index[0]
    end_date=mnthly_ret.index[-1]
    plt.xticks(pd.date_range(start_date,end_date,freq='Y'),[str(y) for y in range(start_date.year+1,end_date.year+1)])
    # Show points with monthly yield greater than 3/4 quantile
    dates=mnthly_ret[mnthly_ret>mnthly_ret.quantile(0.75)].index   
    for i in range(0,len(dates)):
        plt.scatter(dates[i], mnthly_ret[dates[i]],color='r')
    labs = mpatches.Patch(color='red',alpha=.5, label="Monthly return higher than 3/4")
    plt.title('%s - 月收益率'%j,size=15)
    plt.legend(handles=[labs])
plt.tight_layout()

在这里插入图片描述

# 月平均收益
plt.style.use('ggplot')
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
fig = plt.figure(figsize = (15,9))
for i,j in enumerate(tickers):
    plt.subplot(2,2,i+1)
    daily_ret = closeDf[j].pct_change()
    mnthly_ret = daily_ret.resample('M').apply(lambda x : ((1+x).prod()-1))
    mrets=(mnthly_ret.groupby(mnthly_ret.index.month).mean()*100).round(2) 
    attr=[str(i)+'m' for i in range(1,13)]
    v=list(mrets)
    plt.bar(attr, v,color=color_palette[i],label=j)
    for a, b in enumerate(v):
        plt.text(a, b+0.08,b,ha='center',va='bottom')
    plt.title('{}- 月平均收益 '.format(j))
    plt.legend()
plt.tight_layout()

# 图中显示某些月份具有正的收益率均值,而某些月份具有负的收益率均值,

在这里插入图片描述
Three year compound annual growth rate (CAGR)

复合年增长率(Compound Annual Growth Rate,CAGR)是一项投资在特定时期内的年度增长率 CAGR=(现有价值/基础价值)^(1/年数) - 1 或 (end/start)^(1/# years)-1

它是一段时间内的恒定回报率。换言之,该比率告诉你在投资期结束时,你真正获得的收益。它的目的是描述一个投资回报率转变成一个较稳定的投资回报所得到的预想值

 # 复合年增长率(CAGR)
for i in tickers:
    days = (closeDf[i].index[0] - closeDf[i].index[-1]).days 
    CAGR_3 = (closeDf[i][-1]/ closeDf[i][0])** (365.0/days) - 1 
    print("%s (CAGR):%s"%(i,str(round(CAGR_3*100,2))+"%")

在这里插入图片描述

# 年化收益率
# 年化收益率,是判断一只股票是否具备投资价值的重要标准!
# 年化收益率,即每年每股分红除以股价
for i in tickers:
    r_daily_mean = ((1+closeDf[i].pct_change()).prod())**(1/closeDf[i].shape[0])-1
    annual_rets = (1+r_daily_mean)**252-1
    print("%s'年化收益率:%s"%(i,str(round(annual_rets*100,2))+"%"))

在这里插入图片描述
maximum drawdowns

最大回撤率(Maximum Drawdown),它用于测量在投资组合价值中,在下一次峰值来到之前,最高点和最低点之间的最大单次下降。换言之,该值代表了基于某个策略的投资组合风险。

“最大回撤率是指在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。最大回撤用来描述买入产品后可能出现的最糟糕的情况。最大回撤是一个重要的风险指标,对于对冲基金和数量化策略交易,该指标比波动率还重要。” 最大回撤率超过了自己的风险承受范围,建议谨慎选择。

# 最大回撤率
def getMaxDrawdown(x):
    j = np.argmax((np.maximum.accumulate(x) - x) / x)
    if j == 0:
        return 0
    i = np.argmax(x[:j])
    d = (x[i] - x[j]) / x[i] * 100
    return d
for i in tickers:
    MaxDrawdown = getMaxDrawdown(closeDf[i])
    print("%s maximum drawdowns:%s"%(i,str(round(MaxDrawdown,2))+"%"))

在这里插入图片描述

# calmar率
# Calmar比率(Calmar Ratio) 描述的是收益和最大回撤之间的关系。计算方式为年化收益率与历史最大回撤之间的比率。
# Calmar比率数值越大,股票表现越好。
from pyfinance import TSeries # pip install pyfinance
from empyrical import sharpe_ratio,omega_ratio,alpha_beta,stats # pip install empyrical

def performance(i):
    a = closeDf[i].pct_change()
    s = a.values
    idx = a.index
    tss = TSeries(s, index=idx)
    dd={}
    dd['anlzd_ret']=str(round(tss.anlzd_ret()*100,2))+"%"
    dd['cuml_ret']=str(round(tss.cuml_ret()*100,2))+"%"
    dd['max_drawdown']=str(round(tss.max_drawdown()*100,2))+"%"
    dd['sortino_ratio']=str(round(tss.sortino_ratio(freq=250),2))+"%"
    dd['calmar_ratio']=str(round(tss.calmar_ratio()*100,2))+"%"
    dd['sharpe_ratio'] = str(round(sharpe_ratio(tss)*100,2))+"%" # 夏普比率(Sharpe Ratio):风险调整后的收益率.计算投资组合每承受一单位总风险,会产生多少的超额报酬。
    dd['annual_volatility'] = str(round(stats.annual_volatility(tss)*100,2))+"%" # 波动率
    dd['omega_ratio'] = str(round(omega_ratio(tss)*100,2))+"%" # omega_ratio
    df=pd.DataFrame(dd.values(),index=dd.keys(),columns = [i])
    return df

dff = pd.DataFrame()
for i in tickers:
    dd = performance(i)
    dff = pd.concat([dff,dd],axis=1)
dff

在这里插入图片描述

# 日收益率的年度波动率(滚动)
fig = plt.figure(figsize = (16,8))
for ii,jj in enumerate(tickers):
    plt.subplot(2,2,ii+1)
    vol = closeDf[jj].pct_change()[::-1].rolling(window=252,center=False).std()* np.sqrt(252)
    plt.plot(vol,color=color_palette[ii],label=jj)
    plt.title('%s - 日收益率的年度波动率(滚动)'%jj,size=15)
    plt.legend()
plt.tight_layout()

在这里插入图片描述

# Annualized standard deviation (volatility) of monthly return
# 月收益率的年化标准差(波动率)
# 实证研究表明,收益率标准差(波动率)存在一定的集聚现象,
# 即高波动率和低波动率往往会各自聚集在一起,并且高波动率和低波动率聚集的时期是交替出现的。
# 红色部门显示出,所有股票均存在一定的波动集聚现象。
fig = plt.figure(figsize = (16,9))
for ii,jj in enumerate(tickers):
    plt.subplot(2,2,ii+1)
    daily_ret=closeDf[jj].pct_change()
    mnthly_annu = daily_ret.resample('M').std()* np.sqrt(12)
    #plt.rcParams['figure.figsize']=[20,5]
    mnthly_annu.plot(color=color_palette[ii],label=jj)
    start_date=mnthly_annu.index[0]
    end_date=mnthly_annu.index[-1]
    plt.xticks(pd.date_range(start_date,end_date,freq='Y'),[str(y) for y in range(start_date.year+1,end_date.year+1)])
    dates=mnthly_annu[mnthly_annu>0.07].index
    for i in range(0,len(dates)-1,3):
        plt.axvspan(dates[i],dates[i+1],color=color_palette[ii],alpha=.3)
    plt.title('%s - 月收益率的年化标准差(波动率)'%jj,size=15)
    labs = mpatches.Patch(color=color_palette[ii],alpha=.5, label="波动率聚集")
    plt.legend(handles=[labs])
plt.tight_layout()

在这里插入图片描述

股票未来走势预测

模型一

import pandas as pd
import numpy as np
from statsmodels.tsa import holtwinters as hw
from statsmodels.tsa.stattools import adfuller
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.graphics.gofplots import qqplot
import matplotlib.pyplot as plt
from statsmodels.tsa import arima_model
import warnings
# 数据对数化
bonus_data = closeDf['比亚迪']
bonus_log = np.log(closeDf['比亚迪'])
bonus_log.plot(style='+-', figsize=(16, 9))

在这里插入图片描述

# 长期趋势、季节趋势:add
# 季节周期:季度
# seasonal_periods:季度数据为4,月度数据的为12,周周期数据为7
# trend、seasonal为add,任取一个时间段,数据增量为0
bonus_hw = hw.ExponentialSmoothing(bonus_log, trend='add', seasonal='add', seasonal_periods=4)
hw_fit = bonus_hw.fit()
hw_fit.summary()

在这里插入图片描述

bonus_data.plot(figsize=(16, 9))
np.exp(hw_fit.fittedvalues).plot(label='fitted_values', legend=True)

在这里插入图片描述

bonus_forecast = np.exp(hw_fit.predict(start=len(bonus_data), end=len(bonus_data)+100))
print(bonus_forecast)

在这里插入图片描述

pd.DataFrame({
'origin': bonus_data,
'fitted': np.exp(hw_fit.fittedvalues),
'pred': bonus_forecast
}).plot(figsize=(16, 9),legend=True)

在这里插入图片描述

模型二

from autots import AutoTS
import matplotlib.pyplot as plt
import pandas as pd
#存放3家公司的收盘价
Df = pd.DataFrame()
#合并3家公司的收盘价
Df = pd.concat([Df,NDSD['trade_date'],NDSD['close'],BYD['close'],LJLN['close']],axis=1)
#重命名列名为公司名称
Df.columns=['日期','宁德时代','比亚迪','隆基绿能']

#将日期设置为行索引
Df['日期'] = pd.to_datetime(Df['日期'])
Df.set_index('日期',inplace=True)
Df = Df.sort_index(ascending=True)
Df = Df.reset_index()
Df

在这里插入图片描述

model = AutoTS(forecast_length=40, frequency='infer', ensemble='simple', drop_data_older_than_periods=100)
#model = AutoTS(forecast_length=46, score_type='rmse', time_interval='D', model_type='best')
model = model.fit(Df, date_col='日期', value_col='比亚迪', id_col=None)

在这里插入图片描述

prediction = model.predict()
forecast = prediction.forecast
print("Stock Price Prediction of Apple")
print(forecast)

在这里插入图片描述

pd.DataFrame({
'origin': Df['比亚迪'],
'pred': forecast['比亚迪']
}).plot(figsize=(16, 9),legend=True)

在这里插入图片描述

模型三

# TimeSeries从 Pandas DataFrame创建一个对象,并将其拆分为训练/验证系列:
import pandas as pd
import matplotlib.pyplot as plt
from darts import TimeSeries
from darts.models import ExponentialSmoothing

比亚迪

#closeDf = closeDf.reset_index()
df = closeDf[['比亚迪']]
df['日期'] = pd.date_range(start='2019-09-02',periods=684)
series = TimeSeries.from_dataframe(df, '日期', '比亚迪',fill_missing_dates=True)
train, val = series[:-50], series[-50:]
# 拟合指数平滑模型,并对验证系列的持续时间进行(概率)预测:
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(len(val), num_samples=50)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend()

在这里插入图片描述

from darts.models import TCNModel
from darts.utils.likelihood_models import LaplaceLikelihood

model = TCNModel(
    input_chunk_length=24,
    output_chunk_length=12,
    likelihood=LaplaceLikelihood(),
)

model.fit(train, epochs=150, verbose=True)

在这里插入图片描述

prediction = model.predict(len(val), num_samples=500)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.1, high_quantile=0.90)
plt.legend();

在这里插入图片描述

prediction

在这里插入图片描述
在这里插入图片描述

from darts.models import NaiveDrift

drift_model = NaiveDrift()
drift_model.fit(train)
prediction = drift_model.predict(len(val))

#prediction = model.predict(len(val), num_samples=500)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.1, high_quantile=0.90)
plt.legend();

在这里插入图片描述

model = TCNModel(
    input_chunk_length=24,
    output_chunk_length=12,
    likelihood=LaplaceLikelihood(prior_b=0.1),
)

model.fit(train, epochs=100, verbose=True);

prediction = model.predict(len(val), num_samples=500)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend();

在这里插入图片描述
在这里插入图片描述
宁德时代

#closeDf = closeDf.reset_index()
df = closeDf[['宁德时代']]
df['日期'] = pd.date_range(start='2019-09-02',periods=684)
series = TimeSeries.from_dataframe(df, '日期', '宁德时代',fill_missing_dates=True)
train, val = series[:-30], series[-30:]
# 拟合指数平滑模型,并对验证系列的持续时间进行(概率)预测:
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(len(val), num_samples=10)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend()

在这里插入图片描述

from darts.models import TCNModel
from darts.utils.likelihood_models import LaplaceLikelihood

model = TCNModel(
    input_chunk_length=24,
    output_chunk_length=12,
    likelihood=LaplaceLikelihood(),
)

model.fit(train, epochs=50, verbose=True)

在这里插入图片描述

prediction = model.predict(len(val), num_samples=100)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend();

在这里插入图片描述
隆基绿能

#closeDf = closeDf.reset_index()
df = closeDf[['隆基绿能']]
df['日期'] = pd.date_range(start='2019-09-02',periods=684)
series = TimeSeries.from_dataframe(df, '日期', '隆基绿能',fill_missing_dates=True)
train, val = series[:-30], series[-30:]
# 拟合指数平滑模型,并对验证系列的持续时间进行(概率)预测:
model = ExponentialSmoothing()
model.fit(train)
prediction = model.predict(len(val), num_samples=50)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend()

在这里插入图片描述

from darts.utils.likelihood_models import QuantileRegression

model2 = TCNModel(
    input_chunk_length=24,
    output_chunk_length=12,
    likelihood=QuantileRegression([0.05, 0.1, 0.5, 0.9, 0.95]),
)

model2.fit(train, epochs=100, verbose=True);
prediction = model2.predict(len(val), num_samples=30)
# 绘制中位数、第 5 和第 95 个百分位数:
fig = plt.figure(figsize = (16,9))
series.plot()
prediction.plot(label='forecast', low_quantile=0.05, high_quantile=0.95)
plt.legend();

在这里插入图片描述

模型四

比亚迪

import pmdarima as pm
from pmdarima import model_selection
import matplotlib.pyplot as plt
import numpy as np
# 加载数据并将其拆分为单独的部分
data = closeDf['比亚迪']
train, test = model_selection.train_test_split(data, train_size=600)
# fit一些验证(cv)样本
arima = pm.auto_arima(train, start_p=1, start_q=1, d=0, max_p=5, max_q=5,
                      out_of_sample_size=60, suppress_warnings=True,
                      stepwise=True, error_action='ignore')
 
# 现在绘制测试集的结果和预测
preds, conf_int = arima.predict(n_periods=test.shape[0],
                                return_conf_int=True)
preds

在这里插入图片描述

fig, axes = plt.subplots(2, 1, figsize=(12, 8))
x_axis = np.arange(train.shape[0] + preds.shape[0])
axes[0].plot(x_axis[:train.shape[0]], train, alpha=0.75)
axes[0].scatter(x_axis[train.shape[0]:], preds, alpha=0.4, marker='o')
axes[0].scatter(x_axis[train.shape[0]:], test, alpha=0.4, marker='x')
axes[0].fill_between(x_axis[-preds.shape[0]:], conf_int[:, 0], conf_int[:, 1],
                     alpha=0.1, color='b')


# 填写在模型中"held out"样本的部分
axes[0].set_title("Train samples & forecasted test samples")
 
# 现在将实际样本添加到模型中并创建NEW预测
arima.update(test)
new_preds, new_conf_int = arima.predict(n_periods=10, return_conf_int=True)
new_x_axis = np.arange(data.shape[0] + 10)
 
axes[1].plot(new_x_axis[:data.shape[0]], data, alpha=0.75)
axes[1].scatter(new_x_axis[data.shape[0]:], new_preds, alpha=0.4, marker='o')
axes[1].fill_between(new_x_axis[-new_preds.shape[0]:],
                     new_conf_int[:, 0], new_conf_int[:, 1],
                     alpha=0.1, color='g')
axes[1].set_title("Added new observed values with new forecasts")
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/705035.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle报错:“Error in invoking target ‘agent nmhs’ of makefile...”

前言:Oracle在安装过程中的报错一定要重视,这决定你后续是否能完成安装以及是否能使用。我这边会陆续汇总一些报错现象以及解决方案共享。 ##Install Product 86%报错信息 :“Error in invoking target agent nmhs of makefile...”解决方案…

意大利语翻译哪个公司比较专业?

据了解,意大利语除了通行于意大利之外,还通行于美国、加拿大、阿根廷和巴西等29个国家的,其应用极为广泛。随着意大利语翻译需求量的日益增加,也促进了意大利语与其它语言间的交流、转化和发展。那么,意大利语翻译难吗…

抖音短视频矩阵号系统开源部署搭建分享(二)

开发背景:抖音seo源码,抖音矩阵系统源码。抖音获客系统源码,短视频矩阵系统源码开源搭建(MySQL数据库,NGINX,PHP7.4,MySQL5.7,redis) 技术要点: 服务器配置服…

vue-router.esm.js:2248 Error: Cannot find module ‘@/views/dylife/ 报错解决

具体是展示 一直加载 控制台报找不到模块 webpack版本问题,webpack4 不支持变量方式的动态 import ,新版本需要使用 require() 来解决此问题。 return () > import(/views/${view}) 改写成 return (resolve) > require([/views/${view}], reso…

python接口自动化(四)--接口测试工具介绍(详解)

简介 “工欲善其事必先利其器”,通过前边几篇文章的介绍,大家大致对接口有了进一步的认识。那么接下来让我们看看接口测试的工具有哪些。 目前,市场上有很多支持接口测试的工具。利用工具进行接口测试,能够提供测试效率。例如&…

【C++】浅析C++中的虚函数

关于虚函数 Q1&#xff1a;观察一个类引入虚函数后&#xff0c;类会发生什么变化&#xff1f; 首先&#xff0c;创建一个空类A&#xff0c;并实例化出A的一个对象a&#xff0c;计算一下这个对象占用多少字节&#xff1a; #include<iostream> using namespace std;clas…

02-阴影

使用阴影 1.给立方体添加castShadow&#xff0c;让立方体产生阴影 cube.castShadow true;2.创建一个地面用于接收阴影 const planeGemetry new THREE.PlaneGeometry(20, 30)const planeMaterial new THREE.MeshPhongMaterial({ color: 0xffffff })const plane new THREE.…

LeetCode 2. 两数相加

文章目录 1. 题目描述2. 解题代码 1. 题目描述 链接&#xff1a;https://leetcode.cn/problems/add-two-numbers/ 2. 解题代码 public ListNode AddTwoNumber(ListNode l1, ListNode l2) {ListNode head new ListNode();ListNode cur head;int carry 0;while (l1 ! null…

CIO 访谈|财达证券 IT 基础架构云化转型思考与实践

作为河北省证券行业的主力军&#xff0c;财达证券始终坚持用科技赋能业务&#xff0c;全方位推动信息化和数字化建设。在本期视频中&#xff0c;我们请到了财达证券首席信息官谢井民&#xff0c;分享如何基于 SmartX 超融合逐步实现 IT 基础架构云化转型&#xff0c;满足公司“…

RPC框架(一):扫盲

文章目录 一、概要二、RPC组成部分三、影响RPC框架性能的因素 一、概要 RPC作用&#xff1f; 让不同服务间调用方法像同一服务间调用本地方法一样 二、RPC组成部分 Client&#xff1a;RPC协议调用方 Server&#xff1a;远程服务方法的具体实现 Stub/Proxy&#xff1a;RPC代…

基于SpringBoot的家庭理财记账系统的设计与开发

1.引言 随着社会的发展&#xff0c;社会的方方面面都在利用信息化时代的优势。互联网的优势和普及使得各种系统的开发成为必需。 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个…

Apache组件POI,将图片下载到Excel文件中并导出。

在日常的工作中&#xff0c;有时我们会遇到需要将数据库表中图片字段下载到Excel中的需求&#xff0c;为方便各位小伙伴今后的开发工作&#xff0c;我将分享出自己写的代码&#xff0c;在文章末尾有我上传到 Gitee 上的 Demo案例&#xff0c;希望大家喜欢。 将图片下载到Excel文…

[CKA]考试之Deployment管理pod扩缩容

由于最新的CKA考试改版&#xff0c;不允许存储书签&#xff0c;本博客致力怎么一步步从官网把答案找到&#xff0c;如何修改把题做对&#xff0c;下面开始我们的 CKA之旅 题目为&#xff1a; Task 扩容 deployment guestbook 为 6个pod 注意&#xff0c;如果题目要求先切换K8…

低价高品质的头戴式降噪耳机,还支持主动降噪,QCY H4体验

每天办公的时候&#xff0c;我都喜欢戴上耳机听音乐&#xff0c;开会的时候也会方便一些。以前我用过无线入耳式耳机&#xff0c;但是戴时间长了会让耳朵很痛苦&#xff0c;因为室内也不算热&#xff0c;所以我觉得头戴式蓝牙耳机很合适&#xff0c;目前我用的是这款QCY H4头戴…

Laravel 多字段去重count计数

Laravel 多字段去重count计数 背景&#xff1a;需要统计数据列表总条数&#xff08;字段1、字段2去重统计&#xff09; table&#xff1a;policy_view,去重字段admin_id和permission 期望结果&#xff1a;count不含重复统计数据 解决思路&#xff1a; 语法&#xff1a;DISTI…

appium下载安装及环境配置及夜神模拟器下载、nodejs安装

appium所需要的环境有&#xff1a;jdk、android sdk、Nodejs、appium客户端 此次教程只针对于windows jdk、Android sdk已下载安装配置好环境&#xff0c;此次教程不再重复记录 jdk可看这篇博文jdk安装及环境配置 Android sdk 可看这篇 Android SDK下载与安装 一、Nodejs安装 …

有哪些做任务赚佣金的平台 做任务挣钱的app

科思创业汇 大家好&#xff0c;这里是科思创业汇&#xff0c;一个轻资产创业孵化平台。赚钱的方式有很多种&#xff0c;我希望在科思创业汇能够给你带来最快乐的那一种&#xff01; 做任务赚佣金的平台&#xff1f;做任务赚钱一直是一种流行的赚钱方式。现在有无数的app可以通…

优化细节令人惊叹,用户体验直接拉满!你的App也能如此丝滑!

启动时间是App使用者的第一体验&#xff0c;很多大厂都通过A/B实验论证启动速度的优化可以带来用户留存的显著收益&#xff0c;尤其是体量大的用户&#xff0c;启动时间缩短一点&#xff0c;留存增长一点&#xff0c;那就带来了非常大的收益。因此&#xff0c;启动性能优化一直…

济南中医风湿病医院受邀参加北坦街道“学习二十大 奋进新征程”主题党日活动

为学习贯彻党的二十大精神&#xff0c;中共天桥区北坦街道工作委员会于近日特组织开展“学习贯彻二十大精神 凝心聚力奋进新征程”联合主题党日活动&#xff0c;济南中医风湿病医院党支部预备党员卢雪梅同志受邀参加。 活动第一站&#xff0c;参观济南黄河文化展览馆。这是一部…

Microsoft Edge插件推荐:CSDN·浏览器助手

文章目录 1.简介2.安装3.总结 今天来给大家分享一个超级好用的Microsoft Edge插件&#xff0c;名为CSDN浏览器助手 1.简介 CSDN浏览器助手是一款集成本地书签、历史记录与 CSDN搜索(so.csdn.net) 的搜索工具&#xff0c;可以自定义Microsoft Edge的新标签页&#xff0c;还可以…