傅里叶变换分析A股大盘周期

参考

import tushare as ts
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import requests
from jqdatasdk import *
import librosa as rosa
import librosa.display
from IPython.display import Audio
from matplotlib.font_manager import FontProperties
import copy
from scipy import fft
import scipy
from scipy import signal


font_set = FontProperties(fname=r"/System/Library/Fonts/STHeiti Medium.ttc", size=10)
print(ts.__version__)
print(scipy.__version__)
1.2.85
1.7.3

量化平台

#tushare 要600积分
ts.set_token('xxx')
pro = ts.pro_api()
#聚宽 只能免费拿2022年数据

auth('xxx','xxx') #账号是申请时所填写的手机号;密码为聚宽官网登录密码
jq_quota = get_query_count()
print(jq_quota)

monthData = get_bars('000001.XSHG', count=500, unit='1M',
         fields=['date', 'open', 'close', 'high', 'low', 'volume'],
         include_now=True, end_dt=None, df=True)
print(monthData.size)
print(monthData.head(60))

monthData = get_bars('000001.XSHG', count=500, unit='1M',
         fields=['date', 'open', 'close', 'high', 'low', 'volume'],
         include_now=True, end_dt='2021-12-31', df=True)
print(monthData.size)
print(monthData.head(60))

下载股票数据

#下载上证日线数据 

# market: 0:沪市 1:深市
# number: 股票代码
# start_data: 起始日期:yyyymmdd
# end_data: 结束时间:yyyymmdd
def getHistoryData(market, number, start_data, end_data):

    url = 'http://quotes.money.163.com/service/chddata.html?code=' + market + number + '&start=' + start_data + '&end=' + end_data
    f = open("temp.csv", "wb")
    urlt=requests.get(url).content
    print(type(urlt))
    f.write(urlt)
    f.close()
    
    df = pd.read_csv('temp.csv', encoding='gbk')
 
    dataList = []
    for row in range(0, df.shape[0]):
        dataList.append({})
        for col in range(0, df.shape[1]):
            col_name = df.columns.values[col]
            dataList[row][col_name] = df.loc[row, col_name]
    #print(type(dataList))
    #print(type(df))
    return dataList
 
if __name__ == '__main__':
    hisData = getHistoryData('0', '000001', '19901219', '20220907')
    print(hisData)

计算同比值

#读取上证csv数据
df = pd.read_csv('sh_index.csv', encoding="gb2312")

print(df.head(5))
           日期     股票代码    名称        收盘价        最高价        最低价        开盘价  \
0  2022-09-07  '000001  上证指数  3246.2943  3253.7671  3227.8225  3232.1368   
1  2022-09-06  '000001  上证指数  3243.4466  3244.6353  3203.8161  3207.9330   
2  2022-09-05  '000001  上证指数  3199.9118  3199.9118  3172.0394  3183.9460   
3  2022-09-02  '000001  上证指数  3186.4781  3198.2812  3173.7929  3189.6439   
4  2022-09-01  '000001  上证指数  3184.9797  3214.5583  3181.6256  3196.5367   

         前收盘       涨跌额      涨跌幅  换手率        成交量               成交金额  总市值  流通市值  \
0  3243.4466    2.8477   0.0878  NaN  301014466  3.68608741475e+11  NaN   NaN   
1  3199.9118   43.5348   1.3605  NaN  318869689  3.78636070328e+11  NaN   NaN   
2  3186.4781   13.4337   0.4216  NaN  280675633  3.39591536253e+11  NaN   NaN   
3  3184.9797    1.4984    0.047  NaN  250456911  3.13337604115e+11  NaN   NaN   
4  3202.1378  -17.1581  -0.5358  NaN  274660541  3.36978641199e+11  NaN   NaN   

   成交笔数  
0  None  
1  None  
2  None  
3  None  
4  None
month_dict = {}

def get_one_year_later_month(month):
    year = int(month[0:4])
    year += 1;
    next_year_month = str(year) + month[4:];
    return next_year_month
    

#计算按月收盘价
for index, row in df.iterrows():
        month = row["日期"][0:7]
        month_dict[month] = row["收盘价"] 
print("monthDict:")        
print(month_dict)


#计算同比
year_on_year_basis = {}
for each_month, each_price in month_dict.items():
    one_year_later_month = get_one_year_later_month(each_month)
    if one_year_later_month in month_dict:
        one_year_later_mongth_price = month_dict[one_year_later_month]
        print("%s one year later month %s %d now %d"%(each_month, one_year_later_month, one_year_later_mongth_price, each_price))
        year_on_year_basis[each_month] = np.log(one_year_later_mongth_price) - np.log(each_price)
