主頁 > 前端設計 > 用模擬退火演算法估價heston期權定價模型的五個引數

用模擬退火演算法估價heston期權定價模型的五個引數

2020-11-03 17:55:33 前端設計

1973年BS期權定價模型的誕生標志著期權定價進入精確的數量化測度階段,但是BS模型假設標的資產波動率為常數,這與現實市場觀測到的“波動率微笑”曲線嚴重不符,
heston假設標的資產的價格服從如下程序,其中波動率為時變函式[1]:
參考
并且求出了歐式看漲期權定價公式[2]:
在這里插入圖片描述
在這里插入圖片描述
本文使用python實作了上述定價公式,該公式需要輸入一共九個引數,其中[v0,kappa,theta,sigma,rho]需要提前自行設定并填入,另外四個 [K,t,s0,r]:[執行價格,剩余時間,標的資產價格,無風險利率] 則是期權價格資料,BS模型定價同樣需要這幾個引數,
sv_model.py

"""heston期權定價模型計算期權價格"""
import numpy as np
import scipy.integrate as spi

class SV():
    """計算Heston隨機波動率模型下的期權價格"""

    def __init__(self,K:float,t:float,s0:float,r:float,v0:float=0.01,kappa:float=2,theta:float=0.1,sigma:float=0.1,rho:float=-0.5):
        """輸入期權資料和基礎引數
        
        #期權資料
        k   -期權執行價格
        t  -期權剩余到期時間(年)
        s0 -標的資產初始價格
        r  -無風險收益率
        
        #初始引數
        v0
        kappa
        theta
        sigma
        rho
        """
        # 期權資料
        self.K = K 
        self.t = t 
        self.s0 = s0 
        self.r = r

        # 初始引數
        self.v0 = v0
        self.kappa = kappa
        self.theta = theta
        self.sigma = sigma
        self.rho = rho

    # 特征函式
    def characteristic_function(self,phi, type):

        if type == 1:
            u = 0.5
            b = self.kappa - self.rho * self.sigma
        else:
            u = -0.5
            b = self.kappa

        a = self.kappa * self.theta
        x = np.log(self.s0)
        d = np.sqrt((self.rho * self.sigma * phi * 1j - b) ** 2 - self.sigma ** 2 * (2 * u * phi * 1j - phi ** 2))
        g = (b - self.rho * self.sigma * phi * 1j + d) / (b - self.rho * self.sigma * phi * 1j - d)
        D = self.r * phi * 1j * self.t + (a / self.sigma ** 2) * (
                (b - self.rho * self.sigma * phi * 1j + d) * self.t - 2 * np.log((1 - g * np.exp(d * self.t)) / (1 - g)))
        E = ((b - self.rho * self.sigma * phi * 1j + d) / self.sigma ** 2) * (1 - np.exp(d * self.t)) / (1 - g * np.exp(d * self.t))

        return np.exp(D + E * self.v0 + 1j * phi * x)

    # 積分部分
    def integral_function(self,phi,type):

        integral = (np.exp(-1 * 1j * phi * np.log(self.K)) * self.characteristic_function(phi, type=type))

        return integral

    # p值函式
    def sv_P_Value(self,type):

        """

        """
        ifun = lambda phi: self.integral_function(phi,type=type) / (1j * phi)
        return 0.5 + (1 / np.pi) * spi.quad(ifun, 0, 1000)[0]

    def sv_Call_Value(self):

        """

        """
        P1 = self.s0 * self.sv_P_Value(type=1)
        P2 = self.K * np.exp(-self.r * self.t) * self.sv_P_Value(type=2)

        if np.isnan(P1-P2):return 1000000#如果初始引數使定價結果為nan,就返還巨大的值,視為報錯!巨大的期權價格會拉大定價誤差
        else:return P1 - P2

    #方便檢測定價結果
    @classmethod
    def test_multiple(cls,option_params:list,init_params:list):
        """
        輸入:
        option_params   -list,期權價格引數
                        [K,t,s0,r]
        init_params     -list,sv模型引數
                        [v0,kappa,theta,sigma,rho]
        輸出:
            sv模型期權價格

        示例:
        sv=SV(K =2.15,t = 0.05924,s0 = 2.143896,r = 0.03043)
        sv.test_multiple([2.15,0.059,2.143896,0.03043],[0.01,2,0.1,0.1,-0.5])#通過直接輸入兩個串列,很方便的計算期權價格
        """
        sv=cls(option_params[0],option_params[1],option_params[2],option_params[3],
               init_params[0],init_params[1],init_params[2],init_params[3],init_params[4])
        c_sv=sv.sv_Call_Value()
        return c_sv


