数据分析案例-中国黄金股票市场的EDA与价格预测

 

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介:Python学习者
🐋 希望大家多多支持,我们一起进步!😄
如果文章对你有帮助的话,
欢迎评论 💬点赞👍🏻 收藏 📂加关注+


目录

1.项目背景

2.数据集介绍

3.技术工具

4.导入数据

5.数据可视化

6.建模预测

源代码 


1.项目背景

        在金融市场中,黄金一直被视为避险资产和价值储存工具。中国的黄金市场在全球范围内具有举足轻重的地位。随着中国经济实力的增强和金融市场的逐步开放,国内黄金市场的规模和影响力不断扩大。在此背景下,对于中国黄金市场的深度分析和预测,对于投资者、政策制定者和学术研究者都具有重要意义。

一、研究背景

        近年来,受全球经济形势不确定性增加、金融市场波动加剧的影响,黄金作为避险资产的需求持续上升。中国作为全球第二大经济体,其黄金市场的动态和趋势备受关注。因此,对中国黄金市场的有效分析和预测,对于理解全球黄金市场的动态、制定投资策略和政策具有重要意义。

二、技术进步的推动

        随着大数据、人工智能等技术的快速发展,数据驱动的定量分析方法在金融领域的应用越来越广泛。这为深入研究中国黄金市场提供了新的工具和视角。利用先进的数据分析技术,我们可以更准确地挖掘市场数据中的隐藏信息,更有效地预测市场趋势。

三、政策与市场环境

        中国政府近年来对于金融市场的开放和黄金市场的规范化发展给予了高度重视。一系列的政策措施推动了黄金市场的健康发展。同时,国内外经济环境、货币政策、地缘政治等因素,都对黄金市场产生了深远影响。对这些因素的深入分析和理解,是进行黄金市场预测的重要基础。

四、学术研究的需要

        学术界对于中国黄金市场的关注也在持续升温。对于中国黄金市场的深入研究,不仅可以丰富和发展金融市场的理论体系,还可以为投资者提供更有价值的决策依据。通过科学的实证研究和模型构建,可以更准确地把握市场动态,更有效地预测市场趋势。

2.数据集介绍

        本数据集来源于Kaggle,原始数据集为2015-2022年中国黄金股票价格,共有1945条,11个变量,各变量含义如下:

ts_code- 交易市场代码

trade_date- 交易日期

close- 开盘价

open- 收盘价

high- 最高价格

low- 最低价格

pre_close- 最后交易日收盘价

change- 变化点

pct_chg- 变化的百分比

vol- 交易量

3.技术工具

Python版本:3.9

代码编辑器:jupyter notebook

4.导入数据

导入第三方库并加载数据集

import numpy as np 
import pandas as pd 
import seaborn as sns
from datetime import datetime
from matplotlib.pyplot import figure
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score,confusion_matrix
from xgboost import XGBRegressor
import time
import plotly.io as pio
import plotly.graph_objects as go
import plotly.offline as pyo
# 初始化plotly
pyo.init_notebook_mode()df = pd.read_csv('Gold-Au99_95.csv')
df.head()

查看数据大小

查看数据基本信息

 查看描述性统计

数据预处理

# 转化日期数据类型
df['trade_date'] = pd.to_datetime(df['trade_date'].astype(str), format='%Y%m%d')
df.sort_values(by="trade_date",inplace=True) # 按日期重新排序
df.drop('ts_code',axis=1,inplace=True)  # 删除ts_code列
df

5.数据可视化

figure(figsize=(12, 4),dpi=80)
sns.lineplot(data=df,x='trade_date',y='close')
plt.show()

a = df[df['vol']<6000]
figure(figsize=(16, 4), dpi=80)
sns.regplot(data=a,x='price_avg',y='vol')
plt.show()

figure(figsize=(12, 4), dpi=80)
sns.lineplot(data=df,x='trade_date',y='amount')
plt.show()

figure(figsize=(12, 4), dpi=80)
sns.boxplot(data=df,x='pct_change')
plt.show()

a = df[(df['pct_change']>-10) &(df['pct_change']<10)]
figure(figsize=(12, 4), dpi=80)
sns.boxplot(data=a,x='pct_change')
plt.show()

figure(figsize=(12, 4), dpi=80)
sns.histplot(data=a,x='pct_change',kde=True)
plt.show()