print("year_on_year_basis")
print(year_on_year_basis)
monthDict:
{'2022-09': 3184.9797, '2022-08': 3259.9585, '2022-07': 3387.6373, '2022-06': 3182.1566, '2022-05': 3067.7587, '2022-04': 3282.7166, '2022-03': 3488.8347, '2022-02': 3429.5809, '2022-01': 3632.3289, '2021-12': 3576.8853, '2021-11': 3544.4795, '2021-10': 3592.1666, '2021-09': 3567.1008, '2021-08': 3464.2854, '2021-07': 3588.7816, '2021-06': 3624.7138, '2021-05': 3441.2826, '2021-04': 3466.3315, '2021-03': 3551.3998, '2021-02': 3505.2836, '2021-01': 3502.9584, '2020-12': 3451.9384, '2020-11': 3225.1196, '2020-10': 3272.0762, '2020-09': 3410.6068, '2020-08': 3367.9658, '2020-07': 3025.981, '2020-06': 2915.4311, '2020-05': 2878.1402, '2020-04': 2734.5215, '2020-03': 2970.9312, '2020-02': 2746.6056, '2020-01': 3085.1976, '2019-12': 2875.8072, '2019-11': 2958.1992, '2019-10': 2913.5704, '2019-09': 2924.1063, '2019-08': 2908.766, '2019-07': 3044.9028, '2019-06': 2890.0809, '2019-05': 2906.464, '2019-04': 3170.361, '2019-03': 2994.005, '2019-02': 2618.2323, '2019-01': 2465.291, '2018-12': 2654.798, '2018-11': 2606.2372, '2018-10': 2716.5104, '2018-09': 2720.7344, '2018-08': 2824.5337, '2018-07': 2775.557, '2018-06': 3075.1372, '2018-05': 3081.1773, '2018-04': 3163.179, '2018-03': 3273.7549, '2018-02': 3446.9799, '2018-01': 3348.3259, '2017-12': 3317.6174, '2017-11': 3395.9125, '2017-10': 3374.3781, '2017-09': 3367.1194, '2017-08': 3292.6383, '2017-07': 3195.9116, '2017-06': 3102.6232, '2017-05': 3143.7121, '2017-04': 3270.3054, '2017-03': 3246.9335, '2017-02': 3140.17, '2017-01': 3135.9208, '2016-12': 3273.3093, '2016-11': 3122.4356, '2016-10': 3048.1428, '2016-09': 3063.3054, '2016-08': 2953.3854, '2016-07': 2932.4758, '2016-06': 2913.5077, '2016-05': 2992.6432, '2016-04': 3009.5298, '2016-03': 2733.17, '2016-02': 2688.8536, '2016-01': 3296.258, '2015-12': 3456.309, '2015-11': 3325.085, '2015-10': 3143.357, '2015-09': 3166.624, '2015-08': 3622.905, '2015-07': 4053.7, '2015-06': 4828.738, '2015-05': 4480.464, '2015-04': 3810.294, '2015-03': 3336.285, '2015-02': 3128.3, '2015-01': 3350.519, '2014-12': 2680.155, '2014-11': 2430.032, '2014-10': 2382.794, '2014-09': 2235.511, '2014-08': 2185.303, '2014-07': 2050.381, '2014-06': 2038.305, '2014-05': 2027.353, '2014-04': 2047.46, '2014-03': 2075.235, '2014-02': 2044.497, '2014-01': 2109.387, '2013-12': 2207.371, '2013-11': 2149.562, '2013-10': 2198.199, '2013-09': 2098.448, '2013-08': 2029.067, '2013-07': 1995.242, '2013-06': 2299.252, '2013-05': 2174.123, '2013-04': 2234.395, '2013-03': 2359.506, '2013-02': 2419.02, '2013-01': 2276.992, '2012-12': 1959.767, '2012-11': 2104.428, '2012-10': 2074.419, '2012-09': 2059.147, '2012-08': 2123.36, '2012-07': 2226.11, '2012-06': 2373.436, '2012-05': 2438.436, '2012-04': 2302.241, '2012-03': 2426.115, '2012-02': 2268.08, '2012-01': 2169.39, '2011-12': 2386.86, '2011-11': 2470.019, '2011-10': 2344.787, '2011-09': 2556.042, '2011-08': 2703.783, '2011-07': 2759.362, '2011-06': 2743.572, '2011-05': 2932.188, '2011-04': 2967.41, '2011-03': 2918.92, '2011-02': 2798.96, '2011-01': 2852.648, '2010-12': 2823.449, '2010-11': 3054.021, '2010-10': 2738.744, '2010-09': 2622.882, '2010-08': 2672.516, '2010-07': 2373.792, '2010-06': 2568.283, '2010-05': 2835.277, '2010-04': 3147.416, '2010-03': 3087.842, '2010-02': 2941.36, '2010-01': 3243.76, '2009-12': 3235.363, '2009-11': 3076.649, '2009-10': 2911.715, '2009-09': 2683.724, '2009-08': 3462.59, '2009-07': 3008.15, '2009-06': 2721.28, '2009-05': 2559.911, '2009-04': 2408.017, '2009-03': 2093.447, '2009-02': 2011.683, '2009-01': 1880.716, '2008-12': 1894.615, '2008-11': 1719.774, '2008-10': 2173.738, '2008-09': 2325.135, '2008-08': 2801.817, '2008-07': 2651.605, '2008-06': 3459.044, '2008-05': 3761.009, '2008-04': 3329.162, '2008-03': 4438.265, '2008-02': 4320.767, '2008-01': 5272.814, '2007-12': 4868.611, '2007-11': 5914.285, '2007-10': 5692.755, '2007-09': 5321.055, '2007-08': 4300.563, '2007-07': 3836.294, '2007-06': 4000.742, '2007-05': 3950.011, '2007-04': 3252.595, '2007-03': 2797.19, '2007-02': 2785.432, '2007-01': 2715.719, '2006-12': 2102.049, '2006-11': 1855.713, '2006-10': 1785.385, '2006-09': 1636.691, '2006-08': 1600.614, '2006-07': 1697.282, '2006-06': 1684.195, '2006-05': 1497.104, '2006-04': 1319.471, '2006-03': 1306.586, '2006-02': 1287.626, '2006-01': 1180.963, '2005-12': 1098.747, '2005-11': 1089.95, '2005-10': 1138.95, '2005-09': 1184.933, '2005-08': 1088.948, '2005-07': 1055.594, '2005-06': 1039.187, '2005-05': 1130.835, '2005-04': 1223.566, '2005-03': 1303.412, '2005-02': 1188.931, '2005-01': 1242.774, '2004-12': 1334.944, '2004-11': 1305.291, '2004-10': 1422.929, '2004-09': 1321.462, '2004-08': 1373.217, '2004-07': 1441.068, '2004-06': 1579.658, '2004-05': 1560.9351, '2004-04': 1758.147, '2004-03': 1689.76, '2004-02': 1623.88, '2004-01': 1517.193, '2003-12': 1432.703, '2003-11': 1364.055, '2003-10': 1371.685, '2003-09': 1449.816, '2003-08': 1476.969, '2003-07': 1484.704, '2003-06': 1576.528, '2003-05': 1531.867, '2003-04': 1522.546, '2003-03': 1525.483, '2003-02': 1480.169, '2003-01': 1320.63, '2002-12': 1395.675, '2002-11': 1510.76, '2002-10': 1562.993, '2002-09': 1668.774, '2002-08': 1653.008, '2002-07': 1713.705, '2002-06': 1483.348, '2002-05': 1652.368, '2002-04': 1608.506, '2002-03': 1502.54, '2002-02': 1485.77, '2002-01': 1611.393, '2001-12': 1762.562, '2001-11': 1707.754, '2001-10': 1726.533, '2001-09': 1817.19, '2001-08': 1986.928, '2001-07': 2205.985, '2001-06': 2219.591, '2001-05': 2137.994, '2001-04': 2125.084, '2001-03': 1965.121, '2001-02': 2008.032, '2001-01': 2103.469, '2000-12': 2081.843, '2000-11': 1977.363, '2000-10': 1915.35, '2000-09': 1999.859, '2000-08': 2028.151, '2000-07': 1895.637, '2000-06': 1903.488, '2000-05': 1836.637, '2000-04': 1801.003, '2000-03': 1697.744, '2000-02': 1673.943, '2000-01': 1406.371, '1999-12': 1447.116, '1999-11': 1493.096, '1999-10': 1534.515, '1999-09': 1599.552, '1999-08': 1616.276, '1999-07': 1560.787, '1999-06': 1311.594, '1999-05': 1111.757, '1999-04': 1168.504, '1999-03': 1097.975, '1999-02': 1120.531, '1999-01': 1125.819, '1998-12': 1234.358, '1998-11': 1223.478, '1998-10': 1234.779, '1998-09': 1143.125, '1998-08': 1302.102, '1998-07': 1316.441, '1998-06': 1415.575, '1998-05': 1352.926, '1998-04': 1254.965, '1998-03': 1188.306, '1998-02': 1248.04, '1998-01': 1220.473, '1997-12': 1133.087, '1997-11': 1180.854, '1997-10': 1098.903, '1997-09': 1229.865, '1997-08': 1192.828, '1997-07': 1199.061, '1997-06': 1336.283, '1997-05': 1448.926, '1997-04': 1241.028, '1997-03': 1063.045, '1997-02': 982.404, '1997-01': 919.435, '1996-12': 1134.523, '1996-11': 930.789, '1996-10': 865.486, '1996-09': 804.778, '1996-08': 835.105, '1996-07': 761.115, '1996-06': 641.092, '1996-05': 654.43, '1996-04': 566.19, '1996-03': 601.98, '1996-02': 536.68, '1996-01': 537.87, '1995-12': 633.81, '1995-11': 723.39, '1995-10': 717.79, '1995-09': 728.84, '1995-08': 715.4, '1995-07': 613.18, '1995-06': 708.67, '1995-05': 579.04, '1995-04': 656.88, '1995-03': 556.95, '1995-02': 533.72, '1995-01': 639.88, '1994-12': 682.3, '1994-11': 673.79, '1994-10': 706.42, '1994-09': 790.19, '1994-08': 445.64, '1994-07': 458.37, '1994-06': 545.05, '1994-05': 605.77, '1994-04': 698.84, '1994-03': 757.29, '1994-02': 755.15, '1994-01': 833.9, '1993-12': 974.8, '1993-11': 816.71, '1993-10': 892.55, '1993-09': 893.97, '1993-08': 843.27, '1993-07': 997.53, '1993-06': 928.58, '1993-05': 1352.24, '1993-04': 947.23, '1993-03': 1199.73, '1993-02': 1278.5, '1993-01': 814.04, '1992-12': 716.74, '1992-11': 477.61, '1992-10': 679.62, '1992-09': 824.96, '1992-08': 1031.55, '1992-07': 1194.18, '1992-06': 1183.24, '1992-05': 453.62, '1992-04': 381.01, '1992-03': 365.39, '1992-02': 314.18, '1992-01': 293.75, '1991-12': 262.19, '1991-11': 220.72, '1991-10': 182.48, '1991-09': 180.22, '1991-08': 145.24, '1991-07': 136.85, '1991-06': 115.97, '1991-05': 113.16, '1991-04': 120.73, '1991-03': 132.53, '1991-02': 129.51, '1991-01': 128.84, '1990-12': 99.98}
2021-09 one year later month 2022-09 3184 now 3567