if __name__=='__main__':
    sv=SV(K =2.15,t = 0.05924,s0 = 2.143896,r = 0.03043)
    sv.sv_Call_Value()

由于heston模型中有五個引數需要估計,傳統的線性最小二乘法失效,本文采用退火模擬演算法估計這五個引數,說實話,這五個引數非常難估計,
首先寫出模擬退火演算法的類:
myNG.py

"""模擬退火演算法"""
import numpy as np
import matplotlib.pyplot as plt
import copy
from randomrange import random_range

"""
部分名詞:
新解:在某輪回圈中通過自變數隨機變動產生的新解
新接受解:由于新解導致函式值變小,或者由于概率而接受的新解
歷史最優解:在整個回圈中產生的最優解
"""


class NG():
    def __init__(self,func,x0):
        """
        x0  -串列:函式的初始值
                [v0,kappa,theta,sigma,rho]
        func    -待求解函式
        """
        self.x=x0
        self.dim_x=len(x0)#解的維度
        self.func=func
        self.f = func(self.x)#計算y值

        self.x_best=self.x#記錄下來歷史最優解,即所有回圈中的最優解
        self.f_best=self.f

        self.times_stay=0#連續未接受新解的次數
        self.times_stay_max=400#當連續未接受新解超過這個次數,終止回圈

        self.T=100#初始溫度:初始溫度越高,前期接受新解的概率越大
        self.speed=0.7#退火速度:溫度下降速度越快,后期溫度越低,接受新解的概率越小,從而最終穩定在某個解附件
        self.T_min=1e-6#最低溫度:當低于該溫度時,終止全部回圈
        self.xf_best_T={}#記錄下接受的所有新解

        # 最初若函式值變動為delta,則認為函式值變動很大,可以產生p_expec概率接受新解
        #若在初期便產生巨大的概率接受新解,則前期尋找新解的程序將變成盲目的隨機漫步毫無意義,因此利用alpha調節概率
        self.p_expec = 0.9
        self.delta_standard = 0.7
        self.alpha =self.find_alpha()#調節概率因子

        self.times_delta_samller = 0#統計新舊最優值之差絕對值連續小于某值的次數
        self.delta_min=0.001#當新舊最優值之差絕對值連續小于此值達到某一次數時,終止該溫度回圈
        self.times_delta_min=100#當新舊最優值之差絕對值連續小于此值達到這個次數時,終止該溫度回圈

        self.times_max=500#當每個溫度下回圈超過這個次數,終止該溫度回圈
        self.times_cycle=0#記錄演算法回圈總次數

        self.times_p=0#統計因為p值較大而接受新解的次數

        self.xf_all={self.times_cycle:[self.x,self.f]}#記錄下來每一次回圈產生的新解和函式值
        self.xf_best_all={self.times_cycle:[self.x,self.f]}#記錄下來每一次回圈接受的新解和函式值

    #溫度下降,產生新溫度
    def T_change(self):
        self.T=self.T*self.speed
        print('當前溫度為{},大于最小溫度{}'.format(self.T,self.T_min))#展示當前溫度和最小溫度

    # 將所有的x和f、回圈次數存盤下來
    def save_xy(self):
        self.xf_all[self.times_cycle]=[self.x,self.f]

    #將所有的最優x,y、回圈次數存盤下來
    def save_best_xy(self):
        self.xf_best_all[self.times_cycle]=[self.x,self.f]

    # 當調節因子為alpha時,函式值變動值為delta產生的接受新解概率
    def __p_delta(self,alpha):
        return np.exp(-self.delta_standard / (self.T * alpha))

    # 用二分法尋找方程解
    def __find_solver(self,func, f0):
        """
        輸入:
        func    -待求解方程的函式
        f0  -float,預期函式值
        輸出:
        mid -float,函式=預期函式值 的解
        """
        up = 100
        down = 0.00001
        mid = (up + down) / 2
        while abs(func(mid) - f0) > 0.0001:
            if func(down) < f0 < func(mid):
                up = mid
                mid = (mid + down) / 2
            elif func(up) > f0 > func(mid):
                down = mid
                mid = (up + down) / 2
            else:
                print('error!')
                break
        return mid

    # 最初若函式值變動為delta,則認為函式值變動很大,可以產生p_expec概率接受新解
    def find_alpha(self):
        return  self.__find_solver(self.__p_delta, self.p_expec)

    #獲得新的x
    def get_x_new(self):
        random=np.random.normal(0,1,self.dim_x)#新的隨機增量
        return   self.x+random

    #判斷是否可以接受新的解
    def judge(self):
        if self.delta<0:#如果函式值變動幅度小于0,則接受新解
            self.x=self.x_new
            self.f_last=self.f#在最優解函式值更新之前將其記錄下來
            self.f=self.f_new
            self.save_best_xy()#記錄每次回圈接受的新解
            self.get_history_best_xy()#更新歷史最優解
            self.times_stay = 0  # 由于未接受新解,將連續未接受新解的次數歸零
            print('由于函式值變小新接受解{}:{}'.format(self.f,self.x))#展示當前接受的新解
        else:
            p=np.exp(-self.delta/(self.T*self.alpha))#接受新解的概率
            p_=np.random.random()#判斷標準概率
            if p>p_:#如果概率足夠大,接受新解
                self.x = self.x_new
                self.f_last = self.f  # 在接受的新解更新之前將其記錄下來
                self.f = self.f_new
                self.save_best_xy()#記錄每次回圈接受的新解
                self.get_history_best_xy()  # 更新歷史最優解
                print('由于概率{}大于{},新接受解{}:{}'.format(p,p_,self.f, self.x))#展示當前接受的新解
                self.times_p+=1#統計因為概率而接受新解的次數
                self.times_stay=0#由于未接受新解,將連續未接受新解的次數歸零
            else:
                self.times_stay+=1#連續接受新解次數加1
                print('連續未接受新解{}次'.format(self.times_stay))

    #獲得歷史最優解
    def get_history_best_xy(self):
        x_array = list(np.array(list(self.xf_best_all.values()))[:, 0])  # 從歷史所有的最優x和f中獲得所有的x
        f_array=list(np.array(list(self.xf_best_all.values()))[:, 1])#從歷史所有的最優x和f中獲得所有的f
        self.f_best=min(f_array)#從每階段最優的f中獲得最優的f
        self.x_best=x_array[f_array.index(self.f_best)]#利用最優f反推最優x
        return self.x_best,self.f_best

    #繪制函式值降低記錄
    def plot(self,x,y):
        plt.figure(figsize=(13,8))
        plt.plot(x,y)
        plt.xlabel('回圈次數',fontsize=15)
        plt.ylabel('函式值', fontsize=15)
        plt.title('函式值變化程序')

    #繪制最優值變化程序
    def plot_best(self):
        times_cycle_array=list(self.xf_best_all.keys())#獲得接受新解時的回圈次數
        f_array = np.array(list(self.xf_best_all.values()))[:, 1]  # 從所有接受的新解中獲得所有的函式值
        self.plot(times_cycle_array,f_array)#繪制回圈次數與函式值的折線圖

    #統計新舊函式值之差的絕對值連續小于此值的次數
    def count_times_delta_smaller(self):
        if self.delta_best<self.delta_min:
            self.times_delta_samller+=1#如果新舊函式值之差絕對值小于某值,則次數加1,否則歸零
        else:
            self.times_delta_samller=0
        print('差值{}連續小于{}達到{}次'.format(self.delta_best,self.delta_min,self.times_delta_samller))

    #終止回圈條件
    def condition_end(self):
        if self.times_delta_samller>self.times_delta_min:#如果新舊函式值之差絕對值連續小于某值次數超過某值,終止該溫度回圈
            return True
        elif self.times_stay>self.times_stay_max:#當連續未接受新解超過這個次數,終止回圈
            return True

    #在某一特定溫度下進行回圈
    def run_T(self):

        for time_ in range(self.times_max):
            self.x_new=self.get_x_new()#獲得新解
            self.f_new=self.func(self.x_new)#獲得新的函式值
            self.save_xy()#將新解和函式值記錄下來
            self.delta=self.f_new-self.f#計算函式值的變化值
            self.judge()#判斷是否接受新解
            self.times_cycle+=1#統計回圈次數
            self.delta_best=np.abs(self.f-self.f_last)#上次函式值與這次函式值的差值絕對值
            self.count_times_delta_smaller()#統計新舊函式值之差的絕對值連續小于此值的次數
            if self.condition_end()==True:#如果滿足終止條件,終止該溫度回圈
                print('滿足終止條件:接受新解后的函式值變化連續小于{}達到次數'.format(self.delta_min))
                break
            print('當前歷史最優解{}:{}'.format(self.f_best,self.x_best))#展示當前最優值
            print('當前接受的新解{}:{}'.format(self.f, self.x))  # 展示當前接受的新解
            print('當前新解{}:{}'.format(self.f_new, self.x_new))  # 展示當前新產生的解
            print('當前溫度為{}'.format(self.T))#展示當前溫度

    #當每個溫度下的回圈結束時,有一定概率將當前接受的新解替換為歷史最優解
    def accept_best_xf(self):
        if np.random.random()>0.75:
            self.x=self.x_best
            self.f=self.f_best

    def run(self):
        while self.T>self.T_min:
            self.run_T()#回圈在該溫度下的求解
            self.xf_best_T[self.T] = [self.get_history_best_xy()]#記錄在每一個溫度下的最優解
            self.T_change()#溫度繼續下降
            self.accept_best_xf()#當每個溫度下的回圈結束時,有一定概率將當前接受的新解替換為歷史最優解
            if self.condition_end()==True:#如果滿足終止條件,終止該溫度回圈
                break