pio.renderers.default = 'iframe'
lags   = [1, 2, 3]
def lag_features(df, lags):c = df.copy()for lag in lags:value1 = c['pct_change'].transform(lambda x: x.shift(lag))value2 = c['vol'].transform(lambda x: x.shift(lag))c['return_lag_' + str(lag)] = value1c['vol_lag_' + str(lag)] = value2return ca= lag_features(a, lags)
a['vol_incremental'] = a['vol_lag_1'] -a['vol_lag_2']
a['label'] = a['pct_change'].apply(lambda x:0 if x<=0 else 1)df['EMA_9'] = df['close'].ewm(9).mean().shift()
df['SMA_5'] = df['close'].rolling(5).mean().shift()
df['SMA_10'] = df['close'].rolling(10).mean().shift()
df['SMA_15'] = df['close'].rolling(15).mean().shift()
df['SMA_30'] = df['close'].rolling(30).mean().shift()t1 = go.Scatter(x=df.trade_date, y=df.EMA_9, name='EMA 9')
t2 = go.Scatter(x=df.trade_date, y=df.SMA_5, name='SMA 5')
t3 = go.Scatter(x=df.trade_date, y=df.SMA_10, name='SMA 10')
t4 = go.Scatter(x=df.trade_date, y=df.SMA_15, name='SMA 15')
t5 = go.Scatter(x=df.trade_date, y=df.SMA_30, name='SMA 30')
t6 = go.Scatter(x=df.trade_date, y=df.close, name='close', opacity=0.2)
data = [t1,t2,t3,t4,t5,t6]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')

def relative_strength_idx(df, n=14):close = df['close']delta = close.diff()delta = delta[1:]pricesUp = delta.copy()pricesDown = delta.copy()pricesUp[pricesUp < 0] = 0pricesDown[pricesDown > 0] = 0rollUp = pricesUp.rolling(n).mean()rollDown = pricesDown.abs().rolling(n).mean()rs = rollUp / rollDownrsi = 100.0 - (100.0 / (1.0 + rs))return rsidf['RSI'] = relative_strength_idx(df).fillna(0)t1 = go.Scatter(x=df.trade_date, y=df.RSI, name='RSI')
data = [t1]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')

from plotly.subplots import make_subplotsEMA_12 = pd.Series(df['close'].ewm(span=12, min_periods=12).mean())
EMA_26 = pd.Series(df['close'].ewm(span=26, min_periods=26).mean())
df['MACD'] = pd.Series(EMA_12 - EMA_26)
df['MACD_signal'] = pd.Series(df.MACD.ewm(span=9, min_periods=9).mean())t1 = go.Scatter(x=df.trade_date, y=df.close, name='close')
t2 = go.Scatter(x=df.trade_date, y=EMA_12, name='EMA 12')
t3 = go.Scatter(x=df.trade_date, y=EMA_26, name='EMA 26')
t4 = go.Scatter(x=df.trade_date, y=df['MACD'], name='MACD')
t5 = go.Scatter(x=df.trade_date, y=df['MACD_signal'], name='Signal line')
data = [t1,t2,t3,t4,t5]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')

6.建模预测

df.dropna(how="any",inplace=True)
b = df.drop(['change', 'pct_change','amount','vol','high','open','low','price_avg'],axis=1)
# 这里的label表示下一个交易日的收盘价
b['label'] = b['close'].shift(-1)
b.dropna(how="any",inplace=True)

拆分数据集,并使用网格搜索寻找 XGBRegressor模型的最优参数

y = b['label']
X = b.drop(columns=['label'],axis=1)train_set, valid_set= np.split(b, [int(.7 *len(b))])
y_train = train_set['label']
X_train = train_set.drop(columns=['label','trade_date'],axis=1)y_valid = valid_set['label']
X_valid = valid_set.drop(columns=['label','trade_date'],axis=1)grid = {'n_estimators': [100, 200, 300, 400],'learning_rate': [0.001, 0.005, 0.01, 0.05],'max_depth': [8, 10, 12, 15],'gamma': [0.001, 0.005, 0.01, 0.02],'random_state': [42]
}
clf = GridSearchCV(estimator=XGBRegressor(), param_grid=grid, n_jobs=-1, cv=None)
clf.fit(X_train, y_train)
scores=clf.score(X_valid, y_valid)
scores