year_on_year_basis
{'2021-09': -0.11330724964124528, '2021-08': -0.060791912370287804, '2021-07': -0.05768004095893353, '2021-06': -0.13021619043042953, '2021-05': -0.11489702090647214, '2021-04': -0.054425518804084305, '2021-03': -0.017774052016541475, '2021-02': -0.02183336307119177, '2021-01': 0.036266144196906325, '2020-12': 0.03555646545141222, '2020-11': 0.09442128785638992, '2020-10': 0.0933308232328347, '2020-09': 0.04486294233991295, '2020-08': 0.028197435672300486, '2020-07': 0.17057742127830267, '2020-06': 0.21775763437489015, '2020-05': 0.17869992906800292, '2020-04': 0.23714036384134118, '2020-03': 0.1784663966005704, '2020-02': 0.2439056081983253, '2020-01': 0.12699216143960435, '2019-12': 0.18260252827474055, '2019-11': 0.08638933001104032, '2019-10': 0.11604543629144182, '2019-09': 0.1539013271428784, '2019-08': 0.14658000567038254, '2019-07': -0.006233643039712078, '2019-06': 0.008733204278632556, '2019-05': -0.009792900387592951, '2019-04': -0.1478889952600273, '2019-03': -0.00773651697651534, '2019-02': 0.04786642658875628, '2019-01': 0.22430585390466096, '2018-12': 0.079964831122596, '2018-11': 0.12667320953844108, '2018-10': 0.07003115522859726, '2018-09': 0.07208705167142959, '2018-08': 0.02938564723656345, '2018-07': 0.09261753169269227, '2018-06': -0.06206502333718422, '2018-05': -0.058374542158775355, '2018-04': 0.0022679269660823564, '2018-03': -0.08932565759042888, '2018-02': -0.2749990609525508, '2018-01': -0.3061506363210542, '2017-12': -0.22287830575459378, '2017-11': -0.2646650072286345, '2017-10': -0.2168629252207923, '2017-09': -0.21315575752117777, '2017-08': -0.1533458692816616, '2017-07': -0.1410209201696162, '2017-06': -0.008898429070258729, '2017-05': -0.02009253491721097, '2017-04': -0.03330584047814078, '2017-03': 0.008226601125654653, '2017-02': 0.09322151777817211, '2017-01': 0.06553764251916228, '2016-12': 0.01344538317907329, '2016-11': 0.08395916420525751, '2016-10': 0.10167855355798316, '2016-09': 0.09456307233491401, '2016-08': 0.10873705271862466, '2016-07': 0.08602531877999908, '2016-06': 0.06289019675266871, '2016-05': 0.049247288856415494, '2016-04': 0.08309952110984398, '2016-03': 0.17224890474842525, '2016-02': 0.1551620068086681, '2016-01': -0.049865038615587665, '2015-12': -0.05439976515476985, '2015-11': -0.06288189938553224, '2015-10': -0.030758849990505155, '2015-09': -0.0331715071126748, '2015-08': -0.20432408461532692, '2015-07': -0.32378299513789344, '2015-06': -0.5052273994131706, '2015-05': -0.4035696022214932, '2015-04': -0.23592249758211103, '2015-03': -0.19939580478303043, '2015-02': -0.1513747942392225, '2015-01': -0.016327373527619926, '2014-12': 0.2543266279959875, '2014-11': 0.31359081170081016, '2014-10': 0.277017588387932, '2014-09': 0.3481961988841942, '2014-08': 0.505521698503391, '2014-07': 0.6816044147647187, '2014-06': 0.8624665697509535, '2014-05': 0.7929956111959742, '2014-04': 0.621106350981127, '2014-03': 0.47478351222002946, '2014-02': 0.4253379325425293, '2014-01': 0.4627178752589485, '2013-12': 0.19407241402886477, '2013-11': 0.12264032553461934, '2013-10': 0.08063535998832894, '2013-09': 0.06327181339920074, '2013-08': 0.07417841021105609, '2013-07': 0.02726028329687491, '2013-06': -0.12046527252003703, '2013-05': -0.06989436353910783, '2013-04': -0.08737049737440472, '2013-03': -0.12837787481063412, '2013-02': -0.16821070600294785, '2013-01': -0.07645788972914769, '2012-12': 0.11897662601746006, '2012-11': 0.02122040421417637, '2012-10': 0.057957274259556435, '2012-09': 0.018906204502254553, '2012-08': -0.04542365821560601, '2012-07': -0.10949032138190873, '2012-06': -0.0317548415979676, '2012-05': -0.11473148534528566, '2012-04': -0.029912498483330552, '2012-03': -0.027838937438388278, '2012-02': 0.06442884086097855, '2012-01': 0.04840925163672338, '2011-12': -0.19715310598535218, '2011-11': -0.16018214667675768, '2011-10': -0.12251345174096073, '2011-09': -0.2161681489274132, '2011-08': -0.24165216377430365, '2011-07': -0.21474382596207597, '2011-06': -0.1449220267745046, '2011-05': -0.18439205184263763, '2011-04': -0.25380652208991616, '2011-03': -0.18492247231920356, '2011-02': -0.2103142610010309, '2011-01': -0.27380166367626746, '2010-12': -0.16798049266920767, '2010-11': -0.21223324008270428, '2010-10': -0.15530485492836998, '2010-09': -0.025813744911138414, '2010-08': 0.011631552678315948, '2010-07': 0.150510817076575, '2010-06': 0.06602313877354948, '2010-05': 0.033609262385656535, '2010-04': -0.05889228025036708, '2010-03': -0.05625878020010866, '2010-02': -0.04962413981207803, '2010-01': -0.1284854650587901, '2009-12': -0.13618194457922783, '2009-11': -0.007381934684289604, '2009-10': -0.06124283352097759, '2009-09': -0.022931669010962885, '2009-08': -0.2589965131526446, '2009-07': -0.2368365953548146, '2009-06': -0.057864775603204244, '2009-05': 0.10216714737558252, '2009-04': 0.2677782115104206, '2009-03': 0.388660475349508, '2009-02': 0.37990037427264767, '2009-01': 0.5450805953786171, '2008-12': 0.5351254801922734, '2008-11': 0.5816481308415868, '2008-10': 0.2922939884085638, '2008-09': 0.14342728035749985, '2008-08': 0.21174872866594807, '2008-07': 0.1261601548282849, '2008-06': -0.2398898924622781, '2008-05': -0.3847147802037929, '2008-04': -0.3239170334487911, '2008-03': -0.7514515446086323, '2008-02': -0.7644612476403543, '2008-01': -1.0309116304883092, '2007-12': -0.9437930291406191, '2007-11': -1.2351777241596027, '2007-10': -0.9627460474792944, '2007-09': -0.8278934900939738, '2007-08': -0.42847780907197386, '2007-07': -0.3693416793828179, '2007-06': -0.14548759360333285, '2007-05': -0.0490310912533527, '2007-04': 0.023267481391833655, '2007-03': 0.46164819247192046, '2007-02': 0.43902995474635187, '2007-01': 0.6635074425166625, '2006-12': 0.839896097491728, '2006-11': 1.1591016222166939, '2006-10': 1.15956023548721, '2006-09': 1.1789950713188375, '2006-08': 0.9883586387289238, '2006-07': 0.8154786483696244, '2006-06': 0.8651921390760995, '2006-05': 0.9701857884169849, '2006-04': 0.9022222405815326, '2006-03': 0.7611977133028907, '2006-02': 0.7716027652014379, '2006-01': 0.8327265360294067, '2005-12': 0.6487421436772189, '2005-11': 0.532137165157021, '2005-10': 0.449527292903956, '2005-09': 0.32299028774065075, '2005-08': 0.38517521305135993, '2005-07': 0.4749245063907832, '2005-06': 0.4828490281675739, '2005-05': 0.2805762774052507, '2005-04': 0.07546135264764509, '2005-03': 0.0024321869707621957, '2005-02': 0.0797456287799525, '2005-01': -0.05101577047325634, '2004-12': -0.19471890376875045, '2004-11': -0.18029418079287485, '2004-10': -0.22261063792882663, '2004-09': -0.10905246654209133, '2004-08': -0.2319440697862971, '2004-07': -0.31128086369609065, '2004-06': -0.4187696912395378, '2004-05': -0.32232876685907286, '2004-04': -0.36249086746455816, '2004-03': -0.2596010654520704, '2004-02': -0.3117637633186545, '2004-01': -0.19951593924394384, '2003-12': -0.07067352645664027, '2003-11': -0.04403587676682008, '2003-10': 0.03667751216732462, '2003-09': -0.09269795238236345, '2003-08': -0.07283585247132507, '2003-07': -0.029830920431382246, '2003-06': 0.0019834072048308116, '2003-05': 0.0187978118277341, '2003-04': 0.1438764799044634, '2003-03': 0.10227542579078364, '2003-02': 0.09266207693762585, '2003-01': 0.1387530215926196, '2002-12': 0.026184700650222936, '2002-11': -0.10215095427750143, '2002-10': -0.13056266175573406, '2002-09': -0.14065257325676406, '2002-08': -0.11260464367379797, '2002-07': -0.14344226755679568, '2002-06': 0.060923265606320776, '2002-05': -0.07572215765357182, '2002-04': -0.054921864263193676, '2002-03': 0.015154071856212425, '2002-02': -0.003776885942782471, '2002-01': -0.19899012683571904, '2001-12': -0.23339026317728084, '2001-11': -0.12256622142380724, '2001-10': -0.09951277861686592, '2001-09': -0.08520212683089134, '2001-08': -0.18399306886960964, '2001-07': -0.25251642782689476, '2001-06': -0.4030212495751364, '2001-05': -0.2576585956558768, '2001-04': -0.27850553313349113, '2001-03': -0.26839681166451257, '2001-02': -0.3012219815685757, '2001-01': -0.2664888642944492, '2000-12': -0.16648512669759974, '2000-11': -0.14658508197627995, '2000-10': -0.10378502207734464, '2000-09': -0.0957853261583379, '2000-08': -0.02053481316858985, '2000-07': 0.151619191364194, '2000-06': 0.15363495203271516, '2000-05': 0.15193182432166008, '2000-04': 0.16546759907319153, '2000-03': 0.14625351011726107, '2000-02': 0.1819732166491308, '2000-01': 0.4025752588838918, '1999-12': 0.36368094879150714, '1999-11': 0.28091232230969876, '1999-10': 0.2216860033557193, '1999-09': 0.22335308803628706, '1999-08': 0.22699980295599165, '1999-07': 0.1943647485765876, '1999-06': 0.3724448012315502, '1999-05': 0.501994535147742, '1999-04': 0.43261943375064416, '1999-03': 0.43583273675846357, '1999-02': 0.4013792412117718, '1999-01': 0.22250185692050461, '1998-12': 0.15902161343602295, '1998-11': 0.19915419401941747, '1998-10': 0.21732236350241418, '1998-09': 0.335957849875423, '1998-08': 0.2161448558630994, '1998-07': 0.17025829807955795, '1998-06': -0.07629261756471539, '1998-05': -0.19632800765028513, '1998-04': -0.07138338556559898, '1998-03': -0.07906118937326934, '1998-02': -0.10777164061907651, '1998-01': -0.08072771773214438, '1997-12': 0.0856052304723578, '1997-11': 0.03545971701172945, '1997-10': 0.11657959722878442, '1997-09': -0.07313866710013084, '1997-08': 0.08765292336042396, '1997-07': 0.09339313266947435, '1997-06': 0.057643929947466255, '1997-05': -0.06855293791248673, '1997-04': 0.01116761533106203, '1997-03': 0.11139133204753904, '1997-02': 0.23932697065196606, '1997-01': 0.2832344165542393, '1996-12': -0.0012665318921305513, '1996-11': 0.23796057094070378, '1996-10': 0.23877648958747244, '1996-09': 0.4240932232575165, '1996-08': 0.35652477190524934, '1996-07': 0.4545095660671139, '1996-06': 0.7344741856489971, '1996-05': 0.7948132435547999, '1996-04': 0.7847656364815592, '1996-03': 0.5686684883001103, '1996-02': 0.6046006153235561, '1996-01': 0.5361424556775187, '1995-12': 0.582218352282271, '1995-11': 0.2520841177554347, '1995-10': 0.18711415170517665, '1995-09': 0.09911223380606682, '1995-08': 0.15471563862325155, '1995-07': 0.21612593271633695, '1995-06': -0.10021700152871738, '1995-05': 0.12239306794310512, '1995-04': -0.1485716424823762, '1995-03': 0.07774875287437766, '1995-02': 0.005530656848050874, '1995-01': -0.17366376349794965, '1994-12': -0.07372021884112545, '1994-11': 0.0710300061485718, '1994-10': 0.015967085699494454, '1994-09': -0.08081919369149304, '1994-08': 0.4733303756338012, '1994-07': 0.2909818124469794, '1994-06': 0.26251244031721566, '1994-05': -0.04512881625732845, '1994-04': -0.06192046420571007, '1994-03': -0.3072708019348447, '1994-02': -0.3470450481381304, '1994-01': -0.26483283231954413, '1993-12': -0.35676287792967276, '1993-11': -0.19236558502430423, '1993-10': -0.23387257303382292, '1993-09': -0.12339879469031345, '1993-08': -0.6377757402280535, '1993-07': -0.7776055052670063, '1993-06': -0.532779003980675, '1993-05': -0.8030173795691615, '1993-04': -0.30412011831923813, '1993-03': -0.4601055392337505, '1993-02': -0.5265263897188905, '1993-01': 0.024103986248591447, '1992-12': 0.30751916895096176, '1992-11': 0.5364895748048104, '1992-10': 0.2725487160528841, '1992-09': 0.08033731725271664, '1992-08': -0.2015306130147847, '1992-07': -0.17993281285944462, '1992-06': -0.24235517989621513, '1992-05': 1.0922579124896323, '1992-04': 0.91071631442406, '1992-03': 1.188886534159125, '1992-02': 1.4034767246594475, '1992-01': 1.0192804393859793, '1991-12': 1.0056437210231168, '1991-11': 0.7718995699736153, '1991-10': 1.314893240464544, '1991-09': 1.5211565735038768, '1991-08': 1.9604302578878192, '1991-07': 2.166329600872496, '1991-06': 2.322680180482646, '1991-05': 1.3884570967189234, '1991-04': 1.1492689741571258, '1991-03': 1.0141562414080818, '1991-02': 0.8862079718362974, '1991-01': 0.8241577409953704, '1990-12': 0.9640992657915479}
#同比图
year_on_year_price_basis_view = year_on_year_basis.values()
year_on_year_price_basis = list(year_on_year_price_basis_view)
plt.plot(year_on_year_basis.keys(), year_on_year_basis.values())
[<matplotlib.lines.Line2D at 0x7fd5600d6190>]