if __name__=='__main__':
    # 待檢測函式1
    def func_target(list_x):
        x1 = list_x[0]
        x2 = list_x[1]
        return 3 * (x1 - 5) ** 2 + 6 * (x2 - 6) ** 2 - 7

    ng=NG(func=func_target,x0=[8,9])
    ng.run()
    x,f=ng.get_history_best_xy()#查看歷史最優解
    ng.plot_best()#繪制最優解變化程序

這是個一般性的模擬退火演算法類,解決如上所示的二次凸函式最優化非常簡單,但是在解決高度復雜的heston模型時就非常困難了,為了解決heston模型的引數估計,基于以上模型專門寫一個模擬退火演算法子類,該子類的作用主要是將五個引數限制在一定范圍內,因為在引數估計程序中發現部分引數取值過大時會出現 nan 型別的python無法表示的浮點數

randomrange.py

"""某一個數在指定范圍內隨機變動"""
import matplotlib.pyplot as plt
import numpy as np


#將x增加一個隨機變動量,但會把x限制在a,b之內
def random_range(x,a,b):
    random=np.random.normal(0,0.01*(b-a),1)[0]
    if x+random>b :random=-np.abs(random)#如果新值超越最大值,就將增量變為負數
    elif x+random<a:random=np.abs(random)#如果新值超越最小值,就將增量變為正數
    return x+random