print(f'Best params: {clf.best_params_}')
print(f'Best validation score = {clf.best_score_}')

使用最佳参数重新训练模型

model = XGBRegressor(**clf.best_params_, objective='reg:squarederror')
model.fit(X_train, y_train)
pred = model.predict(X_valid)

重要特征可视化

from xgboost import plot_importance
plot_importance(model) # 特征重要性可视化
plt.show()

 

from sklearn.metrics import mean_squared_error
print(f'mean_squared_error = {mean_squared_error(y_valid, pred)}')

i = len(pred)
predicted_prices = df.tail(i).copy()
predicted_prices['close'] = pred
t1 = go.Scatter(x=df.trade_date, y=df.close,name='Truth',marker_color='LightSkyBlue')t2 = go.Scatter(x=predicted_prices.trade_date,y=predicted_prices.close,name='Prediction',marker_color='MediumPurple')t3 = go.Scatter(x=predicted_prices.trade_date,y=y_valid,name='Truth',marker_color='LightSkyBlue',showlegend=False)t4 = go.Scatter(x=predicted_prices.trade_date,y=pred,name='Prediction',marker_color='MediumPurple',showlegend=False)
data = [t1,t2,t3,t4]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')

源代码 

ts_code- 交易市场代码
trade_date- 交易日期
close- 开盘价
open- 收盘价
high- 最高价格
low- 最低价格
pre_close- 最后交易日收盘价
change- 变化点
pct_chg- 变化的百分比
vol- 交易量
import numpy as np 
import pandas as pd 
import seaborn as sns
from datetime import datetime
from matplotlib.pyplot import figure
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split,GridSearchCV
from sklearn.metrics import accuracy_score, recall_score, precision_score, f1_score,confusion_matrix
from xgboost import XGBRegressor
import time
import plotly.io as pio
import plotly.graph_objects as go
import plotly.offline as pyo
# 初始化plotly
pyo.init_notebook_mode()df = pd.read_csv('Gold-Au99_95.csv')
df.head()
df.shape
df.info()
df.describe()
# 转化日期数据类型
df['trade_date'] = pd.to_datetime(df['trade_date'].astype(str), format='%Y%m%d')
df.sort_values(by="trade_date",inplace=True) # 按日期重新排序
df.drop('ts_code',axis=1,inplace=True)  # 删除ts_code列
df
figure(figsize=(12, 4),dpi=80)
sns.lineplot(data=df,x='trade_date',y='close')
plt.show()
a = df[df['vol']<6000]
figure(figsize=(16, 4), dpi=80)
sns.regplot(data=a,x='price_avg',y='vol')
plt.show()
figure(figsize=(12, 4), dpi=80)
sns.lineplot(data=df,x='trade_date',y='amount')
plt.show()
figure(figsize=(12, 4), dpi=80)
sns.boxplot(data=df,x='pct_change')
plt.show()
a = df[(df['pct_change']>-10) &(df['pct_change']<10)]
figure(figsize=(12, 4), dpi=80)
sns.boxplot(data=a,x='pct_change')
plt.show()
figure(figsize=(12, 4), dpi=80)
sns.histplot(data=a,x='pct_change',kde=True)
plt.show()
pio.renderers.default = 'iframe'
lags   = [1, 2, 3]
def lag_features(df, lags):c = df.copy()for lag in lags:value1 = c['pct_change'].transform(lambda x: x.shift(lag))value2 = c['vol'].transform(lambda x: x.shift(lag))c['return_lag_' + str(lag)] = value1c['vol_lag_' + str(lag)] = value2return ca= lag_features(a, lags)
a['vol_incremental'] = a['vol_lag_1'] -a['vol_lag_2']
a['label'] = a['pct_change'].apply(lambda x:0 if x<=0 else 1)df['EMA_9'] = df['close'].ewm(9).mean().shift()
df['SMA_5'] = df['close'].rolling(5).mean().shift()
df['SMA_10'] = df['close'].rolling(10).mean().shift()
df['SMA_15'] = df['close'].rolling(15).mean().shift()
df['SMA_30'] = df['close'].rolling(30).mean().shift()t1 = go.Scatter(x=df.trade_date, y=df.EMA_9, name='EMA 9')
t2 = go.Scatter(x=df.trade_date, y=df.SMA_5, name='SMA 5')
t3 = go.Scatter(x=df.trade_date, y=df.SMA_10, name='SMA 10')
t4 = go.Scatter(x=df.trade_date, y=df.SMA_15, name='SMA 15')
t5 = go.Scatter(x=df.trade_date, y=df.SMA_30, name='SMA 30')
t6 = go.Scatter(x=df.trade_date, y=df.close, name='close', opacity=0.2)
data = [t1,t2,t3,t4,t5,t6]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')
def relative_strength_idx(df, n=14):close = df['close']delta = close.diff()delta = delta[1:]pricesUp = delta.copy()pricesDown = delta.copy()pricesUp[pricesUp < 0] = 0pricesDown[pricesDown > 0] = 0rollUp = pricesUp.rolling(n).mean()rollDown = pricesDown.abs().rolling(n).mean()rs = rollUp / rollDownrsi = 100.0 - (100.0 / (1.0 + rs))return rsidf['RSI'] = relative_strength_idx(df).fillna(0)t1 = go.Scatter(x=df.trade_date, y=df.RSI, name='RSI')
data = [t1]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')
from plotly.subplots import make_subplotsEMA_12 = pd.Series(df['close'].ewm(span=12, min_periods=12).mean())
EMA_26 = pd.Series(df['close'].ewm(span=26, min_periods=26).mean())
df['MACD'] = pd.Series(EMA_12 - EMA_26)
df['MACD_signal'] = pd.Series(df.MACD.ewm(span=9, min_periods=9).mean())t1 = go.Scatter(x=df.trade_date, y=df.close, name='close')
t2 = go.Scatter(x=df.trade_date, y=EMA_12, name='EMA 12')
t3 = go.Scatter(x=df.trade_date, y=EMA_26, name='EMA 26')
t4 = go.Scatter(x=df.trade_date, y=df['MACD'], name='MACD')
t5 = go.Scatter(x=df.trade_date, y=df['MACD_signal'], name='Signal line')
data = [t1,t2,t3,t4,t5]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')
df.dropna(how="any",inplace=True)
b = df.drop(['change', 'pct_change','amount','vol','high','open','low','price_avg'],axis=1)
# 这里的label表示下一个交易日的收盘价
b['label'] = b['close'].shift(-1)
b.dropna(how="any",inplace=True)
y = b['label']
X = b.drop(columns=['label'],axis=1)train_set, valid_set= np.split(b, [int(.7 *len(b))])
y_train = train_set['label']
X_train = train_set.drop(columns=['label','trade_date'],axis=1)y_valid = valid_set['label']
X_valid = valid_set.drop(columns=['label','trade_date'],axis=1)grid = {'n_estimators': [100, 200, 300, 400],'learning_rate': [0.001, 0.005, 0.01, 0.05],'max_depth': [8, 10, 12, 15],'gamma': [0.001, 0.005, 0.01, 0.02],'random_state': [42]
}
clf = GridSearchCV(estimator=XGBRegressor(), param_grid=grid, n_jobs=-1, cv=None)
clf.fit(X_train, y_train)
scores=clf.score(X_valid, y_valid)
scores
print(f'Best params: {clf.best_params_}')
print(f'Best validation score = {clf.best_score_}')
model = XGBRegressor(**clf.best_params_, objective='reg:squarederror')
model.fit(X_train, y_train)
pred = model.predict(X_valid)
from xgboost import plot_importance
plot_importance(model) # 特征重要性可视化
plt.show()
from sklearn.metrics import mean_squared_error
print(f'mean_squared_error = {mean_squared_error(y_valid, pred)}')
i = len(pred)
predicted_prices = df.tail(i).copy()
predicted_prices['close'] = pred
t1 = go.Scatter(x=df.trade_date, y=df.close,name='Truth',marker_color='LightSkyBlue')t2 = go.Scatter(x=predicted_prices.trade_date,y=predicted_prices.close,name='Prediction',marker_color='MediumPurple')t3 = go.Scatter(x=predicted_prices.trade_date,y=y_valid,name='Truth',marker_color='LightSkyBlue',showlegend=False)t4 = go.Scatter(x=predicted_prices.trade_date,y=pred,name='Prediction',marker_color='MediumPurple',showlegend=False)
data = [t1,t2,t3,t4]
plt.close('all')
pyo.iplot(data, filename = 'basic-line')