原始傅里叶换

##### 原始傅里叶变换_备份
fs = 12
fft_count = len(year_on_year_price_basis)
fft = np.fft.fft(year_on_year_price_basis[0:fft_count])
#f_x = np.arange(186) * fs / fft_count
f_x = np.fft.fftfreq(fft_count, 1 / fs)
print("fft_count %d"%(fft_count))
plt.stem(f_x, np.abs(fft)[0:len(f_x)], use_line_collection=True)
max_amp = 0
max_index = 0
for i in range(len(fft)):
    if np.abs(fft[i]) > max_amp:
        max_amp = np.abs(fft[i])
        max_index = i
print("max_amp %.5f, freq %.5f, max_index %d "%(max_amp, f_x[max_index], max_index))         
second_max_amp = 0
second_max_index = 0
for i in range(len(fft)):
    if np.abs(fft[i]) > second_max_amp and int(np.abs(fft[i])) != int(max_amp) :
        second_max_amp = np.abs(fft[i])
        second_max_index = i        
print("second_max_amp %.5f, second_freq %.5f, second_max_index %d "%(second_max_amp, f_x[second_max_index], second_max_index)) 
#plt.stem(fft, use_line_collection=True)
max_freq = np.argmax(np.abs(fft))
print("max_freq %.5f"%(max_freq))      
tmp_freq = (fft[max_freq+1] - fft[max_freq-1]) / (2 * fft[max_freq] - fft[max_freq-1] - fft[max_freq+1])
best_freq = (max_freq - np.real(tmp_freq)) * fs / fft_count
print("best_freq = %.5f " % (best_freq))
print('bin = %.3f Hz' % (fs / fft_count))
fft_count 370
max_amp 44.22387, freq 0.12973, max_index 4 
second_max_amp 38.32627, second_freq 0.00000, second_max_index 0 
max_freq 4.00000
best_freq = 0.12574 
bin = 0.032 Hz
##### 原始傅里叶变换修改
fs = 12
fft_count = len(year_on_year_price_basis)
year_on_year_price_basis_sin = []
for i in range(fft_count):
    year_on_year_price_basis_sin.append(np.sin(2 * np.pi*year_on_year_price_basis[i]))
