Python+机器学习寻找股票交易信号

1
引言

近年来,随着技术的发展,机器学习和深度学习在金融资产量化研究上的应用越来越广泛和深入。目前,大量数据科学家在Kaggle网站上发布了使用机器学习/深度学习模型对股票、期货、比特币等金融资产做预测和分析的文章。从金融投资的角度看,这些文章可能缺乏一定的理论基础支撑(或交易思维),大都是基于数据挖掘。但从量化的角度看,有很多值得我们学习参考的地方,尤其是Pyhton的深入应用、数据可视化和机器学习模型的评估与优化等。下面借鉴Kaggle上的一篇文章《Building an Asset Trading Strategy》,以上证指数为例,构建双均线交易策略,以交易信号为目标变量,以技术分析指标作为预测特征变量,使用多种机器学习模型进行对比评估和优化。文中的特征变量构建和提取,机器学习模型的对比评估和结果可视化都是很好的参考模板。

 

02
数据获取与指标构建

先引入需要用到的libraries,这是Python语言的突出特点之一。这些涉及到的包比较多,包括常用的numpy、pandas、matplotlib,技术分析talib,机器学习sklearn和数据包tushare等。

#先引入后面可能用到的libraries
import numpy as np
import pandas as pd  
import tushare as ts
#技术指标
import talib as ta
#机器学习模块
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import GradientBoostingClassifier
from xgboost import XGBClassifier,XGBRegressor
from catboost import CatBoostClassifier,CatBoostRegressor
from sklearn.ensemble import RandomForestClassifier,RandomForestRegressor
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn.metrics import accuracy_score
import shap
from sklearn.feature_selection import SelectKBest,f_regression
from sklearn import preprocessing
#画图
import seaborn as sns
import matplotlib.pyplot as plt
import plotly.graph_objects as go
import plotly.express as px

%matplotlib inline   
#正常显示画图时出现的中文和负号
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False

数据获取

用tushare获取上证行情数据作为分析样本。

#默认以上证指数交易数据为例
def get_data(code='sh',start='2000-01-01',end='2021-03-02'):
    df=ts.get_k_data('sh',start='2005')
    df.index=pd.to_datetime(df.date)
    df=df[['open','high','low','close','volume']]
    return df
df=get_data()
df_train,df_test=df.loc[:'2017'],df.loc['2018':]

构建目标变量(target variable)

以交易信号作为目标变量,使用价格信息和技术指标作为特征变量进行预测分析。以双均线交易策略为例,当短期均线向上突破长期均线时形成买入信号(设定为1),当短期均线向下跌破长期均线时发出卖出信号(设定为0),然后再使用机器学习模型进行预测和评估。这里将短期移动平均值(SMA1)和长期移动平均值(SMA2)的参数分别设置为10和60,二者的设定具有一定的任意性,参数的选择会影响后续结果,所以理想情况下需要进行参数优化来找到最优值。

def trade_signal(data,short=10,long=60,tr_id=False):
    data['SMA1'] = data.close.rolling(short).mean()
    data['SMA2'] = data.close.rolling(long).mean() 
    data['signal'] = np.where(data['SMA1'] >data['SMA2'], 1.00.0) 
    if(tr_id is not True):
        display(data['signal'].value_counts())

df_tr1 = df_train.copy(deep=True)  
df_te1 = df_test.copy(deep=True) 
trade_signal(df_tr1)  #
trade_signal(df_te1,tr_id=True)  
plt.figure(figsize=(14,12), dpi=80)
ax1 = plt.subplot(211)
plt.plot(df_tr1.close,color='b')
plt.title('上证指数走势',size=15)
plt.xlabel('')
ax2 = plt.subplot(212)
plt.plot(df_tr1.signal,color='r')
plt.title('交易信号',size=15)
plt.xlabel('')
plt.show()
Python+机器学习寻找股票交易信号
df_tr1[['SMA1','SMA2','signal']].iloc[-250:].plot(figsize=(14,6),secondary_y=['signal'])
plt.show()
Python+机器学习寻找股票交易信号
#删除均线变量
df_tr1=df_tr1.drop(['SMA1','SMA2'], axis=1)
df_te1=df_te1.drop(['SMA1','SMA2'], axis=1)
#画目标变量与其他变量之间的相关系数图
cmap = sns.diverging_palette(22010, as_cmap=True)
def corrMat(df,target='demand',figsize=(9,0.5),ret_id=False):

    corr_mat = df.corr().round(2);shape = corr_mat.shape[0]
    corr_mat = corr_mat.transpose()
    corr = corr_mat.loc[:, df.columns == target].transpose().copy()

    if(ret_id is False):
        f, ax = plt.subplots(figsize=figsize)
        sns.heatmap(corr,vmin=-0.3,vmax=0.3,center=0, 
                     cmap=cmap,square=False,lw=2,annot=True,cbar=False)
        plt.title(f'Feature Correlation to {target}')

    if(ret_id):
        return corr
corrMat(df_tr1,'signal',figsize=(7,0.5))

Python+机器学习寻找股票交易信号

当前的特征open、high、low、close、volumes与目标变量的线性相关值非常小,这可能意味着存在高非线性,相对平稳值的稳定振荡(圆形散射),或者也许它们不是理想的预测特征变量,所以下面需要进行特征构建和选取。

技术指标特征构建

为方便分析,下面以常见的几个技术指标作为特征引入特征矩阵,具体指标有:

  • 移动平均线:移动平均线通过减少噪音来指示价格的运动趋势。

  • 随机振荡器%K和%D:随机振荡器是一个动量指示器,比较特定的证券收盘价和一定时期内的价格范围。%K、%D分别为慢、快指标。

  • 相对强弱指数(RSI):动量指标,衡量最近价格变化的幅度,以评估股票或其他资产的价格超买或超卖情况。

  • 变化率(ROC):动量振荡器,测量当前价格和n期过去价格之间的百分比变化。ROC值越高越有可能超买,越低可能超卖。

  • 动量(MOM):证券价格或成交量加速的速度;价格变化的速度。

#复制之前的数据
df_tr2=df_tr1.copy(deep=True)
df_te2=df_te1.copy(deep=True)

计算技术指标

#使用talib模块直接计算相关技术指标
#下面参数的选取具有主观性
def indicators(data):
    data['MA13']=ta.MA(data.close,timeperiod=13)
    data['MA34']=ta.MA(data.close,timeperiod=34)
    data['MA89']=ta.MA(data.close,timeperiod=89)
    data['EMA10']=ta.EMA(data.close,timeperiod=10)
    data['EMA30']=ta.EMA(data.close,timeperiod=30)
    data['EMA200']=ta.EMA(data.close,timeperiod=200)
    data['MOM10']=ta.MOM(data.close,timeperiod=10)
    data['MOM30']=ta.MOM(data.close,timeperiod=30)
    data['RSI10']=ta.RSI(data.close,timeperiod=10)
    data['RSI30']=ta.RSI(data.close,timeperiod=30)
    data['RS200']=ta.RSI(data.close,timeperiod=200)
    data['K10'],data['D10']=ta.STOCH(data.high,data.low,data.close, fastk_period=10)
    data['K30'],data['D30']=ta.STOCH(data.high,data.low,data.close, fastk_period=30)
    data['K20'],data['D200']=ta.STOCH(data.high,data.low,data.close, fastk_period=200)
indicators(df_tr2)
indicators(df_te2)
corrMat(df_tr2,'signal',figsize=(15,0.5))

Python+机器学习寻找股票交易信号

上图可以看到明显线性相关的一组特征是作为特征工程的结果创建的。如果在特征矩阵中使用基本数据集特征,很可能对目标变量的变化影响很小或没有影响。另一方面,新创建的特征具有相当宽的相关值范围,这是相当重要的;与目标变量(交易信号)的相关性不算特别高。

#删除缺失值
df_tr2 = df_tr2.dropna() 
df_te2 = df_te2.dropna()

03
模型预测与评估

下面使用常用的机器学习算法分别对数据进行拟合和交叉验证评估。

models.append(('RF', RandomForestClassifier(n_estimators=25)))

models = []
#轻量级模型 
#线性监督模型
models.append(('LR', LogisticRegression(n_jobs=-1)))
models.append(('TREE', DecisionTreeClassifier())) 
#非监督模型
models.append(('LDA', LinearDiscriminantAnalysis())) 
models.append(('KNN', KNeighborsClassifier())) 
models.append(('NB', GaussianNB())) 
#高级模型
models.append(('GBM', GradientBoostingClassifier(n_estimators=25)))
models.append(('XGB',XGBClassifier(n_estimators=25,use_label_encoder=False)))
models.append(('CAT',CatBoostClassifier(silent=True,n_estimators=25)))

构建模型评估函数