资料获取,更多粉丝福利,关注下方公众号获取

在这里插入图片描述

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

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

相关文章

Redis的Stream 和 实现队列的方式【List、SortedSet、发布订阅、Stream、Java】

Redis队列与Stream、Redis 6多线程详解 Redis队列与StreamStream总述常用操作命令生产端消费端单消费者消费组消息消费 Redis队列几种实现的总结基于List的 LPUSHBRPOP 的实现基于Sorted-Set的实现PUB/SUB&#xff0c;订阅/发布模式基于Stream类型的实现与Java的集成 消息队列问…

算法打卡day39

今日任务&#xff1a; 1&#xff09;卡码网57. 爬楼梯&#xff08;70. 爬楼梯进阶版&#xff09; 2&#xff09;322.零钱兑换 3&#xff09;279.完全平方数 4&#xff09;复习day14 卡码网57. 爬楼梯&#xff08;70. 爬楼梯进阶版&#xff09; 题目链接&#xff1a;57. 爬楼梯…

ipv4Bypass:一款基于IPv6实现的IPv4安全绕过与渗透测试工具

关于ipv4Bypass ipv4Bypass是一款基于IPv6实现的安全绕过与渗透测试工具&#xff0c;该工具专为红队研究人员设计&#xff0c;可以帮助广大研究人员通过IPv6绕过目标安全策略&#xff0c;以此来检测安全检测机制的健壮性。 20世纪90年代是互联网爆炸性发展时期&#xff0c;随着…