year_on_year_price_basis = year_on_year_price_basis_sin
fft = np.fft.fft(year_on_year_price_basis[0:fft_count])
#f_x = np.arange(186) * fs / fft_count
f_x = np.fft.fftfreq(fft_count, 1 / fs)
print("fft_count %d"%(fft_count))
plt.stem(f_x, np.abs(fft)[0:len(f_x)], use_line_collection=True)
max_amp = 0
max_index = 0
for i in range(len(fft)):
    if np.abs(fft[i]) > max_amp:
        max_amp = np.abs(fft[i])
        max_index = i
print("max_amp %.5f, freq %.5f, max_index %d "%(max_amp, f_x[max_index], max_index))         
second_max_amp = 0
second_max_index = 0
for i in range(len(fft)):
    if np.abs(fft[i]) > second_max_amp and int(np.abs(fft[i])) != int(max_amp) :
        second_max_amp = np.abs(fft[i])
        second_max_index = i        
print("second_max_amp %.5f, second_freq %.5f, second_max_index %d "%(second_max_amp, f_x[second_max_index], second_max_index)) 
#plt.stem(fft, use_line_collection=True)
max_freq = np.argmax(np.abs(fft))
print("max_freq %.5f"%(max_freq))      
tmp_freq = (fft[max_freq+1] - fft[max_freq-1]) / (2 * fft[max_freq] - fft[max_freq-1] - fft[max_freq+1])
best_freq = (max_freq - np.real(tmp_freq)) * fs / fft_count
print("best_freq = %.5f " % (best_freq))
print('bin = %.3f Hz' % (fs / fft_count))
fft_count 370
max_amp 53.10545, freq 0.29189, max_index 9 
second_max_amp 40.13227, second_freq 0.51892, second_max_index 16 
max_freq 9.00000
best_freq = 0.29798 
bin = 0.032 Hz