def modelEval(ldf,feature='signal',split_id=[None,None],eval_id=[True,True,True,True],
              n_fold=5,scoring='accuracy',cv_yrange=None,hm_vvals=[0.5,1.0,0.75]):

    ''' Split Train/Evaluation <DataFrame> Set Split '''

    # split_id : Train/Test split [%,timestamp], whichever is not None
    # test_id : Evaluate trained model on test set only

    if(split_id[0is not None):
        train_df,eval_df = train_test_split(ldf,test_size=split_id[0],shuffle=False)
    elif(split_id[1is not None):
        train_df = df.loc[:split_id[1]]; eval_df = df.loc[split_id[1]:] 
    else:
        print('Choose One Splitting Method Only')

    ''' Train/Test Feature Matrices + Target Variables Split'''
    y_train = train_df[feature]
    X_train = train_df.loc[:, train_df.columns != feature]
    y_eval = eval_df[feature]
    X_eval = eval_df.loc[:, eval_df.columns != feature]
    X_one = pd.concat([X_train,X_eval],axis=0)
    y_one = pd.concat([y_train,y_eval],axis=0)

    ''' Cross Validation, Training/Evaluation, one evaluation'''
    lst_res = []; names = []; lst_train = []; lst_eval = []; lst_one = []; lst_res_mean = []
    if(any(eval_id)):
        for name, model in models:  
            names.append(name)

            # Cross Validation Model on Training Se
            if(eval_id[0]):
                kfold = KFold(n_splits=n_fold, shuffle=True)
                cv_res = cross_val_score(model,X_train,y_train, cv=kfold, scoring=scoring)
                lst_res.append(cv_res)

            # Evaluate Fit Model on Training Data
            if(eval_id[1]):
                res = model.fit(X_train,y_train)
                train_res = accuracy_score(res.predict(X_train),y_train); lst_train.append(train_res)
            if(eval_id[2]):
                if(eval_id[1is False):  # If training hasn't been called yet
                    res = model.fit(X_train,y_train)
                eval_res = accuracy_score(res.predict(X_eval),y_eval); lst_eval.append(eval_res)

            # Evaluate model on entire dataset
            if(eval_id[3]):
                res = model.fit(X_one,y_one)
                one_res = accuracy_score(res.predict(X_one),y_one); lst_one.append(one_res)

            ''' [out] Verbal Outputs '''
            lst_res_mean.append(cv_res.mean())
            fn1 = cv_res.mean()
            fn2 = cv_res.std();
            fn3 = train_res
            fn4 = eval_res
            fn5 = one_res

    s0 = pd.Series(np.array(lst_res_mean),index=names)
    s1 = pd.Series(np.array(lst_train),index=names)
    s2 = pd.Series(np.array(lst_eval),index=names)
    s3 = pd.Series(np.array(lst_one),index=names)
    pdf = pd.concat([s0,s1,s2,s3],axis=1)
    pdf.columns = ['cv_average','train','test','all']

    ''' Visual Ouputs '''
    sns.set(style="whitegrid")
    fig,ax = plt.subplots(1,2,figsize=(15,4))
    ax[0].set_title(f'{n_fold} Cross Validation Results')
    sns.boxplot(data=lst_res, ax=ax[0], orient="v",width=0.3)
    ax[0].set_xticklabels(names)
    sns.stripplot(data=lst_res,ax=ax[0], orient='v',color=".3",linewidth=1)
    ax[0].set_xticklabels(names)
    ax[0].xaxis.grid(True)
    ax[0].set(xlabel="")
    if(cv_yrange is not None):
        ax[0].set_ylim(cv_yrange)
    sns.despine(trim=True, left=True)
    sns.heatmap(pdf,vmin=hm_vvals[0],vmax=hm_vvals[1],center=hm_vvals[2],
            ax=ax[1],square=False,lw=2,annot=True,fmt='.3f',cmap='Blues')
    ax[1].set_title('Accuracy Scores')
    plt.show()

基准模型:使用原始行情数据作为特征

modelEval(df_tr1,split_id=[0.2,None])
Python+机器学习寻找股票交易信号

结果显示,cross_val_score徘徊在准确度= 0.5的区域,这表明仅使用指数/股票的价格数据(开盘、最高、最低、成交量、收盘)很难准确预测价格变动的方向性。大多数模型的训练得分往往高于交叉验证得分。有意思的是,DecisionTreeClassifier & RandomForest即使很少估计可以达到非常高的分数,但交叉验证的得分却很低,表明对训练数据可能存在过度拟合了。

加入技术指标特征

modelEval(df_tr2,split_id=[0.2,None],cv_yrange=(0.8,1.0),hm_vvals=[0.8,1.0,0.9])

Python+机器学习寻找股票交易信号

结果表明,与基准模型相比,准确率得分有了非常显著的提高。线性判别分析(LDA)的表现非常出色,不仅在训练集上,而且在交叉验证中,得分显著提高。毫无疑问,更复杂的模型GBM,XGB,CAT,RF在全样本中评估得分较高。与有监督学习模型相比,kNN和GaussianNB的无监督模型表现较差。

特征的优化

def feature_importance(ldf,feature='signal',n_est=100):
    # Input dataframe containing feature & target variable
    X = ldf.copy()
    y = ldf[feature].copy()
    del X[feature]
    # CORRELATION
    imp = corrMat(ldf,feature,figsize=(15,0.5),ret_id=True)
    del imp[feature]
    s1 = imp.squeeze(axis=0);s1 = abs(s1)
    s1.name = 'Correlation'      
    # SHAP
    model = CatBoostRegressor(silent=True,n_estimators=n_est).fit(X,y)
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(X)
    shap_sum = np.abs(shap_values).mean(axis=0)
    s2 = pd.Series(shap_sum,index=X.columns,name='Cat_SHAP').T
    #  RANDOMFOREST
    model = RandomForestRegressor(n_est,random_state=0, n_jobs=-1)
    fit = model.fit(X,y)
    rf_fi = pd.DataFrame(model.feature_importances_,index=X.columns,                                  
            columns=['RandForest']).sort_values('RandForest',ascending=False)
    s3 = rf_fi.T.squeeze(axis=0)
    # XGB 
    model=XGBRegressor(n_estimators=n_est,learning_rate=0.5,verbosity = 0)
    model.fit(X,y)
    data = model.feature_importances_
    s4 = pd.Series(data,index=X.columns,name='XGB').T
    # KBEST
    model = SelectKBest(k=5, score_func=f_regression)
    fit = model.fit(X,y)
    data = fit.scores_
    s5 = pd.Series(data,index=X.columns,name='K_best')
    # Combine Scores
    df0 = pd.concat([s1,s2,s3,s4,s5],axis=1)
    df0.rename(columns={'target':'lin corr'})
    x = df0.values 
    min_max_scaler = preprocessing.MinMaxScaler()
    x_scaled = min_max_scaler.fit_transform(x)
    df = pd.DataFrame(x_scaled,index=df0.index,columns=df0.columns)
    df = df.rename_axis('Feature Importance via', axis=1)
    df = df.rename_axis('Feature', axis=0)
    pd.options.plotting.backend = "plotly"
    fig = df.plot(kind='bar',title='Scaled Feature Importance')
    fig.show()
feature_importance(df_tr2)
Python+机器学习寻找股票交易信号

注意到,对于很多特征,相关性(Pearson’s value)小的在其他方法中也会给出小的得分值。同样,高相关的特征在其他特征重要性方法中得分也很高。当谈到特征的重要性时,有一些特征显示出一些轻微的不一致,总的来说,大多数方法都可以观察到特征评分的相似性。在机器学习中,某些特征对于大多数方法来说都有一个非常低的相对分数值,因此可能没有什么影响,即使把它们删除,也不会降低模型的准确性。删除可能不受影响的特性将使整个方法更加有效,同时可以专注于更长和更深入的超参数网格搜索,可能得到比原来模型更准确的结果。

df_tr2_FI = df_tr2.drop(columns=['open','high','low','close','EMA10'])
modelEval(df_tr2_FI,split_id=[0.2,None],cv_yrange=(0.8,1.0),hm_vvals=[0.8,1.0,0.9])

Python+机器学习寻找股票交易信号

结果显示,删掉预测能力较弱的特征后,某些机器学习方法的预测得分提高了,如线性判别(LDA)、决策树(TREE)和随机森林(RF)等。

04
结语

本文只是以上证指数为例,以技术指标作为特征,使用机器学习算法对股票交易信号(注意这里不是股价或收益率)进行预测评估,目的在于向读者展示Python机器学习在金融量化研究上的应用。从金融维度来看,分析的深度较浅,实际上对股价预测有用的特征有很多,包括(1)外在因素, 如股票相关公司的竞争对手、客户、全球经济、地缘政治形势、财政和货币政策、资本获取等。因此,公司股价可能不仅与其他公司的股价相关,还与大宗商品、外汇、广义指数、甚至固定收益证券等其他资产相关;(2)股价市场因素,如很多投资者关注技术指标。(3)公司基本面因素,如公司的年度和季度报告可以用来提取或确定关键指标,如净资产收益率(ROE)和市盈率(price -to – earnings)。此外,新闻可以预示即将发生的事件,这些事件可能会推动股价向某个方向发展。当关注股票价格预测时,我们可以使用类似的方法来构建影响预测变量的因素,希望本文能起到抛砖引玉的作用。

资料来源:

Andrey Shtrauss. ‘Building an Asset Trading Strategy‘, 2020.

https://www.kaggle.com/shtrausslearning/building-an-asset-trading-strategy

感谢转发点赞的各位~

作者:CuteHand

来源:Python金融量化

转自:https://mp.weixin.qq.com/s/7NP0AAYi4F-v-OQlFQSNtA

3800亿的特高压,如何补齐新能源的最后一块短板?

3800亿的特高压,如何补齐新能源的最后一块短板? 风光发电+储能+特高压,打造新能源发电产业闭环。
假期结束的第一周,小张在周末休息时与朋友聚会。茶歇话题自然少不了过年回家,尤其关于春运这一点,小张感触颇深。
 
因为老公家在北方,自己的家在南方,每年过年探亲都很不方便,更何况还带着孩子。以往过年时间全部浪费在路上,只能在家里呆上一两天。
 
然而,今年的情况截然不同,因为老公家建成了高铁。以往需要2天时间耽搁在路上,现在只需半天时间便可到家,难得过了个安稳的团圆年。
 
小李听后深有同感,现在的交通实在太方便了,年前和朋友发起了一场说走就走的旅程。早上还在北京,大雪纷飞捂着羽绒服瑟瑟发抖,下午就到了海口,艳阳普照穿上了比基尼晒着日光浴,自己的脑子一时都转不过来弯。
 
大美也说到,就在前两天出差到上海谈成了一个重要的单子。早上快到北京的时候,后台审核出现了问题,需要客户重新签字确认。
由于涉及到年终封账等问题,必须今天搞定。可是,由于天气时间等问题赶不上飞机。幸亏现在交通便利,大美赶上了下一班高铁在晚餐时间准时约上了客户。
 
交通运输的演变不光影响到个人的日常工作生活,甚至于时代的进程。
 
古今中外,人类的文明发源地大多数诞生于江海河流之畔。对于中华民族而言,黄河是中华文明最主要的发源地,被誉为母亲河。对于欧洲而言,最早的文明是爱琴海文明,至今流传着希腊神话和斯巴达的传说。
 
经济发达的国家、城市亦是诞生于流域之区,不得不承认的是运输基础条件是一个重要的因素。交通要道,自古以来便是兵家必争之地。
 
从道路和运输的变迁来看,公路从羊肠小道到土路,再演变成柏油马路、高速公路;火车从绿皮车到特快直达再到动车高铁。
可以说,交通运输演变的历史进程承载着经济的发展、人类的迁徙、社会的变迁,甚至于国家之间的博弈,人类文明的传承。
 
能源运输同样如此。
 
公元前600年,希腊哲学家泰勒斯发现了磁吸铁现象,而中国早在公元2500年前就已经具备了磁石知识。
 
直到1831年,法拉第发现了伟大的电磁感应现象,奠定了发电的基础。而后爱迪生和特斯拉分别代表直流电和交流电相爱相杀。
期间,包括火电、水电等电力建设开始大规模铺展开来,电力系统、电力应用进入高速发展期。
 
近几年,在全球双碳背书下,绿电掀起的新能源浪潮中,对电力系统提出了新的需求。
 
就我国而言,十四五规划新能源发电占据了20%的发电量,未来将会达到80%以上。想要达成这一目标,电网迫切需要改变,电网对清洁能源的输送,调配,促进消纳等就显得尤为重要。
 
实现这一切离不开这样一项至关重要的技术——特高压。
3800亿的特高压,如何补齐新能源的最后一块短板?
对电力资源的整合离不开特高压
 
通常电压按照大小等级分为安全电压——36V以下;低压——220V和380V;高压——10KV-220KV;超高压——330KV-750KV。
 
我们常见的家庭用电压220V,普通电池1.5V,人体安全电压36V。
 
特高压是指电压等级在交流1000千伏以上和直流±800千伏及以上的输电技术,具有输送容量大、距离远、效率高和损耗低等技术优势。
 
正是这一优势决定了特高压在电网建设中无法取代的核心地位。
 
具体来看,受经济发展水平和人口密度因素,我国电力供给和需求呈现出明显的不均衡现象。广东、浙江为代表的东南部各省严重依赖外省电力输送,而西南、西北各省则存在着富余现象。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
 
受环保和资源限制,在东南各省大量新增发电厂显然不具备实际意义。需要将西南、西北省市富余的电力调配到东南电力紧缺的各省使用。
 
西北、西南到东南各省距离大于1000KM,甚至3000KM,需具备大容量、长距离的电力输送方式。
 
西电东输实则是对资源的一种调配,完成资源的整合,提升效率。这种思想不乏先例,比如西气东输,南水北调。
 
技术落地推广的一个重要因素是经济性,特高压在远距离输送电力上具备更大的竞争力。
据估计,1条1150千伏输电线路的输电能力可代替5~6条500千伏线路,或3条750千伏线路。可减少铁塔用材三分之一,节约导线二分之一,节省包括变电所在内的电网造价10~15%。
 
1150千伏特高压线路走廊约仅为同等输送能力的500千伏线路所需走廊的四分之一。这对于人口稠密、土地宝贵或走廊困难的国家和地区会带来重大的经济和社会效益。
 
另一方面,新能源发电为代表的风光大型基地主要分布于西南、西北地区,距离东部较远。通过特高压调配电力的同时也减少了弃光、弃风的现象,进一步提升了新能源发电的消纳能力。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
特高压的高增时刻
特高压的规模化推广应用不仅仅在于新能源发电对电力系统提出新的需求,迫切需要改变,也在于电网有较强的投资支撑能力。
 
伴随着我国经济持续发展,用电量需求也在逐步攀升。根据国家能源局统计,2021年,全社会用电量83128亿千瓦时,同比增长10.3%,较2019年同期增长14.7%,两年平均增长7.1%。
 
与此同时,新能源发电高速发展,风电装机容量约3.3亿千瓦,同比增长16.6%;太阳能发电装机容量约3.1亿千瓦,同比增长20.9%。
 
用电需求的增加叠加新能源发电建设使得我国电网投资重归增长态势。
2020年国家电网投资金额达4605亿元,较2019年增加了132亿元,同比增长2.95%,2021年国网计划投资4730亿元。
据中国能源报报道,2022年电网投资额规划为5012亿,同比增长6%,创造历史新高。
 
2021能源电力转型国际论坛上,国家电网公司董事长、党组书记辛保安披露,“十四五”期间国家电网计划投入3500亿美元(约合2.23万亿元),推进电网转型升级。整体保持增长态势。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
 
相比于以往年电网的建设情况,市场更加关注十四五特高压的建设规划以及超预期的空间。
 
国网提出将于“十四五”期间新建特高压线路“24 交 14 直”,涉及线路长 3 万余公里,总投资共计3800亿元。
 
2020年十三五结束时“14交12直”共3.59万公里规模,十四五的计划接近翻倍,力度之大为历史首次。也体现出作为最有效的远距离输电手段。
特高压在保证风光大基地消纳和中东部地区提高可再生能源消费比例需求方面的重要性和迫切性。
 
据业内人士称,交流线路平均投资规模为115亿元,直流线路为232亿元。因此2022年仅新开工涉及的特高压项目规模将达到约1843亿元,叠加过往项目(4交2直)建设稳步推进。项目涉及总投资规模将达到2781亿元。
3800亿的特高压,如何补齐新能源的最后一块短板?
 
储备规划项目方面目前已披露6交9直,未来建设后劲充足。
据国网披露,2020年特高压项目投资规模为1811亿元,有效带动社会投资3600亿元,拉动了近两倍社会投资。特高压建设加速将有效助力稳增长目标实现,稳定社会预期。
 
如此看来,特高压赛道长期景气。
3800亿的特高压,如何补齐新能源的最后一块短板?
设备是重中之重
特高压产业链可分为上游材料、中游设备与建设以及下游电网与配电设备。
上游环节主要涉及相关材料与元器件,包括钢材、有色金属、化工材料以及电子元器件等环节,原材料成本约占特高压电器的20%-30%。
 
中游特高压电器设备主要包括站内设备与电缆、铁塔。其中,站内设备是全产业链中的技术密集环节。下游市场较为集中,主要是国网、南网等电网公司,还有配网设备公司。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
 
在特高压技术路径中,有两条分支,分别是直流和交流。可能部分投资者对于特高压交流和直流输电存在着争议。
中国科学院院士、中国电科院研究员周孝信指出,直流输电和交流输电只能互补,不能互相取代。
 
直流输电只具有输电功能、不能形成网络,类似于“直达航班”,中间不能落点,定位于超远距离、超大容量“点对点”输电。
直流输电可以减少或避免大量过网潮流,潮流方向和大小均能方便地进行控制。但高压直流输电必须依附于坚强的交流电网才能发挥作用。
 
交流输电则具有输电和构建网络双重功能,类似于“公路交通网”,可以根据电源分布、负荷布点、输送电力、电力交换等实际需要构成电网。
中间可以落点,电力的接入、传输和消纳十分灵活。定位于构建坚强的各级输电网络和经济距离下的大容量、远距离输电,广泛应用于电源的送出,为直流输电提供重要支撑。
 
尽管因输电形式不同,特高压直流与交流在基站数量与基站关键设备上存在差异,但设备投资均是特高压项目的重中之重。
 
就特高压直流项目而言,需建设换流站以实现交直流之间的转变,并达到电力系统对于安全稳定及电能质量的要求,投资重心是换流站。
 
站内主要包括换流变压器、换流器、平波电抗器、交流滤波器、直流滤波器以及无功补偿等。而换流站中最关键的设备就是实现换流功能的换流阀和换流变压器,二者分别占项目投资的15%与12%。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
 
换流阀,它由数量繁多的多种元器件组成,结构较复杂。换流阀的设计应用了电力电子技术、光控转换技术、高压技术、等多种技术融合以及高压用绝缘材料的最新技术和研究成果。
通过依次将三相交流电压连接到直流端得到期望的直流电压和实现对功率的控制。
 
从20世纪50年代开始运行的第一个瑞典哥特兰岛直流工程开始,换流阀的制造技术随着大功率半导体器件的制造技术发展,换流阀装备制造技术实现快速升级。
 
从分类上看,除了常规的晶闸管阀、还有低频门极关断晶闸管阀(GTO阀)、高频绝缘栅双极晶闸管阀(IGBT阀)。
 
尤其是IGBT阀是实现柔性直流技术压舱石。柔性直流技术相比传统直流输电具备安全可控与灵活实用两大优势,是实现新能源大规模并网的必要前提。
 
柔性直流输电是构建智能电网的重要装备。与传统方式相比,柔性直流输电在孤岛供电、城市配电网的增容改造、交流系统互联、大规模风电场并网等方面具有较强的技术优势,是海上风电的最佳选择。
 
柔性直流输电在实现区域联网提高供电可靠性、缓解负荷密集地区电网运行压力等更多领域得到应用,是改变大电网发展格局的战略选择。
 
相比传统特高压输电项目,IGBT换流阀和极线断路器投资占比更高,投资占比接近20%。
2007年以前,世界范围内实现柔性直流换流阀工程应用的只有ABB公司,且采用的是两电平/三电平技术路线,存在运行损耗高、容量扩展难等问题。
 
2007年年底,国家电网公司决定建设上海南汇风电场柔性直流输电工程。
2013~2021年,柔性直流换流阀参数不断提升,新技术不断涌现,工程应用形式从两端到多端再到组成直流电网,实现了从科技示范到大规模应用的飞跃。
 
由于柔性直流输电的低惯性特点,故障发展速度极快,所以需要断路器超高速的保护与之配合,作用十分关键。极线断路器成本占比也达10.9%,占比甚至高于换流变压器。
 3800亿的特高压,如何补齐新能源的最后一块短板?
从2020年的换流阀市场竞争格局来看,国电南瑞占据半壁江山,其次是许继电气和中国西电。
 
从工程中标情况看,柔直换流阀环节仍以国电南瑞、许继集团、四方电工、特变电工、中国西电等主要电网设备公司参与为主。极线断路器方面,国电南瑞、思源电气、许继电气等保持领先。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
 
特高压直流输电另外一个核心设备便是换流变压器,其主要用于长距离直流输电的电能转换等。
因为有交、直流电场、磁场的共同作用,所以换流变压器的结构特殊、复杂,关键技术高难,对制造环境和加工质量要求严格。
 
这一细分行业的竞争格局较为激烈,特变电工略微领先,中国西电、保变电气、山东电力设备相差不大。
 
3800亿的特高压,如何补齐新能源的最后一块短板?
 
在特高压交流项目中,投资重点是变电站。变电站内的电气设备分为一次设备和二次设备。
 
一次设备主要包括变压器、高压断路器、隔离开关、母线、电容器等。二次设备主要包括继电保护装置、自动装置、测控装置、计量装置、自动化系统以及为二次设备提供电源的直流设备。
 
简单来讲,完成发电-输电-配电功能的设备叫做一次设备,如发电机,断路器,电流电压互感器,变压器,避雷器等;对一次设备进行控制,保护作用的设备叫做二次设备,如继电器,控制开关,指示灯,测量仪表等。
 
二者之间最大的差别就在于所针对的电压等级不同。一次设备是根据高压侧来设计的,所带电压是强电,二次设备基本带的是弱电。
 
变电站中GIS(气体绝缘全封闭组合电器)与交流变压器是核心组件,据国泰君安统计,二者分别占项目成本的9%与7%。
从毛利率角度看,核心设备毛利率在30%左右,净利率在10%左右,相关环节公司业绩在特高压投资建设加速背景下弹性较大。
  3800亿的特高压,如何补齐新能源的最后一块短板?
综合来看,特高压电器支出约占特高压项目成本的60%。
假如国家电网3500亿美元的电网转型升级投资中,有40%投入到特高压建设项目,则2021-2025年我国对特高压电器的年均需求为1092亿元,特高压电器行业的市场规模有望扩大。
3800亿的特高压,如何补齐新能源的最后一块短板?
尾声
在新能源发电替代传统能源的道路上,储能、特高压技术是必不可少的。储能负责调峰调频,特高压则负责整合资源、分配资源。
 
风光发电+储能+特高压,三者将发电、运输、用电有机整合,形成新能源发电产业闭环。
 
作为新基建的重要领域之一,特高压建设具备产业链长、带动力强、经济社会效益显著等优势。
 
可以预见的是,新能源发电产业配套产业随着发电渗透率的提升同步发展,特高压产业已经蓄势待发。
转自:https://mp.weixin.qq.com/s/erhp6QGf28F4AR1ZbDlN0g
 
 
 

快狗打车们正驶入平台经济死胡同

本文系基于公开资料撰写,仅作为信息交流之用,不构成任何投资建议。

 

现在再来看,快狗打车、货拉拉、滴滴货运等一众网络同城货运平台,除去“移动互联网”“数字化”等一系列来自时代标签的特征,它们其实与本地物流货运的挂靠公司(即本地货运中介)没有根本区别——都是从撮合供需中抽取佣金的信息掮客。

如果网络平台的介入没有为行业带来新的合作关系或商业模式、没有为从业人员带来收入增长、也无法做大整体行业的蛋糕,那么网络平台之于该行业的必要性就大大降低,而这就是网络同城货运平台不得不面对的问题。

 

“不管是货拉拉还是快狗,都并未对同城货运带来更加革命性的改变。”常识之下,实质性问题在于:

 

  • 环境对于互联网平台公司已经不友好,而快狗们的集中度提升战争还未打完。

 

  • 低集中度的情况下,全行业已经在快速提高抽佣,司机挣得少行业怎么做大?

 

  • 以上两点,导致货运平台份额和盈利两不沾,这不只是IPO进程中的快狗的问题,也是全行业的问题。

  

快狗打车们正驶入平台经济死胡同

图:部分货运行业参与者,来源:网络

 

 

01

还是那套老故事

 

 

经历了这么多年共享经济的市场教育,平台的商业逻辑也就变得再清楚不过,每个参与者都在大肆烧钱朝着行业“龙一”的位置去发展,当其中一位开始坐拥市场绝对份额之后,再祭出大杀器——涨价,这一模板式的路数往往被市场称之为“平台税”。

 

照猫画虎,同城货运场景亦具备天然平台经济的组成要素,参与者通过“买流量”的方式(投入营销、地推等方式)汇集本地货运市场需求,另一方面则通过“补贴”的方式(低佣金、高配单等)吸引司机入驻平台;等到市场份额较高之后,再通过降低补贴、提高客单价和调高抽佣比例开始坐地收钱。

  

快狗打车们正驶入平台经济死胡同

图:平台税,来源:网络

 

这种平台套路基本上是一打一个准,无论是在电商、支付、外卖、打车市场,还是在共享经济、网络招聘等市场,无一例外都遵循“先做大、再称王”的平台经济思路。

 

但随着针对平台经济一系列的上层操作,以上商业逻辑已经在资本市场开始暗淡,导致整个互联网平台经济的估值都在回调。

 

与此同时,同城货运的参与者们仍然在加码争夺这一场景,又表明行业的竞争还很激烈,整体上行业仍处在烧钱换份额的阶段,这也是变数最大、风险最高的发展时期,而能够在行业中存活下来的往往最多不会超过3家。

 

所以,当错过最佳窗口期之后,再看如今依然处于烧钱阶段的同城货运平台们,对他们的故事已没有过多期待,已有物是人非的叹息之感。

 

 

02

平台中司机赚钱变难

 

 

聊完行业总体逻辑之后,我们可以将注意力先集中在现阶段司机端的资源供应上。当下平台货运司机收入的增长与否,将决定整体同城货运平台的市场渗透进度。

 

如果现在还有司机或是新人想咨询“加入同城货运平台是否赚钱的问题”时,那么部分老司机会这么回答,“如果你现在就有5-6千元的稳定月收入,那么还是乖乖回去继续上班吧。”

 

稍微分析老司机的回答,单纯的理解就是现在同城货运司机的收入一来不稳定,二来可能不比月入5-6千元;而复杂一点的理解也可能是,现在的月收入也可能要大于5-6千元,但是司机的月收入相较过去已经出现下降,所以直接劝退新人以延长供给资源的紧缺,从而保障收入。

 

但总体上,大致可以肯定的是,目前平台司机的收入呈现下降的趋势,它主要表现在如下3个方面:之前单吊“会员费模式”的货拉拉,现在也开始抽佣(比例在5%-15%之间);快狗打车的收入主要依靠抽佣,辅以会员费,从2018年至2021年9月,其国内市场的整体抽佣比例从5.8%增长到11.7%,海外则从4.5%增到9.2%;现在,平台司机哪怕成为付费会员,订单业务量并不能得到保障,空窗时间越来越多。

 

而针对货拉拉“899元开通超级会员月入3万”的传言,在某视频网站上,一位身在杭州的年轻货运司机(自有车、有经验)通过身体力行的方式验证,开通899元/月的超级会员服务后,一个月的流水大概在1.1万元,刨去加油费、餐食费、高速费、会员费等开支后,当月实际到手收入在7200元左右。 

 

快狗打车们正驶入平台经济死胡同

图:老司机草根调研,来源:网络

 

简言之,现在同城货运平台里的司机的收入正在走下坡路。

 

 

03

盈利与份额两不沾

 

正在IPO的快狗打车,是最早一批加入同城货运领域的平台玩家,也是从一众平台里脱颖而出的一家,其近年来的运营数据不仅能够反映个体公司的经营状况,也能够折射行业的基本情况。 

 

快狗打车们正驶入平台经济死胡同

图:快狗利润表,来源:招股书

 

截至2021Q3,快狗打车最新数据的营收为4.73亿元,毛利率增长至36%,亏损则达2.14亿元,亏损占比总营收再增至45.3%,亏损再次拉大。其中,销售及营销费用为2.31亿元,占比总营收约48.9%,同比2020Q3的1.5亿元同比增长了54%。

 

一方面快狗要在司机端扩大收入,另一方面其又在市场推广上进行大投入,这有别于先前平台经济的发展逻辑,意味着快狗在还没有取得稳固市场的情况下,开始打压自身平台的运力基石。 

 

快狗打车们正驶入平台经济死胡同

图:快狗现金流表,来源:招股书

 

造成快狗采取这一别扭行为的原因有很多,包括自有现金不足、IPO时间紧迫、滴滴货运半路搅局等等,导致快狗在财务盈利和市场份额之间难以做到“面儿上”的平衡,最终是两头都没沾上,一来亏损再次拉大,二是市场份额(同城货运线上平台交易额)从2020年的5.5%下降至2021Q3的3.4%,排名也从第二位下滑至第三位。

 

而对于快狗平台中的司机而言,收入被平台持续压降,平台份额的减少导致业务量缩减,越来越多的司机将离开平台。数据显示,从2018至2020年,快狗拥有的活跃司机数分别为21.68万、27.24万、23.29万,提供货运服务的司机分别为5.75万、7.99万、7.05万;而2020Q3和2021Q3的活跃司机数是20.20万和16.50万,其中提供货运服务的司机是5.67万和5.74万。

 

现在快狗的处境是,司机资源随着市场份额一起流失,平台没有突出的造血能力,现在再与市占第一的是货拉拉(在互联网同城货运市场中市占额超过50%,整体C端市场份额不高)以及第二的滴滴货运竞争抢市场,依靠IPO融资逆风翻盘的可能性有多高呢?

 

 

04

同城货运是平台经济的死胡同

 

 

事实上,快狗的失意并非会是个例,货拉拉或滴滴货运并不会因为少了一个竞争对手就更容易获得成功,平台经济的打法很可能并不适用于同城货运市场。

 

首先,我们需要搞清楚同城货运市场的规模和结构。中国的同城货运确实是一个万亿市场的规模,其中个人货运的需求大概只有15%,其余约85%的份额则来自于中小企业和大型企业的货运需求。

 

就细分市场增速而言,个人货运规模增长幅度最小,近年来基本维持在2000亿元规模;中小企业货运规模年均增长15%,2020年规模在3700亿元;大型企业的年均增长达到16%,2020年的规模在6700亿元,市场整体增量和份额都主要在于非个人业务。

 

直观上就很好理解,如果能够有一家同城货运平台在B端业务上取得30%以上的份额,那么他将会在烧钱竞争中获胜。换言之,谁擅长做B端货运业务,谁的优势将更加明显。

 

在货拉拉、滴滴货运和快狗打车三强中,快狗打车的发展路径和优势就在于B端业务(如为共享单车调度车辆、小型餐饮门店的原材料配送等),但其显然是一个证伪的例子,B端业务并没有让其市场份额持续提升。

 

核心在于,B端业务基本都来自于企业的经常性配送货需求,由于供需关系、物流路线、运货时点都比较稳定,所以企业与货车司机或是本地物流挂靠公司的合作关系也很稳固,这中间无法再容纳一个网络货运平台的角色。所以,前期平台能够通过烧钱的方式在企业和司机之间横插一脚,但平台开始反向收钱的时候,企业和司机自然就会排挤掉平台的牵绊。

 

既然无法在企业和司机之间插一杠,换成个人与司机之间的关系似乎又变得合乎情理,毕竟2000亿元个人同城货运的规模也不容小嘘,货拉拉就在于攻陷了个人用户的心智从而实现在网络同城货运平台中的一骑绝尘,而滴滴货运也同样依靠滴滴的C端流量迅速赶超快狗打车。 

 

快狗打车们正驶入平台经济死胡同

图:滴滴货运通过补贴快速起量,来源:网络

 

不过,C端同城货运平台的发展命门仍在司机这一环。

 

1、与打车场景不同,个人同城货运的频率要低得多;

 

2、货运司机基本都是职业人员,出行司机除了专职司机之外,还有众多的兼职司机,所以出行平台具备庞大的潜在运力,令平台的信息整合和实时撮合变得非常必要,而运力相对固定且需求频次很低的货运平台的信息撮合价值大大降低;

 

3、同城货运司机不可能专职跑个人类的零碎订单,他们大部分时间都在运送B端的货物,只会抽出富余时间跑个人业务,从总量看,货运司机在个人业务上投入的时间不会超过总工作时间的20%。

 

所以,哪怕有平台能够坐拥30%的C端货运市场份额,也很难通过提佣的方式获利,因为司机大部分收入来自于更为稳定的B端业务,平台对司机没有绝对把控能力,同样也无法在财务盈利和市场份额中达到平衡。

 转自:https://mp.weixin.qq.com/s/SPurjW7liZffMaHMRF1U1w

构建一套可靠的分布式大型软件系统

https://icyfenix.cn/

我不服!这开源项目居然才888个星!?

先看一下我看了之后整理的思维导图吧:

我不服!这开源项目居然才888个星!?

看不清没关系,文末会给你领取链接的。

看完之后我个人的一个感受是:关于分布式架构方向,写的很多很全很系统。而且都是笔者一路走过来的经验之谈,浓缩在了文章里面。

对得起首页的这一句口号:构建可靠的大型分布式系统。

谁写的?

那么这个开源书的作者是谁呢?

周志明。

是的,就是你想到的那个凭借一己之力拉高了 Java 开发者内功水平,把 JVM 带到了初级面试题环节的男人。

我不服!这开源项目居然才888个星!?

其实你仔细看周佬写的自我介绍,很有小细节。

程序员、研究员、作者、布道师这四个职业,排在第一的是最没有噱头的“程序员”一职。

而在程序员里面,给自己的描述是:

一名兼职一些管理与研究工作的程序员。

其实关于这个点,我看过周佬的一些公开场合的自我介绍,都是说自己是一个“兼职一些管理工作的程序员”,给自己这样的人设标签。

他在自己写的《程序员之路》一文中解释过这个标签。

他想要透过这个标签表达的是对于一枚程序员,以后是想要发展为一个架构师还是研发管理者,都不要轻易地离开技术领域的一线前沿。

离开技术、放弃编码的决定很可能会像你高考之后放下的数学、生物、地理等知识那样,一旦放手,毕生就很难有机会再重新捡起来。

当你放下代码的时间越长,久而久之,你对代码、技术、产品状态与团队研发状态的理解,渐渐的会和团队成员产生了偏差错位,丧失了细节上给予指导的能力,丧失了专业问题上提出接地气解决方案的能力,只能在无法短期难以校验对错的大战略方向提意见。

在会议、流程及团队管理措施上下功夫,在职业经理人式的宣讲与汇报上寻找存在感。

此刻,你便从团队的导师变成了管理者,最终你与团队的关系,从携手并肩奋斗的伙伴,完全演变成只能靠公司制度与管理职位的权力来维系雇佣关系。

我能理解周佬说的现象,其实是一个非常普遍的现象。甚至有的朋友走上管理岗位的目标就是不再写代码了,基于当前的市场和行业现状,这样的选择是无可厚非的。

只是,有没有那么一点点可能,不要完全抛弃代码。这也需要是你和团队之间的最行之有效的纽带。

就像《代码整洁之道》一书中说的:

软件架构师本身就是最好的程序员,他们会一直编写代码,虽然可能不会像其他程序员输出的代码量那样多,但是只有持续地编程,才能确保他们遇见其他程序员所面对的问题,体会其他程序员心中的感受,因此如果不编程,他们亦将无法胜任软件架构这项工作。

这本《凤凰架构》,周佬自己对它的定位是这样的:

我不服!这开源项目居然才888个星!?

给开发人员整理的关于软件架构方面的技能地图,同时系统的梳理自己的知识,并配备了对应技术方案的演示程序。

真的是一件利人利己的事情。

我本来的想法是先带着你囫囵吞枣的走一圈这一本书,主要起到一个介绍的作用。

但是越写越不得劲的感觉,于是我把写好的大部分都删除了。因为即使我写的这么卖力认真,都没有体现出这本书的价值的千分之一。

你得自己去读,你才知道我没有骗你:这真的是个宝藏啊!

所以我决定换个思路,告诉你这里面有什么就行了,其实就是书中的探索起步一小节。

如果你对里面的某一部分感兴趣,自己主动打开网站去翻一下,那么我的目的就达到了。

探索起步

我不服!这开源项目居然才888个星!?

这是探索起步的更新日志部分,可以看到周佬对于该项目一直在进行维护新内容:

我不服!这开源项目居然才888个星!?

而对于已有的内容,其中的错别字、不通顺的地方、含义不清的地方,他也在抽时间修改,最近的一次修改就是 6 月 6 日,昨天,上周日:

我不服!这开源项目居然才888个星!?

所以,相比于其他的大部分网上的文章来说,会更加实时、系统、优质一点。

全书分为五大部分和两个篇外,而为了让你快速定位到合适自己的部分,周佬也细心的介绍了每一部分对应的读者类型。

  • 引导篇 探索起步这部分面向于准备对文档介绍的内容亲身实践的探索者。
  • 第一部分 演进中的架构:这部分适合所有开发者,但尤其推荐刚刚从单体架构向微服务架构转型的开发者去阅读。
  • 第二部分 架构师的视角:这部分讨论与风格无关的架构知识,适合所有技术架构师、系统设计、开发人员。
  • 第三部分 分布式的基石:这部分面向于使用分布式架构的开发人员。
  • 第四部分 不可变基础设施:这部分面向于基础设施运维人员、技术平台的开发者。
  • 第五部分 技术方法论:这部分面向于在企业中能对重要技术决策进行拍板的决策者。
  • 篇外 随笔文章:这部分无特定读者对象,内容是笔者日常文章的整理。
  • 篇外 附录:这部分面向刚开始接触云原生环境的设计者、开发者。

演进中的架构

其中第一部分我读完之后做的思维导图如下:

我不服!这开源项目居然才888个星!?

我曾经就完整的经历过一个服务从单体系统时代,再到 SOA 时代,最后步入微服务时代的全过程。

所以能比较深刻的理解到周老说的观点:

架构并不是被发明出来的,而是持续演进的结果。

可能你对于其中的后微服务时代和无服务时代稍微有点陌生,但是我换个英文名称,你就应该是非常熟悉了。

后微服务时代其实就是云原生时代,Cloud Native。

而无服务其实就是 Serverless。

但是需要注意的是,周佬把 Serverless 排在了 Cloud Native 之后,其实它们两者并没有继承替代关系。不要因为周老对于两者的书写顺序产生了“无服务就会比微服务更加先进”的错误想法。

周佬对于这两者之间的关系描述是这样的:

如果说微服务架构是分布式系统这条路当前所能做到的极致,那无服务架构,也许就是“不分布式”的云端系统这条路的起点。

架构师的视角

第二部分的思维导图如下:

我不服!这开源项目居然才888个星!?

这一部分主要聊了我们做分布式服务时,一定会涉及到的问题,比如:远程服务调用(RPC)、分布式事务的处理、多级分流、架构安全。

我个人认为这一部分是干货满满的。

其中访问远程服务,对 RPC 和 REST 从各自的起源开始进行了一个详尽的描述:

我不服!这开源项目居然才888个星!?

事务处理小节,你可以看看“共享事务”的概念,其实我发现有一部分号称是微服务架构的项目,走向了“共享事务”的路线。其实这是一种伪分布式,或者说是“阉割版”的分布式。

“共享事务”的提法和这里所列的两种处理方式在实际应用中并不值得提倡,鲜有采用这种方式的成功案例,能够查询到的资料几乎都发源于十余年前 Spring 的核心开发者Dave Syer撰写的文章《Distributed Transactions in Spring, with and without XA》。笔者把共享事务列为本章四种事务类型之一只是为了叙述逻辑的完备,尽管拆分微服务后仍然共享数据库的情况在现实中并不少见,但笔者个人不赞同将共享事务作为一种常规的解决方案来考量。

透明多级分流系统从客户端到网络再到服务端的拆析,这是一种上帝视角的描述,对于一次请求的进过脉络梳理,清晰的了解到系统的方方面面。而这一部分的主题就是“架构师的视角”。

架构师就应该是从这样的一个比较统筹规划的角度去看待系统,不必进入到具体系统的细枝末节中去:

我不服!这开源项目居然才888个星!?

分布式的基石

第三部分分布式的基石:

我不服!这开源项目居然才888个星!?

共识算法、服务发现、流量治理、网络通信、监控预警共同构成了分布式的基石。

可以说如果是一个分布式的服务,都能找到上面的这些关键词的影子。

有些是应用系统自己做的,有些是开源框架就帮你搞定了,你甚至不知道它们的存在。

但是我认为上面的诸如流量治理和监控预警(可观察性)并不是一个分布式服务一开始搭建时所必须的。

大多数情况下,刚刚搭建好的分布式都处于一个蛮荒状态。随着时间推进和业务的发展,会慢慢补充上流量治理和监控预警。

也就是说如果想要分布式服务发展的方向是可监控、可控制的,那么这些东西都是应该有的。

所以“基石”一词,用的像是手术刀一样精准。

接着来到了第四部分,不可变基础设施:

我不服!这开源项目居然才888个星!?

到这里我们就要从微服务走向云原生了。

在这一章,周佬以容器、编排系统和服务网格的发展为主线,介绍虚拟化容器与服务网格是如何模糊掉软件与硬件之间的界限,如何在基础设施与通讯层面上帮助微服务隐藏复杂性,解决原本只能由程序员通过软件编程来解决的分布式问题。

接下来的“技术方法论”属于微服务避坑指南,从目的、前提、边界、治理四个角度去阐述如何更好的使用微服务。

随笔文章

最后一部分是“随笔文章”:

我不服!这开源项目居然才888个星!?

其中的《云原生时代,Java 的危与机》和《程序员之路》这两篇文章,建议你反复观看。

前者是技术方向的,后者是软技能方向的。

读完《Java 的危与机》,我感受到的是一场关于 Java 的自我革命已经悄然开始了。

Java 并不是一个优秀的开发语言,这一点我是非常承认且确定的。但是 Java 有一个庞大的用户群体和异常丰富的生态,这是它的护城河。所以短时间内还倒不下来。

但是大风起于青萍之末。虽然风雨欲来,而包括我在内的很多人都浑然不知。

在文章里面,周佬有这样的一段话:

Java 支持提前编译最大的困难在于它是一门动态链接的语言,它假设程序的代码空间是开放的(Open World),允许在程序的任何时候通过类加载器去加载新的类,作为程序的一部分运行。要进行提前编译,就必须放弃这部分动态性,假设程序的代码空间是封闭的(Closed World),所有要运行的代码都必须在编译期全部可知。这一点不仅仅影响到了类加载器的正常运作,除了无法再动态加载外,反射(通过反射可以调用在编译期不可知的方法)、动态代理、字节码生成库(如 CGLib)等一切会运行时产生新代码的功能都不再可用,如果将这些基础能力直接抽离掉,Helloworld 还是能跑起来,但 Spring 肯定跑不起来,Hibernate 也跑不起来,大部分的生产力工具都跑不起来,整个 Java 生态中绝大多数上层建筑都会轰然崩塌。

“整个 Java 生态中绝大多数上层建筑都会轰然崩塌。”

所以,Java 的这次变革属于釜底抽薪。

读完《Java 的危与机》之后,你再去看《Graal VM》一文,你就明白了:为什么说 Graal VM 的成功与否,与 Java 的前途命运息息相关。

其实这场变革已然悄悄开始,比如说一个小点:

大多数运行期对字节码的生成和修改操作,在 Graal VM 看来都是无法接受的。

但是比如 CGLIB 就是通过运行时产生字节码(生成代理类的子类)来做动态代理的。

这是目前的主流形式。

现在因为Graal VM 支持不了,所以必须由和框架一起来共同解决。

因此自 Spring Framework 5.2 起,@Configuration 注解中加入了一个新的 proxyBeanMethods 参数,设置为 false 则可避免 Spring 对与非接口类型的 Bean 进行代理。

同样地,对应在 Spring Boot 2.2 中,@SpringBootApplication 注解也增加了 proxyBeanMethods 参数,通常采用 Graal VM 去构建的 Spring Boot 本地应用都需要设置该参数。

可以看到的是为了推进 Java 生态向 Graal VM 兼容,Graal VM 主动拉拢了 Java 生态中最庞大的一个派系:Spring。

这即使壮士断腕,也是唇亡齿寒。

而我最喜欢的还是技术演示工程部分,并不是架空了去谈,而是直接把项目 Demo 都给你准备好了,开箱即用:

我不服!这开源项目居然才888个星!?

我发现周佬写的这个开源项目还有个特点,引用的部分会给出具体的官方的地址。严谨又权威,比如写到项目中用到的技术组件的时候:

我不服!这开源项目居然才888个星!?

真心推荐大家收藏起来,系统学习。

一个问答

在项目里面,我还发现了一个问答。

问题和回答都非常的好,搬运过来给你看看。

评论区:https://icyfenix.cn/methodology/forward-msa/prerequest.html

问题如下:

周大哥,看到了您说的马太效应。再联想到之前您讲的软件涅槃,而完善的微服务体系允许服务有涅槃的过程,有强大的容错能力。微服务发展又如此迅猛,觉得马太效应真的不远。

我不禁对最需要掌握的技能进行了思考,并产生了更强的焦虑感。

我是一名有七年工作经验的java开发工程师,28岁,目前在一家北京的传统信息软件技术公司,工资相对计算机行业偏低。

局限在java语言来说,jvm调优与并发编程等比较高阶的能力,是不是就很不关键了?

jvm我读了您写的《深入理解Java虚拟机:JVM高级特性与最佳实践》的第二版与第三版,由于工作中鲜有机会实践,只停留在一些理论理解,而缺失实践,理论知识也会淡忘。

并发编程读过《Java并发编程实战》,对并发编程有些了解,也有一些实践,一般水平。

微服务公司并没有用起来,实践经验也缺少。远程调用、分布式事务、注册中心、配置中心、熔断、限流等知识,通过看视频跟您的这个文档有一些了解。

java基础知识,经过这些年的磨练,是挺扎实了,spring能熟练使用。

常用设计模式有了解,也理解的比较到位。

我不想沦为螺丝钉。

我应该提升自己的哪些能力呢?

这些年只是做到了胜任分配给自己的工作。

现在发现自己缺少前瞻性思考,缺少对自己职业生涯的把控。

我现在想把握自己的职业生涯,请周大哥给一些指导。

我会通过招聘市场去挖掘市场需求,做整理,进行思考。

但是迫不及待的想跟您述说一下,请您不吝赐教,希望我的请求不是很唐突。

这个问题其实是很具有普遍性的:学了没地方实践,慢慢就忘记了。理论学了一大堆,聊起来可以谈笑风生,但是就是没有实际使用过。自己就是一颗螺丝钉。

周佬的回复如下:

写这文章不是为了贩卖焦虑,我也没有能力指导别人的职业生涯,但针对“应该提升自己的哪些能力”这类问题,我以前被问过很多次,这里可以重复一下。

我的建议就两个:

不要轻视不直接产生实践价值的知识;
不要对陷入已经被你熟练掌握的技术中不能自拔。

为了便于你理解,我做一个很土的比喻,把程序员提升自己类比成武侠中的练功,软件中的技能其实有很明显的“内力”和“武功”之分,譬如你提到的Java虚拟机,这类知识不仅是你在工作中鲜有机会实践,我也是差不多的。

大学计算机课程中,以“原理”二字结尾的课程,譬如计算机原理、操作系统原理、编译原理、数据库原理,等等,对绝大多数人而言,都不太会去设计处理器逻辑电路、设计程序语言和编译器,开发操作系统内核。

这些都有很经典的书:编译原理的龙书,计算机体系结构和程序运行的CSAPP,分布式与数据库原理的DDIA、操作系统原理的MOS,等等。这些书系统严谨全面,但可读性并不优秀,在B站/Coursera刷这些书作者们的公开课翻译视频也许是更好的方法。

这些技能能够辅助你去思考和分析问题,但是很难直接为你解决生产中的问题,以实践价值,就是以工作中是否有机会用到来衡量它们的作用是不合适的。

但这些课程之所以会是必修,是因为学习它们,能够为一名程序员的知识框架构筑好基础。

这话听起来很教条,可是当你一旦建立了相对完备稳固的知识框架,发现遇到的新知识、新技术,能够很自然地安放在已有知识体系的某个位置上,能够清楚感知到语言、技术、框架的设计意图和目标,甚至能共鸣到设计者当时所想,就会产生一种理所当然的感觉。

这样你接受新知识的认知负荷就会比别人更低,掌握起来更快速,理解起来更深刻。

我在这文档开篇中所说的,写这部文档是以整理自己的知识框架为目的,并非场面话,这点的确就是程序员如何学习新知识的关键,在知识快速迭代IT业界,这也是决定一名程序员能力上限有多高的根本因素。

相对的,那些具体的、用来解决生产中问题的技术和方法,譬如你提到的Spring、设计模式,我将其类比为“武功”。

这当然也是重要的,只有内力没有武功无法行走江湖,空有一身理论,但写不出代码来(包括那些只定大方向的架构师、设计者),我认为不肯定是合格的程序员,也很难指望能成为一名出色的技术领导(难以服众)。

但是具体的“武功”应该是能够快速捡起的,也能快速“忘掉”的,就是避免将一件事情做熟了,就一直陷在这件事情里面,避免拿到一把好的锤子,就看着一切问题都像是钉子。

很多程序员都抱怨,自己是CRUD Boy,自己在业务逻辑中打滚,没有机会接触底层的或者前瞻性的技术,所以自己技术难以提升。

这里当然有客观原因的存在,但往往也是受到了主观原因放大。

程序员其实与旧时代的手工技艺者差不多,骨子里就有天生的技术崇拜,你写的代码比别人的优雅健壮高性能,你杀BUG比别人快速干净利索,就会受到大家的认可。

很自然地,更多偏向技术偏向深层次的工作就会落到你这里,至少你会有话语权,有选择做哪些事情的权利,是否要一直在围绕着你最熟悉的业务去打滚是由你决定的。

学习武艺成为“武林高手”,是成为大BOSS之后才不必长期面对虾兵蟹将的纠缠。

学习一门具体的技术,也是为了用它解决好问题,然后把它忘掉,去掌握那些更深层次的、更前沿,而且自己还不会的技术。

最后还有个追问和回答如下:

我不服!这开源项目居然才888个星!?

不知道你看到这个回答后的感受是怎么样的。

至少对我而言,振聋发聩。

特别是这两点:

不要轻视不直接产生实践价值的知识;
不要对陷入已经被你熟练掌握的技术中不能自拔。

已经放入手机标签中,时常提醒自己。

与君共勉。

最后说一句

最后再放一次开源项目的地址:

https://icyfenix.cn/

— EOF —

转自:https://mp.weixin.qq.com/s/8ASb7Aod6DAnIyW02TXfUQ

​万科说了大实话:其他房企要么生,要么死

 

1

这本来是一个热点。
 
无奈我在海南出差,一直没法抽出时间去写这个事情,忙完调研之后,终于有时间静下心来去理解这件事情。
 
如何看待万科?
如何看待黑铁时代?
万科如何看?
其他房企如何看?
 
如何非常透彻的去理解万科这些话,是一门艺术。  
 
前几天,万科的一份宣言一战封神,席卷了整个地产圈,让所有从业者为之一振。表面上看,万科所有的言论都是对自己说的,要么生,要么死,没有中间状态。
 
很多人也围绕这个巴拉巴拉说了一大堆,但是我相信,如果你对万科的手段有非常充分的了解,如果你对市场的残酷有非常充分的了解,你就应该知道:
 
这些狠话哪是对万科说的,明明是对其他房企说的。
万科怎么可能是猎物,万科才是真正拿枪的猎人,而且是非常饥饿的猎人。
 

2

我相信,大家都知道非洲大草原。
 
不管你有没有去过,哪怕你只是在电视纪录片去看,也一定非常清楚,整个非洲大草原的生存法则,是非常残酷的,尤其是旱季。
 
对所有动物来说,都是一场生死考验。
 
处于食物链顶端的狮子,需要捕猎更多的事物。
 
处于食物链中端的豹子、鬣狗,向上捕猎狮子,向下捕猎野牛野鹿斑马小象等。
 
处于食物链底端的野牛野鹿斑马小象,只能求全自保。
 
谁跑的最快,谁就能活下去。
 
如果狮群中,有狮子抵挡不住十几只鬣狗的攻击,也必然会丧命;
 
如果鬣狗抵挡不住狮子或者大象野牛的攻击,也必然会丧命;
 
如果野牛野鹿斑马小象抵挡不住狮子、鬣狗的攻击,也必然会丧命。
 
自然法则之下,从来没有永恒的王者和弱者,只有活下去才是所有人的目标。
 
难道恒大华夏幸福阳光城不是掉队的狮子吗?
 
难道碧桂园万科+国央企不是幸存的狮子吗?
 
难道活下去的中小型房企不是幸存的鬣狗或者斑马小象吗?
 
难道濒临死亡的野牛野鹿斑马小象不是掉队的中小房企吗?

 

非洲大草原,一场旱季就是一场你死我活的斗争。
 
那么房地产,如此环境中也在进行一场你死我活的斗争。 

 

​万科说了大实话:其他房企要么生,要么死

 

3

开年很不顺,都在吃SHI。
 
雅居乐大降价。碧桂园大降价。
 
世茂被摆在了案板上,任由宰割。
 
建业大裁员、架构调整,先活下去。
 
正荣,或许成为下一个阳光城花样年。

 

前一段万科郁亮的讲话,开头第一句,就充满了杀机。
 
2022年是集团破釜沉舟、背水一战的一年,也是一个新时代的开始。
 
还有一些话,说得比较狠:
 
外部环境的第一个特征是行业进入缩表出清阶段。
 
去金融化是一个欣然的趋势,也是痛苦的过程。好比刚开始给你吃糖感觉很好,但吃多之后,堆积脂肪,等到戒糖的时候就会很痛苦。这个时候已经严重依赖,没有糖吃就会萎靡不振。
 
今年是背水一战的一年,如何理解背水一战?就是要么死、要么活,没有中间状态。
 
缩表出清对于我们来说,就是一场生死之战。
 
我只是把其中最关键的一些截取给你看,剩下的都好理解。
 
很多人对于万科的理解还是停留在了“难”上,甚至都停留到了嘲笑房地产的“黑铁时代”,房地产市场一天不如一天了,是不是可以偃旗息鼓了。
 
如果你真的是这样理解,只能说明你心地善良。
 
换个表述是:你比较傻。 
 
恰恰相反,万科吹起了冲锋号。
 
整个房地产市场的容量也就17-18万亿,增量绝对减少,增速绝对放缓,这是一定的,这样的结果就必然意味着存量博弈。
万科多吃一点,其他房企就必然少吃一点。
万科胖一点,其他房企瘦一点。
万科过的越好,其他房企过得越差。
不是万科的错,而是市场的错。
 

4

万科,一直很鸡贼。
大家可以想一个问题:
2008年,万科喊出大转折的时候,恒大是不是差点死掉?是不是有一大批房地产企业死掉?
2016年,万科喊出活下去的时候,是不是万达差点死掉?是不是现在依旧有大量的企业还在挣扎于三道红线?
 
2022年,当万科喊出“缩表”、喊出“生死战、没有中间状态”的时候,你觉得最危险的是万科,还是你自己?

 

凡是看热闹的,死得最快了。
 
但凡万科预料到市场的风吹草动,就必然采取一些措施去执行。
比如大降价。
比如收缩战略。
比如裁员。
比如降低融资成本。
比如扩张业务。
举一个最简单的例子。
同样是4家楼盘,万科,以及A、B、C。
万科售价18000。
A品质口碑都差点,16000。
B品质口碑都是最好,20000。
C本地企业口碑正常,17000。
那么问题来了,如果市场极差,那就必须倒逼着万科回款,但是想要在这么差的市场中回款,解决的办法只有一个:
降价。
为了回款,万科一口气干到了15000,直降3000。
如果这样,一定会逼死周边的楼盘。
因为这个板块的销量就400套,原来每家销售100套(最理想的状态),但是现在万科自己一家吃200套,剩下200套三家去分,肯定吃的少了。
本来品质口碑就差的A会不会死掉?
本来品质口碑最好的B绝对高位站岗。
本地企业口碑正常的C,一定会回款压力较大。
这样的案例还少吗?
2008年的万科是这么做的,然后被人砸了售楼部,其他楼盘死不死?其他房企死不死?业主闹不闹?
2021年天津南站的楼盘中,周边都是18000,正荣直接干到了14000,其他楼盘死不死?
2021年郑州管南,曾经有一个时间点,正常价1万4,只有融创均价1万1,最低不到1万,价差至少3000,其他楼盘死不死?
最关键的是,这些都是市场行为,谈不上恶意降价。
我相信,你肯定见过碧桂园的大降价。
我相信,你肯定见过恒大的大降价。
我相信,你肯定见过融创的价格战。
这一招,屡试不爽。
 
 

5

好,既然你明白了。
 
如果万科的讲话,只是让你意识到万科的危机,而没有丝毫预料到自己的危机,那么我觉得没有危机意识的房企,确实该死。
 
楼盘如此。
房企如此。
业主如此。
 
因为万科讲话,既是讲给自己听的,更是讲给对手听的。
 
尤其是对手,一定要好好听,一定要好好琢磨万科下一步做什么,因为万科做什么,就意味着你必须做什么,而且必须做更快、更靠前。
 
只有比万科跑的更快才能活下去。
 
我觉得,对于万科的,永远要相信一点:
 
1、 难、缩表、黑铁时代,是说给万科自己听的。
 
2、 这些话更是说给竞品听的。
 
我相信,碧桂园的杨老板肯定知道,恒大的许老板肯定知道,华润中海的掌门人肯定也知道,华夏幸福荣盛阳光城的老板都知道。
 
也就是说,所有老板都非常清楚。
 
不管现在春风得意还是一时沉浮,难应该是共识。
 
所以,难不是问题。
 
最大的问题是如何做。
 
或者说,如何做也不是问题,因为这些都是战术,不是战略本身,对于房地产的掌舵者而言,现在会继续纠结一个项目挣多少利润?如何打造精品项目?如何拿了多少地?还会围绕在这些细枝末节上吗?
 
如果还是,这些房企必死,也该死。
 
最关键的是,万科背靠深圳地铁,背靠优质贷款,现金流相对很健康,不担心这个问题,但是:
 
今年会不会降价?
今年会不会拿地?
今年会不会收购?
今年会不会更多的联合开发?
今年会不会更多的跨界发展?
今年会不会向其他房企输送更多的人才?

 

都有可能。
 
 

6

1、难是共识。
 
2、甭管青铜时代,还是黑铁时代,活下去最重要。
 
3、活下去是万科的唯一目的,只要不犯法,什么手段都能用。
 
4、那么,降价可能,并购可能,抄底可能,最危险的肯定不是万科,而是万科之外的房企,而是可能高位站岗的业主。
 
5、如果你是房地产老板,如果你是房企员工,如果你的对面就是万科的楼盘,我相信你一定会有危机意识。
 
6、其他房企亦是如此,买房难,卖房难,工作难,收入难。
 
7、以上观点,与君共勉。

转自:https://mp.weixin.qq.com/s/AWwEDJjw08zy0uc3-16-VA