Llama 3王者归来,可与GPT-4分庭抗礼,开源模型即将追上闭源模型了?

“有史以来最强大的开源大模型”Llama 3引爆AI圈&#xff0c;马斯克点赞&#xff0c;英伟达高级科学家Jim Fan直言&#xff0c;Llama 3将成为AI大模型发展历程的“分水岭”&#xff0c;AI顶尖专家吴恩达称Llama3是他收到的最好的礼物。 4月18日&#xff0c;AI圈再迎重磅消息&a…

写一个uniapp的登录注册页面

目录 一、效果图 二、代码 1、登录 &#xff08;1&#xff09;页面布局代码 &#xff08;2&#xff09;逻辑实现代码 &#xff08;3&#xff09;css样式 2、注册 &#xff08;1&#xff09;页面布局代码 &#xff08;2&#xff09;逻辑实现代码 &#xff08;3&#x…

一个完全用rust写的开源操作系统-Starry

1. Starry Starry是2023年全国大学生计算机系统能力大赛操作系统设计赛-内核实现赛的二等奖作品。Starry是在组件化OS的arceos的基础上&#xff0c;进行二次开发的操作系统内核&#xff0c;使用宏内核架构&#xff0c;能够运行Linux应用的内核。 原始的操作系统大赛的仓库为 …

51-42 NÜWA:女娲,统一的多模态预训练模型

21年11月&#xff0c;微软、北大联合发布了NUWA模型&#xff0c;一个统一的多模态预训练模型&#xff0c;在 8 个下游任务上效果惊艳。目前该项目已经发展成为一系列工作&#xff0c;而且都公开了源代码。 Abstract 本文提出了一种统一的多模态预训练模型N̈UWA&#xff0c;该…

【精简改造版】大型多人在线游戏BrowserQuest服务器Golang框架解析(1)——功能清单

1.匿名登录 2.服务连接 3.新手引导 4.随机出生点 5.界面布局 6.玩法帮助 7.NPC会话 8.成就系统 9.成就达成 10.用户聊天 11.战斗&信息展示 12.药水使用 13.副本传送 14.玩家死亡 15.超时断开

实验:使用FTP+yum实现自制yum仓库

实验准备 FTP服务器端&#xff1a;centos-1&#xff08;IP:10.9.25.33&#xff09; 客户端&#xff1a;centos-2 两台机器保证网络畅通&#xff0c;原yum仓库可用&#xff0c;已关闭防火墙和selinux FTP服务器端 ①安装vsftpd并运行&#xff0c;设定开机自启动 安装vsftpd…

金融数字化能力成熟度指引