优化傅里叶变换

##### 优化傅里叶变换 v1
sample_rate = 12
price_count = len(year_on_year_price_basis)
# price_count 370
print("price_count: %d"%(price_count))
fft_src_data = np.asarray(year_on_year_price_basis[0:price_count])
print("fft_src_data type")
print(type(fft_src_data))
fft_list =  np.fft.fft(fft_src_data)
amp_list = abs(fft_list)  # 幅度谱
normalization_fft = amp_list / price_count  # 归一化

#f_x = np.arange(fft_list.size) * sample_rate / price_count
f_x = np.fft.fftfreq(price_count, 1 / sample_rate)

#滤波
filter_fft_list = copy.deepcopy(fft_list)
for i in range(len(filter_fft_list)):
    print("i %d f_x[i] %d filter_fft_list[i] %d"%(i, f_x[i], filter_fft_list[i]))
    if f_x[i] > 0.3:
        filter_fft_list[i] = 0
    if f_x[i] < 0.1:
        filter_fft_list[i] = 0
        
print("fft_list")
print(fft_list)
print("size of fft")
# size of fft 186
print(fft_list.size)
print("f_x")
print(f_x)
print("size of f_x")
print(f_x.size)

#plt.tight_layout()
plt.figure(figsize=(10, 10))
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, \
    wspace=0.45, hspace=0.45)