if __name__=='__main__':

    x=0.3;a=0;b=4
    sum_False=0
    x_all=[]
    for i in range(1000):
        x=random_range(x,a,b)
        x_all.append(x)
        print(x)
        if x>b or x<a:
            sum_False+=1

    plt.plot(x_all)

myNG.py

#專門用于求解sv模型引數的退火演算法
class NGSV(NG):
    def __init__(self,func,x0):
        super().__init__(func,x0)
        self.T=90
        self.T_min=1e-7#由于演算法耗時太長,故小做一段模擬試試看
        self.times_max=500

    #sv模型的各個引數由于存在取值范圍,因此在獲得新的引數估計值時需要對其取值范圍加以限制
    def get_x_new(self):
        """
        [v0,kappa,theta,sigma,rho]
        其中:
        v0,kappa,theta,sigma>0
        -1<rho<1
        2kappa*theta>sigma**2
        """
        x=copy.deepcopy(self.x)#使用深copy,否則self.x會隨著x一起變動
        x[0]=random_range(x[0],0,5)
        x[1] =random_range(x[1],0,1)
        x[2] =random_range(x[2],0,1)
        x[3] =random_range(x[3],0,3)
        x[4]=random_range(x[4],-1,1)
        return x

利用上面的heston模型定價類和模擬退火演算法類,寫一個利用模擬退火演算法解決heston模型引數估計的類
sv_sa.py