1 范围 本文件提出了金融数字化能力成熟度模型、成熟度计算方法&#xff0c;明确了不同维度金融数字化转型能力 相应的分档要求。 本文件适用于金融机构衡量金融科技应用和数字化转型发展水平&#xff0c;检视自身数字化发展优势与短板&#xff0c; 加快数字化转型&#xff0c…

金蝶云星空和金蝶云星空单据接口对接

金蝶云星空和金蝶云星空单据接口对接 来源系统:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个通用的ERP服务平台。K/3Cloud支持的协同应用包括但…

Linux Makefile

1.开发背景 linux 下编译程序需要用到对应的 Makefile&#xff0c;用于编译应用程序。 2.开发需求 编写 Makefile 编译应用程序 1&#xff09;支持多个源文件 2&#xff09;支持多个头文件 3&#xff09;支持只编译修改的文件&#xff0c;包括源文件和头文件 4&#xff09;支持…

Web程序设计-实验03 JavaScript语言基础

题目 【实验主题】 素数问题求解。计算&#xff08;判断&#xff09; 1~100中哪些是素数、哪些是合数。 素数也称为质数&#xff0c;是只能被1及其自身整除的自然数。与素数相对应的是合数&#xff0c;合数可以被分解为若干个素数的乘积&#xff0c;这些素数称为这个合数的质…

数据结构从入门到实战——顺序表的应用

目录 一、基于动态顺序表实现通讯录 二、代码实现 2.1 通讯录的初始化 2.2 通讯录的销毁 2.3 通讯录的展示 2.4 通讯录添加联系人信息 2.5 通讯录删除联系人信息 2.6 通讯录修改联系人信息 2.7 通讯录的查找联系人信息 2.8 将通讯录中联系人信息保存到文件中 2.9…

【Windows10】Anaconda3安装+pytorch+tensorflow+pycharm

文章目录 一、下载anaconda0.双击下载的文件1. 选择All users2. 安装路径3. 勾选环境变量和安装python4.安装完成5.添加环境变量6.测试是否安装成功 二、安装pytorch&#xff08;先看四&#xff01;先检查一下自己电脑是不是只能安装GPU版的1.查看conda图形化界面2.在安装pytor…

【图解计算机网络】网络协议分层解析

网络协议分层解析 网络协议分层应用层传输层网络层数据链路层 TCP/IP分层模型通讯示例 网络协议分层 网络协议分层一共有OSI七层网络协议&#xff0c;TCP/IP四层网络网络协议&#xff0c;还有五层网络协议。 七层由于分层太多过于复杂&#xff0c;实际应用中并没有使用&#x…

代码编辑工具PilotEditPro18.4版本在Windows系统的下载与安装配置

目录 前言一、PilotEdit Pro安装二、使用配置总结 前言 “ PilotEdit Pro是一个功能强大且功能丰富的文本和代码编辑器&#xff0c;可满足程序员、开发人员和IT专业人员的不同需求。定位为一个多功能的编辑解决方案&#xff0c;PilotEdit Pro以其对广泛的文本和代码文件格式的…

Nginx莫名奇妙返回了404

描述 nginx作为反向代理&#xff0c;代理python的服务&#xff0c;但是通过代理访问服务的时候&#xff0c;报了404的错误。 难受的是客户现场没有查看日志的权限&#xff0c;只有查看配置文件的权限&#xff0c;我们检测了几遍配置文件也没有找到问题&#xff0c;哎~ 问题引…

相机摄影入门技巧,数码摄影技巧大全

一、资料前言 本套数码相机摄影资料&#xff0c;大小1.08G&#xff0c;共有42个文件。 二、资料目录 《aking人像摄影技巧分享》.pdf 《Nikon.D90数码单反摄影技巧大全》FUN视觉.全彩版.pdf 《不可不学的摄影技巧》.pdf 《常用场景摄影》.pdf 《单反数码摄影专家技法》.…

【Web】AFCTF 2021 题解(部分)

目录 BABY_CSP search secret google authenticator 随便做做&#xff0c;环境是NSS上的 BABY_CSP CSP绕过_script-src self-CSDN博客 CSP指令值 *&#xff1a; 星号表示允许任何URL资源&#xff0c;没有限制&#xff1b; self&#xff1a; 表示仅允许来自同源&#xff…