plt.subplot(711)

plt.title('原始信号',fontproperties=font_set)
plt.plot(year_on_year_price_basis[0:price_count])  

plt.subplot(712)
plt.title('傅里叶变换信号(幅度取正负)',fontproperties=font_set)
plt.plot(f_x,fft_list[0:fft_list.size])  

plt.subplot(713)
plt.title('傅里叶变换信号(幅度)',fontproperties=font_set)
plt.plot(f_x, np.abs(fft_list)[0:len(f_x)])  

plt.subplot(714)
plt.title('傅里叶棉棒信号',fontproperties=font_set)
plt.stem(f_x, np.abs(fft_list)[0:len(f_x)], use_line_collection=True)

plt.subplot(715)
plt.title("未归一化的幅度谱",fontproperties=font_set)
plt.plot(f_x, amp_list)

plt.subplot(716)
plt.title("归一化的幅度谱",fontproperties=font_set)
plt.plot(f_x, normalization_fft)

plt.subplot(717)
plt.title("滤波后的幅度谱",fontproperties=font_set)
plt.plot(f_x,filter_fft_list)
price_count: 370
fft_src_data type
<class 'numpy.ndarray'>

[<matplotlib.lines.Line2D at 0x7fceb3fe44f0>]
##### 优化傅里叶变换 v2
fs = 12
year_on_year_price_basis = list(year_on_year_price_basis_view)
fft_count = len(year_on_year_price_basis)
year_on_year_price_basis_sin = []
for i in range(fft_count):
    year_on_year_price_basis_sin.append(np.sin(2 * np.pi*year_on_year_price_basis[i]))