"""使用模擬退火演算法求解期權價格"""
from sv_model import SV
#from sko.SA import SA
import pandas as pd
import numpy as np
from scipy.optimize import minimize
from myNG import NG,NGSV
import copy


#讀取初始資料
# data=pd.read_excel('期權資料.xlsx')
# data_option=data.ix[(data['call_put']=='C')&(data['type_in_out']==4)&(data['type_time']==3)][['exercise_price','time','ETF50','shibor','close']]
#
# data_option.columns=['K','t','s0','r','c']
# data_option.index=range(len(data_option))
# data_option.to_excel('待測驗資料.xlsx')
data_option=pd.read_excel('待測驗資料.xlsx',index_col=0)
data_option=data_option.ix[:100,:]


class SV_SA():

    def __init__(self,data,v0:float=0.01,kappa:float=2,theta:float=0.1,sigma:float=0.1,rho:float=-0.5):
        """輸入資料

        data    -pandas.core.frame.DataFrame格式資料,具體樣式如下:

                           K         t        s0         r       c
                30     2.150  0.194444  2.111919  0.031060  0.0546
                31     2.150  0.198413  2.115158  0.031120  0.0666
                32     2.150  0.202381  2.107673  0.031210  0.0627
                33     2.150  0.214286  2.122269  0.031250  0.0531
                90     3.240  0.202381  3.181339  0.047446  0.0724

        """

        self.data=data
        self.init_params=[v0,kappa,theta,sigma,rho]# 初始引數串列
        self.cycle=0#計算模擬退火演算法輪數
        self.error=0.000000

    def error_mean_percent(self,init_params:list):
        """計算heston模型期權定價的百分比誤差均值

        百分比誤差均值=絕對值((理論值-實際值)/實際值)/樣本個數

        輸入:
        init_params -初始引數,串列格式
                     [v0,kappa,theta,sigma,rho]

        回傳: -誤差百分點數   例如:回傳5,表示5%
        """
        v0,kappa,theta,sigma,rho=init_params
        list_p_sv=[]
        for i in self.data.index:
            K,t,s0,r,p_real=self.data.ix[i,:].tolist()
            sv = SV(K=K, t=t, s0=s0, r=r,
                    v0=v0, kappa=kappa, theta=theta, sigma=sigma, rho=rho)
            p_sv = sv.sv_Call_Value()  # sv模型期權價格
            list_p_sv.append(p_sv)

        self.error = np.average(np.abs((np.array(list_p_sv) - self.data['c']) / self.data['c']))#sv模型的期權價格和實際價格的百分比誤差均值
        print('\n')
        print('第{}輪,誤差:{}'.format(self.cycle, self.error))#展示本輪的誤差
        self.cycle += 1

        return self.error


    def error_mean(self,init_params:list):
        """計算heston模型期權定價的均方誤差
        init_params -初始引數,串列格式
                     [v0,kappa,theta,sigma,rho]
        """
        v0,kappa,theta,sigma,rho=init_params
        list_p_sv=[]
        for i in self.data.index:
            K,t,s0,r,p_real=self.data.ix[i,:].tolist()
            sv = SV(K=K, t=t, s0=s0, r=r,
                    v0=v0, kappa=kappa, theta=theta, sigma=sigma, rho=rho)
            p_sv = sv.sv_Call_Value()  # sv模型期權價格
            list_p_sv.append(p_sv)

        self.error=np.sqrt(np.sum((np.array(list_p_sv)-self.data['c'])**2)/len(self.data))#sv模型的期權價格和實際價格的均方誤差
        print('\n')
        print('第{}輪,誤差:{}'.format(self.cycle, self.error))#展示本輪的誤差
        self.cycle += 1

        return self.error

    def test_error_mean(self,multiple_parmas:dict):
        """將多組初始引數輸入,計算各組引數的均方誤差
        multiple_parmas -dict,多組初始引數
                        {
                        1:[0.01,2,0.1,0.1,-0.5],
                        2:[0.01,2,0.1,0.1,-0.5],
                        3:[0.01,2,0.1,0.1,-0.5]
                        }
        回傳: -dict,記錄各組初始引數的均方誤差
        """
        dict_={}#用于記錄各組初始引數的均方誤差
        for i in multiple_parmas.keys():
            dict_[i]=self.error_mean(multiple_parmas[i])
        return dict_

    def test_option_price(self,multiple_parmas:dict):
        """將多組期權資料和初始引數輸入,將期權價格合并在表格旁邊
                multiple_parmas -dict,多組初始引數
                                multiple_parmas={
                                1:[1.5932492661058346, 3.3803420203705365, 0.3333248435472669, 5.622092726036617, 0.044881506437356666],
                                2:[1.1070063457234607, 3.501301312245266, 0.6276009140316863, 9.383112611111134, -0.6092511548040354],
                                3:[0.5675877305927083, 3.736229838972323, 0.21803303626214537, 8.74231319248172, 0.09393882921335006]
                                }
                回傳: -dict,記錄各組初始引數的均方誤差
                """
        data_option_=copy.deepcopy(data_option)
        for i in multiple_parmas.keys():
            #i=3
            data_option_['第{}組引數'.format(i)]=0.000000
            init_params = multiple_parmas[i]
            for j in data_option_.index:
                #j=8
                option_params=data_option_.ix[j,:4].tolist()
                sv=SV(option_params[0],option_params[1],option_params[2],option_params[3],
                 init_params[0],init_params[1],init_params[2],init_params[3],init_params[4])
                c_sv=sv.sv_Call_Value()
                data_option_.ix[j,'第{}組引數'.format(i)]=c_sv
            print('已經完成第{}組'.format(i))
        return  data_option_

    def sa(self):
        """對均方誤差函式用模擬退火演算法計算最優值
        """
        # 實體化演算法,并加入初始解
        # opt = minimize(self.error_mean, self.init_params, method='Nelder-Mead', tol=1e-6)#單純形法求最優解
        # self.best_params=opt.x

        #self.x_star, self.y_star,self.list_,self.info = MySA(self.error_mean, self.init_params)
        self.ng=NGSV(func=self.error_mean_percent,x0=self.init_params)
        self.ng.run()
        self.x_star,self.y_star=self.ng.get_history_best_xy()

        print(self.x_star, self.y_star)# 生成最優解x和最優值y


if __name__=='__main__':
    model=SV_SA(data=data_option)
    model.sa()
    model.ng.get_history_best_xy()

所有代碼及資料:

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/201216.html

標籤:其他

上一篇:OpenCV車牌定位(C++)

下一篇:CSS的文本樣式

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more