fft_count = len(year_on_year_price_basis_sin)
fft = np.fft.fft(year_on_year_price_basis_sin[0:fft_count])
normalization_fft = fft / fft_count  # 归一化
#f_x = np.arange(186) * fs / fft_count
f_x = np.fft.fftfreq(fft_count, 1 / fs)
print("fft_count %d"%(fft_count))

#计算最佳频率
max_amp = 0
max_index = 0
for i in range(len(normalization_fft)):
    if np.abs(normalization_fft[i]) > max_amp:
        max_amp = np.abs(normalization_fft[i])
        max_index = i
print("max_amp %.5f, freq %.5f, max_index %d "%(max_amp, f_x[max_index], max_index))         
second_max_amp = 0
second_max_index = 0
for i in range(len(normalization_fft)):
    if np.abs(normalization_fft[i]) > second_max_amp and int(np.abs(normalization_fft[i])) != int(max_amp) :
        second_max_amp = np.abs(normalization_fft[i])
        second_max_index = i        
print("second_max_amp %.5f, second_freq %.5f, second_max_index %d "%(second_max_amp, f_x[second_max_index], second_max_index)) 
#plt.stem(fft, use_line_collection=True)
max_freq = np.argmax(np.abs(fft))
print("max_freq %.5f"%(max_freq))      
tmp_freq = (fft[max_freq+1] - fft[max_freq-1]) / (2 * fft[max_freq] - fft[max_freq-1] - fft[max_freq+1])
best_freq = (max_freq - np.real(tmp_freq)) * fs / fft_count
print("best_freq = %.5f " % (best_freq))
print('bin = %.3f Hz' % (fs / fft_count))

#滤波
'''
这里假设采样频率为1000hz,信号本身最大的频率为500hz,要滤除100hz以下,400hz以上频率成分,即截至频率为100,400hz,则wn1=2*100/1000=0.2,Wn1=0.2; 
wn2=2*400/1000=0.8,Wn2=0.8。Wn=[0.02,0.8]
b, a = signal.butter(8, [0.2,0.8], 'bandpass')   #配置滤波器 8 表示滤波器的阶数

采样 12, 滤除0.1以下,0.3以上,
wn1 = 2 * 0.1 / 12 =0.0167
wn2 = 2 * 0.3 / 12 = 0.05
'''
#b, a = signal.butter(8, [0.0167,0.05], 'bandpass')   #配置滤波器 8 表示滤波器的阶数
b, a = signal.butter(8, 0.05, 'lowpass')   #配置滤波器 8 表示滤波器的阶数
filter_price_sin = signal.filtfilt(b, a, year_on_year_price_basis_sin)  
filter_price = signal.filtfilt(b, a, year_on_year_price_basis)  


#画图
plt.figure(figsize=(10, 10))
plt.subplots_adjust(left=None, bottom=None, right=None, top=None, \
    wspace=0.45, hspace=0.45)

plt.subplot(711)
plt.title('原始信号',fontproperties=font_set)
plt.plot(year_on_year_price_basis[0:fft_count]) 

plt.subplot(712)
plt.title('原始sin信号',fontproperties=font_set)
plt.plot(year_on_year_price_basis_sin[0:fft_count]) 

plt.subplot(713)
plt.title("未归一化的棉棒图",fontproperties=font_set)
plt.stem(f_x, np.abs(fft)[0:len(f_x)], use_line_collection=True)

plt.subplot(714)
plt.title("归一化的幅度谱",fontproperties=font_set)
plt.plot(f_x, np.abs(normalization_fft)[0:len(normalization_fft)])

plt.subplot(715)
plt.title("还原信号",fontproperties=font_set)
restore_fft = np.fft.ifft(fft)
plt.plot(restore_fft)

plt.subplot(716)
plt.title("滤波后的sin",fontproperties=font_set)
plt.plot(filter_price_sin)

plt.subplot(717)
plt.title("滤波后原始",fontproperties=font_set)
year_on_year_month_basis = list(year_on_year_basis.keys())
plt.plot(filter_price)
plt.show()

plt.plot(year_on_year_month_basis, filter_price)
fft_count 370
max_amp 0.14353, freq 0.29189, max_index 9 
second_max_amp 0.00000, second_freq 0.00000, second_max_index 0 
max_freq 9.00000
best_freq = 0.29798 
bin = 0.032 Hz


/Users/feivirus/opt/anaconda3/lib/python3.9/site-packages/matplotlib/cbook/__init__.py:1298: ComplexWarning: Casting complex values to real discards the imaginary part
  return np.asarray(x, float)
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值