针对可交易的投资商品,理性地运用逻辑分析和回归统计判断市场趋势称为量化交易。
量化策略
量化策略就是赚钱"因子",可以分为基本面和技术面。
- 基本面
- 居民消费指数
- 人均国内生产总值(GDP)
- 净资产收益率(ROE)
- 技术面
- 股票收盘价
- K线(日/周/月/年)
- 均线(5/10/20/60)
技术面分析更关注基于商品价格相关的数值和合成的指标。基本面更关注企业本身和宏观经济,大的市场环境的变化。
获取股票数据
使用JQData查询行情数据
申请试用:https://www.joinquant.com/default/index/sdk#jq-sdk-apply
安装环境
pip install jqdatasdk
登录并查询股票数据
from jqdatasdk import * if __name__ == '__main__': auth('账户', '密码') # 获取深交所(XSHE)股票代码为000001的在2024年的股票数据(开盘价和收盘价) df = get_price('000001.XSHE', count=2, end_date='2024-05-01', frequency='daily', fields=['open', 'close']) print(df)
运行结果
auth success
open close
2024-04-29 9.86 10.09
2024-04-30 10.08 10.07
当然我们也可以不考虑设置字段,取更多数据
from jqdatasdk import * if __name__ == '__main__': auth('账户', '密码') # 获取深交所(XSHE)股票代码为000001的在2024年的股票数据(开盘价和收盘价) df = get_price('000001.XSHE', count=100, end_date='2024-05-01', frequency='daily') print(df)
运行结果
auth success
open close high low volume money
2023-11-30 9.04 9.03 9.08 8.98 96617632.0 8.714817e+08
2023-12-01 9.01 9.02 9.03 8.94 83363249.0 7.496684e+08
2023-12-04 9.03 8.99 9.03 8.97 64868341.0 5.836643e+08
2023-12-05 8.97 8.85 8.98 8.84 84361980.0 7.509612e+08
2023-12-06 8.81 8.87 8.93 8.77 80684563.0 7.140295e+08
... ... ... ... ... ... ...
2024-04-24 9.82 9.83 9.87 9.76 100882258.0 9.890935e+08
2024-04-25 9.80 9.90 9.91 9.78 119337026.0 1.176305e+09
2024-04-26 9.88 9.89 9.96 9.78 172245805.0 1.698581e+09
2024-04-29 9.86 10.09 10.17 9.82 232411861.0 2.337351e+09
2024-04-30 10.08 10.07 10.15 10.01 141916771.0 1.431408e+09
[100 rows x 6 columns]
这里我们需要跟真实数据进行比对,比对结果如下
这里我们可以看到平安银行4月30号的开盘价是10.08,收盘价是10.07,这是能对上的。
如果我们想获取的是分钟数据
from jqdatasdk import * if __name__ == '__main__': auth('账户', '密码') # 获取深交所(XSHE)股票代码为000001的在2024年的股票数据(开盘价和收盘价) df = get_price('000001.XSHE', count=10, end_date='2024-05-01', frequency='1m') print(df)
运行结果
auth success
open close high low volume money
2024-04-30 14:51:00 10.07 10.07 10.08 10.06 2238011.0 22551672.0
2024-04-30 14:52:00 10.07 10.08 10.08 10.07 385071.0 3880720.0
2024-04-30 14:53:00 10.07 10.08 10.08 10.07 309964.0 3123238.0
2024-04-30 14:54:00 10.07 10.07 10.08 10.07 608250.0 6127837.0
2024-04-30 14:55:00 10.08 10.08 10.08 10.07 795964.0 8022444.0
2024-04-30 14:56:00 10.08 10.08 10.09 10.07 1819929.0 18335986.0
2024-04-30 14:57:00 10.07 10.07 10.08 10.07 350484.0 3530845.0
2024-04-30 14:58:00 10.07 10.07 10.07 10.07 14571.0 146823.0
2024-04-30 14:59:00 10.07 10.07 10.07 10.07 0.0 0.0
2024-04-30 15:00:00 10.07 10.07 10.07 10.07 3000536.0 30217395.0
具体的时间设置可以在https://joinquant.com/help/api/help#name:api查询。
获取A股所有的行情数据
from jqdatasdk import * if __name__ == '__main__': auth('账户', '密码') # 获取所有的股票代码 stocks = list(get_all_securities(['stock']).index) print(stocks)
运行结果
['000001.XSHE', '000002.XSHE', '000004.XSHE', '000005.XSHE', '000006.XSHE', '000007.XSHE',
'000008.XSHE', '000009.XSHE', '000010.XSHE', '000011.XSHE', '000012.XSHE', '000014.XSHE',
'000016.XSHE', '000017.XSHE', '000018.XSHE', '000019.XSHE', '000020.XSHE', '000021.XSHE',
'000022.XSHE', '000023.XSHE', '000024.XSHE', '000025.XSHE', '000026.XSHE', '000027.XSHE',
'000028.XSHE', '000029.XSHE', '000030.XSHE', '000031.XSHE', '000032.XSHE', '000033.XSHE',
'000034.XSHE', '000035.XSHE', '000036.XSHE', '000037.XSHE', '000038.XSHE', '000039.XSHE',
'000040.XSHE', '000042.XSHE', '000043.XSHE', '000045.XSHE', '000046.XSHE', '000048.XSHE',
'000049.XSHE', '000050.XSHE', '000055.XSHE', '000056.XSHE', '000058.XSHE', '000059.XSHE',
'000060.XSHE', '000061.XSHE', '000062.XSHE', '000063.XSHE', '000065.XSHE', '000066.XSHE',
'000068.XSHE', '000069.XSHE', '000070.XSHE', '000078.XSHE', '000088.XSHE', '000089.XSHE',
'000090.XSHE', '000096.XSHE', '000099.XSHE', '000100.XSHE', '000150.XSHE', '000151.XSHE',
'000153.XSHE', '000155.XSHE', '000156.XSHE', '000157.XSHE', '000158.XSHE', '000159.XSHE',
'000166.XSHE', '000301.XSHE', '000333.XSHE', '000338.XSHE', '000400.XSHE', '000401.XSHE',
'000402.XSHE', '000403.XSHE', '000404.XSHE', '000406.XSHE', '000407.XSHE', '000408.XSHE',
'000409.XSHE', '000410.XSHE', '000411.XSHE', '000413.XSHE', '000415.XSHE', '000416.XSHE',
'000417.XSHE', '000418.XSHE', '000419.XSHE', '000420.XSHE', '000421.XSHE', '000422.XSHE',
'000423.XSHE', '000425.XSHE', '000426.XSHE', '000428.XSHE', '000429.XSHE', '000430.XSHE',
'000488.XSHE', '000498.XSHE', '000501.XSHE', '000502.XSHE', '000503.XSHE', '000504.XSHE',
'000505.XSHE', '000506.XSHE', '000507.XSHE', '000509.XSHE', '000510.XSHE', '000511.XSHE',
'000513.XSHE', '000514.XSHE', '000515.XSHE', '000516.XSHE', '000517.XSHE', '000518.XSHE',
'000519.XSHE', '000520.XSHE', '000521.XSHE', '000522.XSHE', '000523.XSHE', '000524.XSHE',
'000525.XSHE', '000526.XSHE', '000527.XSHE', '000528.XSHE', '000529.XSHE', '000530.XSHE',
'000531.XSHE', '000532.XSHE', '000533.XSHE', '000534.XSHE', '000535.XSHE', '000536.XSHE',
'000537.XSHE', '000538.XSHE', '000539.XSHE', '000540.XSHE', '000541.XSHE', '000543.XSHE',
'000544.XSHE', '000545.XSHE', '000546.XSHE', '000547.XSHE', '000548.XSHE', '000549.XSHE', '000550.XSHE', '000551.XSHE', '000552.XSHE', '000553.XSHE', '000554.XSHE', '000555.XSHE', '000557.XSHE', '000558.XSHE', '000559.XSHE', '000560.XSHE', '000561.XSHE', '000562.XSHE', '000563.XSHE', '000564.XSHE', '000565.XSHE', '000566.XSHE', '000567.XSHE', '000568.XSHE', '000569.XSHE', '000570.XSHE', '000571.XSHE', '000572.XSHE', '000573.XSHE', '000576.XSHE', '000578.XSHE', '000581.XSHE', '000582.XSHE', '000583.XSHE', '000584.XSHE', '000585.XSHE', '000586.XSHE', '000587.XSHE', '000589.XSHE', '000590.XSHE', '000591.XSHE', '000592.XSHE', '000593.XSHE', '000594.XSHE', '000595.XSHE', '000596.XSHE', '000597.XSHE', '000598.XSHE', '000599.XSHE', '000600.XSHE', '000601.XSHE', '000602.XSHE', '000603.XSHE', '000605.XSHE', '000606.XSHE', '000607.XSHE', '000608.XSHE', '000609.XSHE', '000610.XSHE', '000611.XSHE', '000612.XSHE', '000613.XSHE', '000615.XSHE', '000616.XSHE', '000617.XSHE', '000618.XSHE', '000619.XSHE', '000620.XSHE', '000622.XSHE', '000623.XSHE', '000625.XSHE', '000626.XSHE', '000627.XSHE', '000628.XSHE', '000629.XSHE', '000630.XSHE', '000631.XSHE', '000632.XSHE', '000633.XSHE', '000635.XSHE', '000636.XSHE', '000637.XSHE', '000638.XSHE', '000639.XSHE', '000650.XSHE', '000651.XSHE', '000652.XSHE', '000655.XSHE', '000656.XSHE', '000657.XSHE', '000659.XSHE', '000661.XSHE', '000662.XSHE', '000663.XSHE', '000665.XSHE', '000666.XSHE', '000667.XSHE', '000668.XSHE', '000669.XSHE', '000670.XSHE', '000671.XSHE', '000672.XSHE', '000673.XSHE', '000676.XSHE', '000677.XSHE', '000678.XSHE', '000679.XSHE', '000680.XSHE', '000681.XSHE', '000682.XSHE', '000683.XSHE', '000685.XSHE', '000686.XSHE', '000687.XSHE', '000688.XSHE', '000690.XSHE', '000691.XSHE', '000692.XSHE', '000693.XSHE', '000695.XSHE', '000697.XSHE', '000698.XSHE', '000699.XSHE', '000700.XSHE', '000701.XSHE', '000702.XSHE', '000703.XSHE', '000705.XSHE', '000707.XSHE', '000708.XSHE', '000709.XSHE', '000710.XSHE', '000711.XSHE', '000712.XSHE', '000713.XSHE', '000715.XSHE', '000716.XSHE', '000717.XSHE', '000718.XSHE', '000719.XSHE', '000720.XSHE', '000721.XSHE', '000722.XSHE', '000723.XSHE', '000725.XSHE', '000726.XSHE', '000727.XSHE', '000728.XSHE', '000729.XSHE', '000731.XSHE', '000732.XSHE', '000733.XSHE', '000735.XSHE', '000736.XSHE', '000737.XSHE', '000738.XSHE', '000739.XSHE', '000748.XSHE', '000750.XSHE', '000751.XSHE', '000752.XSHE', '000753.XSHE', '000755.XSHE', '000756.XSHE', '000757.XSHE', '000758.XSHE', '000759.XSHE', '000760.XSHE', '000761.XSHE', '000762.XSHE', '000763.XSHE', '000765.XSHE', '000766.XSHE', '000767.XSHE', '000768.XSHE', '000769.XSHE', '000776.XSHE', '000777.XSHE', '000778.XSHE', '000779.XSHE', '000780.XSHE', '000782.XSHE', '000783.XSHE', '000785.XSHE', '000786.XSHE', '000787.XSHE', '000788.XSHE', '000789.XSHE', '000790.XSHE', '000791.XSHE', '000792.XSHE', '000793.XSHE', '000795.XSHE', '000796.XSHE', '000797.XSHE', '000798.XSHE', '000799.XSHE', '000800.XSHE', '000801.XSHE', '000802.XSHE', '000803.XSHE', '000805.XSHE', '000806.XSHE', '000807.XSHE', '000809.XSHE', '000810.XSHE', '000811.XSHE', '000812.XSHE', '000813.XSHE', '000815.XSHE', '000816.XSHE', '000817.XSHE', '000818.XSHE', '000819.XSHE', '000820.XSHE', '000821.XSHE', '000822.XSHE', '000823.XSHE', '000825.XSHE', '000826.XSHE', '000827.XSHE', '000828.XSHE', '000829.XSHE', '000830.XSHE', '000831.XSHE', '000832.XSHE', '000833.XSHE', '000835.XSHE', '000836.XSHE', '000837.XSHE', '000838.XSHE', '000839.XSHE', '000848.XSHE', '000850.XSHE', '000851.XSHE', '000852.XSHE', '000856.XSHE', '000858.XSHE', '000859.XSHE', '000860.XSHE', '000861.XSHE', '000862.XSHE', '000863.XSHE', '000866.XSHE', '000868.XSHE', '000869.XSHE', '000875.XSHE', '000876.XSHE', '000877.XSHE', '000878.XSHE', '000880.XSHE', '000881.XSHE', '000882.XSHE', '000883.XSHE', '000885.XSHE', '000886.XSHE', '000887.XSHE', '000888.XSHE', '000889.XSHE', '000890.XSHE', '000892.XSHE', '000893.XSHE', '000895.XSHE', '000897.XSHE', '000898.XSHE', '000899.XSHE', '000900.XSHE', '000901.XSHE', '000902.XSHE', '000903.XSHE', '000905.XSHE', '000906.XSHE', '000908.XSHE', '000909.XSHE', '000910.XSHE', '000911.XSHE', '000912.XSHE', '000913.XSHE', '000915.XSHE', '000916.XSHE', '000917.XSHE', '000918.XSHE', '000919.XSHE', '000920.XSHE', '000921.XSHE', '000922.XSHE', '000923.XSHE', '000925.XSHE', '000926.XSHE', '000927.XSHE', '000928.XSHE', '000929.XSHE', '000930.XSHE', '000931.XSHE', '000932.XSHE', '000933.XSHE', '000935.XSHE', '000936.XSHE', '000937.XSHE', '000938.XSHE', '000939.XSHE', '000948.XSHE', '000949.XSHE', '000950.XSHE', '000951.XSHE', '000952.XSHE', '000953.XSHE', '000955.XSHE', '000956.XSHE', '000957.XSHE', '000958.XSHE', '000959.XSHE', '000960.XSHE', '000961.XSHE', '000962.XSHE', '000963.XSHE', '000965.XSHE', '000966.XSHE', '000967.XSHE', '000968.XSHE', '000969.XSHE', '000970.XSHE', '000971.XSHE', '000972.XSHE', '000973.XSHE', '000975.XSHE', '000976.XSHE', '000977.XSHE', '000978.XSHE', '000979.XSHE', '000980.XSHE', '000981.XSHE', '000982.XSHE', '000983.XSHE', '000985.XSHE', '000987.XSHE', '000988.XSHE', '000989.XSHE', '000990.XSHE', '000993.XSHE', '000995.XSHE', '000996.XSHE', '000997.XSHE', '000998.XSHE', '000999.XSHE', '001201.XSHE', '001202.XSHE', '001203.XSHE', '001205.XSHE', '001206.XSHE', '001207.XSHE', '001208.XSHE', '001209.XSHE', '001210.XSHE', '001211.XSHE', '001212.XSHE', '001213.XSHE', '001215.XSHE', '001216.XSHE', '001217.XSHE', '001218.XSHE', '001219.XSHE', '001222.XSHE', '001223.XSHE', '001225.XSHE', '001226.XSHE', '001227.XSHE', '001228.XSHE', '001229.XSHE', '001230.XSHE', '001231.XSHE', '001234.XSHE', '001236.XSHE', '001238.XSHE', '001239.XSHE', '001255.XSHE', '001256.XSHE', '001258.XSHE', '001259.XSHE', '001260.XSHE', '001266.XSHE', '001267.XSHE', '001268.XSHE', '001269.XSHE', '001270.XSHE', '001278.XSHE', '001282.XSHE', '001283.XSHE', '001286.XSHE', '001287.XSHE', '001288.XSHE', '001289.XSHE', '001296.XSHE', '001298.XSHE', '001299.XSHE', '001300.XSHE', '001301.XSHE', '001306.XSHE', '001308.XSHE', '001309.XSHE', '001311.XSHE', '001313.XSHE', '001314.XSHE', '001316.XSHE', '001317.XSHE', '001318.XSHE', '001319.XSHE', '001322.XSHE', '001323.XSHE', '001324.XSHE', '001326.XSHE', '001328.XSHE', '001330.XSHE', '001331.XSHE', '001332.XSHE', '001333.XSHE', '001336.XSHE', '001337.XSHE', '001338.XSHE', '001339.XSHE', '001358.XSHE', '001359.XSHE', '001360.XSHE', '001366.XSHE', '001367.XSHE', '001368.XSHE', '001373.XSHE', '001376.XSHE', '001378.XSHE', '001379.XSHE', '001380.XSHE', '001387.XSHE', '001389.XSHE', '001696.XSHE', '001872.XSHE', '001896.XSHE', '001914.XSHE', '001965.XSHE', '001979.XSHE', '002001.XSHE', '002002.XSHE', '002003.XSHE', '002004.XSHE', '002005.XSHE', '002006.XSHE', '002007.XSHE', '002008.XSHE', '002009.XSHE', '002010.XSHE', '002011.XSHE', '002012.XSHE', '002013.XSHE', '002014.XSHE', '002015.XSHE', '002016.XSHE', '002017.XSHE', '002018.XSHE', '002019.XSHE', '002020.XSHE', '002021.XSHE', '002022.XSHE', '002023.XSHE', '002024.XSHE', '002025.XSHE', '002026.XSHE', '002027.XSHE', '002028.XSHE', '002029.XSHE', '002030.XSHE', '002031.XSHE', '002032.XSHE', '002033.XSHE', '002034.XSHE', '002035.XSHE', '002036.XSHE', '002037.XSHE', '002038.XSHE', '002039.XSHE', '002040.XSHE', '002041.XSHE', '002042.XSHE', '002043.XSHE', '002044.XSHE', '002045.XSHE', '002046.XSHE', '002047.XSHE', '002048.XSHE', '002049.XSHE', '002050.XSHE', '002051.XSHE', '002052.XSHE', '002053.XSHE', '002054.XSHE', '002055.XSHE', '002056.XSHE', '002057.XSHE', '002058.XSHE', '002059.XSHE', '002060.XSHE', '002061.XSHE', '002062.XSHE', '002063.XSHE', '002064.XSHE', '002065.XSHE', '002066.XSHE', '002067.XSHE', '002068.XSHE', '002069.XSHE', '002070.XSHE', '002071.XSHE', '002072.XSHE', '002073.XSHE', '002074.XSHE', '002075.XSHE', '002076.XSHE', '002077.XSHE', '002078.XSHE', '002079.XSHE', '002080.XSHE', '002081.XSHE', '002082.XSHE', '002083.XSHE', '002084.XSHE', '002085.XSHE', '002086.XSHE', '002087.XSHE', '002088.XSHE', '002089.XSHE', '002090.XSHE', '002091.XSHE', '002092.XSHE', '002093.XSHE', '002094.XSHE', '002095.XSHE', '002096.XSHE', '002097.XSHE', '002098.XSHE', '002099.XSHE', '002100.XSHE', '002101.XSHE', '002102.XSHE', '002103.XSHE', '002104.XSHE', '002105.XSHE', '002106.XSHE', '002107.XSHE', '002108.XSHE', '002109.XSHE', '002110.XSHE', '002111.XSHE', '002112.XSHE', '002113.XSHE', '002114.XSHE', '002115.XSHE', '002116.XSHE', '002117.XSHE', '002118.XSHE', '002119.XSHE', '002120.XSHE', '002121.XSHE', '002122.XSHE', '002123.XSHE', '002124.XSHE', '002125.XSHE', '002126.XSHE', '002127.XSHE', '002128.XSHE', '002129.XSHE', '002130.XSHE', '002131.XSHE', '002132.XSHE', '002133.XSHE', '002134.XSHE', '002135.XSHE', '002136.XSHE', '002137.XSHE', '002138.XSHE', '002139.XSHE', '002140.XSHE', '002141.XSHE', '002142.XSHE', '002143.XSHE', '002144.XSHE', '002145.XSHE', '002146.XSHE', '002147.XSHE', '002148.XSHE', '002149.XSHE', '002150.XSHE', '002151.XSHE', '002152.XSHE', '002153.XSHE', '002154.XSHE', '002155.XSHE', '002156.XSHE', '002157.XSHE', '002158.XSHE', '002159.XSHE', '002160.XSHE', '002161.XSHE', '002162.XSHE', '002163.XSHE', '002164.XSHE', '002165.XSHE', '002166.XSHE', '002167.XSHE', '002168.XSHE', '002169.XSHE', '002170.XSHE', '002171.XSHE', '002172.XSHE', '002173.XSHE', '002174.XSHE', '002175.XSHE', '002176.XSHE', '002177.XSHE', '002178.XSHE', '002179.XSHE', '002180.XSHE', '002181.XSHE', '002182.XSHE', '002183.XSHE', '002184.XSHE', '002185.XSHE', '002186.XSHE', '002187.XSHE', '002188.XSHE', '002189.XSHE', '002190.XSHE', '002191.XSHE', '002192.XSHE', '002193.XSHE', '002194.XSHE', '002195.XSHE', '002196.XSHE', '002197.XSHE', '002198.XSHE', '002199.XSHE', '002200.XSHE', '002201.XSHE', '002202.XSHE', '002203.XSHE', '002204.XSHE', '002205.XSHE', '002206.XSHE', '002207.XSHE', '002208.XSHE', '002209.XSHE', '002210.XSHE', '002211.XSHE', '002212.XSHE', '002213.XSHE', '002214.XSHE', '002215.XSHE', '002216.XSHE', '002217.XSHE', '002218.XSHE', '002219.XSHE', '002220.XSHE', '002221.XSHE', '002222.XSHE', '002223.XSHE', '002224.XSHE', '002225.XSHE', '002226.XSHE', '002227.XSHE', '002228.XSHE', '002229.XSHE', '002230.XSHE', '002231.XSHE', '002232.XSHE', '002233.XSHE', '002234.XSHE', '002235.XSHE', '002236.XSHE', '002237.XSHE', '002238.XSHE', '002239.XSHE', '002240.XSHE', '002241.XSHE', '002242.XSHE', '002243.XSHE', '002244.XSHE', '002245.XSHE', '002246.XSHE', '002247.XSHE', '002248.XSHE', '002249.XSHE', '002250.XSHE', '002251.XSHE', '002252.XSHE', '002253.XSHE', '002254.XSHE', '002255.XSHE', '002256.XSHE', '002258.XSHE', '002259.XSHE', '002260.XSHE', '002261.XSHE', '002262.XSHE', '002263.XSHE', '002264.XSHE', '002265.XSHE', '002266.XSHE', '002267.XSHE', '002268.XSHE', '002269.XSHE', '002270.XSHE', '002271.XSHE', '002272.XSHE', '002273.XSHE', '002274.XSHE', '002275.XSHE', '002276.XSHE', '002277.XSHE', '002278.XSHE', '002279.XSHE', '002280.XSHE', '002281.XSHE', '002282.XSHE', '002283.XSHE', '002284.XSHE', '002285.XSHE', '002286.XSHE', '002287.XSHE', '002288.XSHE', '002289.XSHE', '002290.XSHE', '002291.XSHE', '002292.XSHE', '002293.XSHE', '002294.XSHE', '002295.XSHE', '002296.XSHE', '002297.XSHE', '002298.XSHE', '002299.XSHE', '002300.XSHE', '002301.XSHE', '002302.XSHE', '002303.XSHE', '002304.XSHE', '002305.XSHE', '002306.XSHE', '002307.XSHE', '002308.XSHE', '002309.XSHE', '002310.XSHE', '002311.XSHE', '002312.XSHE', '002313.XSHE', '002314.XSHE', '002315.XSHE', '002316.XSHE', '002317.XSHE', '002318.XSHE', '002319.XSHE', '002320.XSHE', '002321.XSHE', '002322.XSHE', '002323.XSHE', '002324.XSHE', '002325.XSHE', '002326.XSHE', '002327.XSHE', '002328.XSHE', '002329.XSHE', '002330.XSHE', '002331.XSHE', '002332.XSHE', '002333.XSHE', '002334.XSHE', '002335.XSHE', '002336.XSHE', '002337.XSHE', '002338.XSHE', '002339.XSHE', '002340.XSHE', '002341.XSHE', '002342.XSHE', '002343.XSHE', '002344.XSHE', '002345.XSHE', '002346.XSHE', '002347.XSHE', '002348.XSHE', '002349.XSHE', '002350.XSHE', '002351.XSHE', '002352.XSHE', '002353.XSHE', '002354.XSHE', '002355.XSHE', '002356.XSHE', '002357.XSHE', '002358.XSHE', '002359.XSHE', '002360.XSHE', '002361.XSHE', '002362.XSHE', '002363.XSHE', '002364.XSHE', '002365.XSHE', '002366.XSHE', '002367.XSHE', '002368.XSHE', '002369.XSHE', '002370.XSHE', '002371.XSHE', '002372.XSHE', '002373.XSHE', '002374.XSHE', '002375.XSHE', '002376.XSHE', '002377.XSHE', '002378.XSHE', '002379.XSHE', '002380.XSHE', '002381.XSHE', '002382.XSHE', '002383.XSHE', '002384.XSHE', '002385.XSHE', '002386.XSHE', '002387.XSHE', '002388.XSHE', '002389.XSHE', '002390.XSHE', '002391.XSHE', '002392.XSHE', '002393.XSHE', '002394.XSHE', '002395.XSHE', '002396.XSHE', '002397.XSHE', '002398.XSHE', '002399.XSHE', '002400.XSHE', '002401.XSHE', '002402.XSHE', '002403.XSHE', '002404.XSHE', '002405.XSHE', '002406.XSHE', '002407.XSHE', '002408.XSHE', '002409.XSHE', '002410.XSHE', '002411.XSHE', '002412.XSHE', '002413.XSHE', '002414.XSHE', '002415.XSHE', '002416.XSHE', '002417.XSHE', '002418.XSHE', '002419.XSHE', '002420.XSHE', '002421.XSHE', '002422.XSHE', '002423.XSHE', '002424.XSHE', '002425.XSHE', '002426.XSHE', '002427.XSHE', '002428.XSHE', '002429.XSHE', '002430.XSHE', '002431.XSHE', '002432.XSHE', '002433.XSHE', '002434.XSHE', '002435.XSHE', '002436.XSHE', '002437.XSHE', '002438.XSHE', '002439.XSHE', '002440.XSHE', '002441.XSHE', '002442.XSHE', '002443.XSHE', '002444.XSHE', '002445.XSHE', '002446.XSHE', '002447.XSHE', '002448.XSHE', '002449.XSHE', '002450.XSHE', '002451.XSHE', '002452.XSHE', '002453.XSHE', '002454.XSHE', '002455.XSHE', '002456.XSHE', '002457.XSHE', '002458.XSHE', '002459.XSHE', '002460.XSHE', '002461.XSHE', '002462.XSHE', '002463.XSHE', '002464.XSHE', '002465.XSHE', '002466.XSHE', '002467.XSHE', '002468.XSHE', '002469.XSHE', '002470.XSHE', '002471.XSHE', '002472.XSHE', '002473.XSHE', '002474.XSHE', '002475.XSHE', '002476.XSHE', '002477.XSHE', '002478.XSHE', '002479.XSHE', '002480.XSHE', '002481.XSHE', '002482.XSHE', '002483.XSHE', '002484.XSHE', '002485.XSHE', '002486.XSHE', '002487.XSHE', '002488.XSHE', '002489.XSHE', '002490.XSHE', '002491.XSHE', '002492.XSHE', '002493.XSHE', '002494.XSHE', '002495.XSHE', '002496.XSHE', '002497.XSHE', '002498.XSHE', '002499.XSHE', '002500.XSHE', '002501.XSHE', '002502.XSHE', '002503.XSHE', '002504.XSHE', '002505.XSHE', '002506.XSHE', '002507.XSHE', '002508.XSHE', '002509.XSHE', '002510.XSHE', '002511.XSHE', '002512.XSHE', '002513.XSHE', '002514.XSHE', '002515.XSHE', '002516.XSHE', '002517.XSHE', '002518.XSHE', '002519.XSHE', '002520.XSHE', '002521.XSHE', '002522.XSHE', '002523.XSHE', '002524.XSHE', '002526.XSHE', '002527.XSHE', '002528.XSHE', '002529.XSHE', '002530.XSHE', '002531.XSHE', '002532.XSHE', '002533.XSHE', '002534.XSHE', '002535.XSHE', '002536.XSHE', '002537.XSHE', '002538.XSHE', '002539.XSHE', '002540.XSHE', '002541.XSHE', '002542.XSHE', '002543.XSHE', '002544.XSHE', '002545.XSHE', '002546.XSHE', '002547.XSHE', '002548.XSHE', '002549.XSHE', '002550.XSHE', '002551.XSHE', '002552.XSHE', '002553.XSHE', '002554.XSHE', '002555.XSHE', '002556.XSHE', '002557.XSHE', '002558.XSHE', '002559.XSHE', '002560.XSHE', '002561.XSHE', '002562.XSHE', '002563.XSHE', '002564.XSHE', '002565.XSHE', '002566.XSHE', '002567.XSHE', '002568.XSHE', '002569.XSHE', '002570.XSHE', '002571.XSHE', '002572.XSHE', '002573.XSHE', '002574.XSHE', '002575.XSHE', '002576.XSHE', '002577.XSHE', '002578.XSHE', '002579.XSHE', '002580.XSHE', '002581.XSHE', '002582.XSHE', '002583.XSHE', '002584.XSHE', '002585.XSHE', '002586.XSHE', '002587.XSHE', '002588.XSHE', '002589.XSHE', '002590.XSHE', '002591.XSHE', '002592.XSHE', '002593.XSHE', '002594.XSHE', '002595.XSHE', '002596.XSHE', '002597.XSHE', '002598.XSHE', '002599.XSHE', '002600.XSHE', '002601.XSHE', '002602.XSHE', '002603.XSHE', '002604.XSHE', '002605.XSHE', '002606.XSHE', '002607.XSHE', '002608.XSHE', '002609.XSHE', '002610.XSHE', '002611.XSHE', '002612.XSHE', '002613.XSHE', '002614.XSHE', '002615.XSHE', '002616.XSHE', '002617.XSHE', '002618.XSHE', '002619.XSHE', '002620.XSHE', '002621.XSHE', '002622.XSHE', '002623.XSHE', '002624.XSHE', '002625.XSHE', '002626.XSHE', '002627.XSHE', '002628.XSHE', '002629.XSHE', '002630.XSHE', '002631.XSHE', '002632.XSHE', '002633.XSHE', '002634.XSHE', '002635.XSHE', '002636.XSHE', '002637.XSHE', '002638.XSHE', '002639.XSHE', '002640.XSHE', '002641.XSHE', '002642.XSHE', '002643.XSHE', '002644.XSHE', '002645.XSHE', '002646.XSHE', '002647.XSHE', '002648.XSHE', '002649.XSHE', '002650.XSHE', '002651.XSHE', '002652.XSHE', '002653.XSHE', '002654.XSHE', '002655.XSHE', '002656.XSHE', '002657.XSHE', '002658.XSHE', '002659.XSHE', '002660.XSHE', '002661.XSHE', '002662.XSHE', '002663.XSHE', '002664.XSHE', '002665.XSHE', '002666.XSHE', '002667.XSHE', '002668.XSHE', '002669.XSHE', '002670.XSHE', '002671.XSHE', '002672.XSHE', '002673.XSHE', '002674.XSHE', '002675.XSHE', '002676.XSHE', '002677.XSHE', '002678.XSHE', '002679.XSHE', '002680.XSHE', '002681.XSHE', '002682.XSHE', '002683.XSHE', '002684.XSHE', '002685.XSHE', '002686.XSHE', '002687.XSHE', '002688.XSHE', '002689.XSHE', '002690.XSHE', '002691.XSHE', '002692.XSHE', '002693.XSHE', '002694.XSHE', '002695.XSHE', '002696.XSHE', '002697.XSHE', '002698.XSHE', '002699.XSHE', '002700.XSHE', '002701.XSHE', '002702.XSHE', '002703.XSHE', '002705.XSHE', '002706.XSHE', '002707.XSHE', '002708.XSHE', '002709.XSHE', '002711.XSHE', '002712.XSHE', '002713.XSHE', '002714.XSHE', '002715.XSHE', '002716.XSHE', '002717.XSHE', '002718.XSHE', '002719.XSHE', '002721.XSHE', '002722.XSHE', '002723.XSHE', '002724.XSHE', '002725.XSHE', '002726.XSHE', '002727.XSHE', '002728.XSHE', '002729.XSHE', '002730.XSHE', '002731.XSHE', '002732.XSHE', '002733.XSHE', '002734.XSHE', '002735.XSHE', '002736.XSHE', '002737.XSHE', '002738.XSHE', '002739.XSHE', '002740.XSHE', '002741.XSHE', '002742.XSHE', '002743.XSHE', '002745.XSHE', '002746.XSHE', '002747.XSHE', '002748.XSHE', '002749.XSHE', '002750.XSHE', '002751.XSHE', '002752.XSHE', '002753.XSHE', '002755.XSHE', '002756.XSHE', '002757.XSHE', '002758.XSHE', '002759.XSHE', '002760.XSHE', '002761.XSHE', '002762.XSHE', '002763.XSHE', '002765.XSHE', '002766.XSHE', '002767.XSHE', '002768.XSHE', '002769.XSHE', '002770.XSHE', '002771.XSHE', '002772.XSHE', '002773.XSHE', '002774.XSHE', '002775.XSHE', '002776.XSHE', '002777.XSHE', '002778.XSHE', '002779.XSHE', '002780.XSHE', '002781.XSHE', '002782.XSHE', '002783.XSHE', '002785.XSHE', '002786.XSHE', '002787.XSHE', '002788.XSHE', '002789.XSHE', '002790.XSHE', '002791.XSHE', '002792.XSHE', '002793.XSHE', '002795.XSHE', '002796.XSHE', '002797.XSHE', '002798.XSHE', '002799.XSHE', '002800.XSHE', '002801.XSHE', '002802.XSHE', '002803.XSHE', '002805.XSHE', '002806.XSHE', '002807.XSHE', '002808.XSHE', '002809.XSHE', '002810.XSHE', '002811.XSHE', '002812.XSHE', '002813.XSHE', '002815.XSHE', '002816.XSHE', '002817.XSHE', '002818.XSHE', '002819.XSHE', '002820.XSHE', '002821.XSHE', '002822.XSHE', '002823.XSHE', '002824.XSHE', '002825.XSHE', '002826.XSHE', '002827.XSHE', '002828.XSHE', '002829.XSHE', '002830.XSHE', '002831.XSHE', '002832.XSHE', '002833.XSHE', '002835.XSHE', '002836.XSHE', '002837.XSHE', '002838.XSHE', '002839.XSHE', '002840.XSHE', '002841.XSHE', '002842.XSHE', '002843.XSHE', '002845.XSHE', '002846.XSHE', '002847.XSHE', '002848.XSHE', '002849.XSHE', '002850.XSHE', '002851.XSHE', '002852.XSHE', '002853.XSHE', '002855.XSHE', '002856.XSHE', '002857.XSHE', '002858.XSHE', '002859.XSHE', '002860.XSHE', '002861.XSHE', '002862.XSHE', '002863.XSHE', '002864.XSHE', '002865.XSHE', '002866.XSHE', '002867.XSHE', '002868.XSHE', '002869.XSHE', '002870.XSHE', '002871.XSHE', '002872.XSHE', '002873.XSHE', '002875.XSHE', '002876.XSHE', '002877.XSHE', '002878.XSHE', '002879.XSHE', '002880.XSHE', '002881.XSHE', '002882.XSHE', '002883.XSHE', '002884.XSHE', '002885.XSHE', '002886.XSHE', '002887.XSHE', '002888.XSHE', '002889.XSHE', '002890.XSHE', '002891.XSHE', '002892.XSHE', '002893.XSHE', '002895.XSHE', '002896.XSHE', '002897.XSHE', '002898.XSHE', '002899.XSHE', '002900.XSHE', '002901.XSHE', '002902.XSHE', '002903.XSHE', '002905.XSHE', '002906.XSHE', '002907.XSHE', '002908.XSHE', '002909.XSHE', '002910.XSHE', '002911.XSHE', '002912.XSHE', '002913.XSHE', '002915.XSHE', '002916.XSHE', '002917.XSHE', '002918.XSHE', '002919.XSHE', '002920.XSHE', '002921.XSHE', '002922.XSHE', '002923.XSHE', '002925.XSHE', '002926.XSHE', '002927.XSHE', '002928.XSHE', '002929.XSHE', '002930.XSHE', '002931.XSHE', '002932.XSHE', '002933.XSHE', '002935.XSHE', '002936.XSHE', '002937.XSHE', '002938.XSHE', '002939.XSHE', '002940.XSHE', '002941.XSHE', '002942.XSHE', '002943.XSHE', '002945.XSHE', '002946.XSHE', '002947.XSHE', '002948.XSHE', '002949.XSHE', '002950.XSHE', '002951.XSHE', '002952.XSHE', '002953.XSHE', '002955.XSHE', '002956.XSHE', '002957.XSHE', '002958.XSHE', '002959.XSHE', '002960.XSHE', '002961.XSHE', '002962.XSHE', '002963.XSHE', '002965.XSHE', '002966.XSHE', '002967.XSHE', '002968.XSHE', '002969.XSHE', '002970.XSHE', '002971.XSHE', '002972.XSHE', '002973.XSHE', '002975.XSHE', '002976.XSHE', '002977.XSHE', '002978.XSHE', '002979.XSHE', '002980.XSHE', '002981.XSHE', '002982.XSHE', '002983.XSHE', '002984.XSHE', '002985.XSHE', '002986.XSHE', '002987.XSHE', '002988.XSHE', '002989.XSHE', '002990.XSHE', '002991.XSHE', '002992.XSHE', '002993.XSHE', '002995.XSHE', '002996.XSHE', '002997.XSHE', '002998.XSHE', '002999.XSHE', '003000.XSHE', '003001.XSHE', '003002.XSHE', '003003.XSHE', '003004.XSHE', '003005.XSHE', '003006.XSHE', '003007.XSHE', '003008.XSHE', '003009.XSHE', '003010.XSHE', '003011.XSHE', '003012.XSHE', '003013.XSHE', '003015.XSHE', '003016.XSHE', '003017.XSHE', '003018.XSHE', '003019.XSHE', '003020.XSHE', '003021.XSHE', '003022.XSHE', '003023.XSHE', '003025.XSHE', '003026.XSHE', '003027.XSHE', '003028.XSHE', '003029.XSHE', '003030.XSHE', '003031.XSHE', '003032.XSHE', '003033.XSHE', '003035.XSHE', '003036.XSHE', '003037.XSHE', '003038.XSHE', '003039.XSHE', '003040.XSHE', '003041.XSHE', '003042.XSHE', '003043.XSHE', '003816.XSHE', '300001.XSHE', '300002.XSHE', '300003.XSHE', '300004.XSHE', '300005.XSHE', '300006.XSHE', '300007.XSHE', '300008.XSHE', '300009.XSHE', '300010.XSHE', '300011.XSHE', '300012.XSHE', '300013.XSHE', '300014.XSHE', '300015.XSHE', '300016.XSHE', '300017.XSHE', '300018.XSHE', '300019.XSHE', '300020.XSHE', '300021.XSHE', '300022.XSHE', '300023.XSHE', '300024.XSHE', '300025.XSHE', '300026.XSHE', '300027.XSHE', '300028.XSHE', '300029.XSHE', '300030.XSHE', '300031.XSHE', '300032.XSHE', '300033.XSHE', '300034.XSHE', '300035.XSHE', '300036.XSHE', '300037.XSHE', '300038.XSHE', '300039.XSHE', '300040.XSHE', '300041.XSHE', '300042.XSHE', '300043.XSHE', '300044.XSHE', '300045.XSHE', '300046.XSHE', '300047.XSHE', '300048.XSHE', '300049.XSHE', '300050.XSHE', '300051.XSHE', '300052.XSHE', '300053.XSHE', '300054.XSHE', '300055.XSHE', '300056.XSHE', '300057.XSHE', '300058.XSHE', '300059.XSHE', '300061.XSHE', '300062.XSHE', '300063.XSHE', '300064.XSHE', '300065.XSHE', '300066.XSHE', '300067.XSHE', '300068.XSHE', '300069.XSHE', '300070.XSHE', '300071.XSHE', '300072.XSHE', '300073.XSHE', '300074.XSHE', '300075.XSHE', '300076.XSHE', '300077.XSHE', '300078.XSHE', '300079.XSHE', '300080.XSHE', '300081.XSHE', '300082.XSHE', '300083.XSHE', '300084.XSHE', '300085.XSHE', '300086.XSHE', '300087.XSHE', '300088.XSHE', '300089.XSHE', '300090.XSHE', '300091.XSHE', '300092.XSHE', '300093.XSHE', '300094.XSHE', '300095.XSHE', '300096.XSHE', '300097.XSHE', '300098.XSHE', '300099.XSHE', '300100.XSHE', '300101.XSHE', '300102.XSHE', '300103.XSHE', '300104.XSHE', '300105.XSHE', '300106.XSHE', '300107.XSHE', '300108.XSHE', '300109.XSHE', '300110.XSHE', '300111.XSHE', '300112.XSHE', '300113.XSHE', '300114.XSHE', '300115.XSHE', '300116.XSHE', '300117.XSHE', '300118.XSHE', '300119.XSHE', '300120.XSHE', '300121.XSHE', '300122.XSHE', '300123.XSHE', '300124.XSHE', '300125.XSHE', '300126.XSHE', '300127.XSHE', '300128.XSHE', '300129.XSHE', '300130.XSHE', '300131.XSHE', '300132.XSHE', '300133.XSHE', '300134.XSHE', '300135.XSHE', '300136.XSHE', '300137.XSHE', '300138.XSHE', '300139.XSHE', '300140.XSHE', '300141.XSHE', '300142.XSHE', '300143.XSHE', '300144.XSHE', '300145.XSHE', '300146.XSHE', '300147.XSHE', '300148.XSHE', '300149.XSHE', '300150.XSHE', '300151.XSHE', '300152.XSHE', '300153.XSHE', '300154.XSHE', '300155.XSHE', '300156.XSHE', '300157.XSHE', '300158.XSHE', '300159.XSHE', '300160.XSHE', '300161.XSHE', '300162.XSHE', '300163.XSHE', '300164.XSHE', '300165.XSHE', '300166.XSHE', '300167.XSHE', '300168.XSHE', '300169.XSHE', '300170.XSHE', '300171.XSHE', '300172.XSHE', '300173.XSHE', '300174.XSHE', '300175.XSHE', '300176.XSHE', '300177.XSHE', '300178.XSHE', '300179.XSHE', '300180.XSHE', '300181.XSHE', '300182.XSHE', '300183.XSHE', '300184.XSHE', '300185.XSHE', '300186.XSHE', '300187.XSHE', '300188.XSHE', '300189.XSHE', '300190.XSHE', '300191.XSHE', '300192.XSHE', '300193.XSHE', '300194.XSHE', '300195.XSHE', '300196.XSHE', '300197.XSHE', '300198.XSHE', '300199.XSHE', '300200.XSHE', '300201.XSHE', '300202.XSHE', '300203.XSHE', '300204.XSHE', '300205.XSHE', '300206.XSHE', '300207.XSHE', '300208.XSHE', '300209.XSHE', '300210.XSHE', '300211.XSHE', '300212.XSHE', '300213.XSHE', '300214.XSHE', '300215.XSHE', '300216.XSHE', '300217.XSHE', '300218.XSHE', '300219.XSHE', '300220.XSHE', '300221.XSHE', '300222.XSHE', '300223.XSHE', '300224.XSHE', '300225.XSHE', '300226.XSHE', '300227.XSHE', '300228.XSHE', '300229.XSHE', '300230.XSHE', '300231.XSHE', '300232.XSHE', '300233.XSHE', '300234.XSHE', '300235.XSHE', '300236.XSHE', '300237.XSHE', '300238.XSHE', '300239.XSHE', '300240.XSHE', '300241.XSHE', '300242.XSHE', '300243.XSHE', '300244.XSHE', '300245.XSHE', '300246.XSHE', '300247.XSHE', '300248.XSHE', '300249.XSHE', '300250.XSHE', '300251.XSHE', '300252.XSHE', '300253.XSHE', '300254.XSHE', '300255.XSHE', '300256.XSHE', '300257.XSHE', '300258.XSHE', '300259.XSHE', '300260.XSHE', '300261.XSHE', '300262.XSHE', '300263.XSHE', '300264.XSHE', '300265.XSHE', '300266.XSHE', '300267.XSHE', '300268.XSHE', '300269.XSHE', '300270.XSHE', '300271.XSHE', '300272.XSHE', '300273.XSHE', '300274.XSHE', '300275.XSHE', '300276.XSHE', '300277.XSHE', '300278.XSHE', '300279.XSHE', '300280.XSHE', '300281.XSHE', '300282.XSHE', '300283.XSHE', '300284.XSHE', '300285.XSHE', '300286.XSHE', '300287.XSHE', '300288.XSHE', '300289.XSHE', '300290.XSHE', '300291.XSHE', '300292.XSHE', '300293.XSHE', '300294.XSHE', '300295.XSHE', '300296.XSHE', '300297.XSHE', '300298.XSHE', '300299.XSHE', '300300.XSHE', '300301.XSHE', '300302.XSHE', '300303.XSHE', '300304.XSHE', '300305.XSHE', '300306.XSHE', '300307.XSHE', '300308.XSHE', '300309.XSHE', '300310.XSHE', '300311.XSHE', '300312.XSHE', '300313.XSHE', '300314.XSHE', '300315.XSHE', '300316.XSHE', '300317.XSHE', '300318.XSHE', '300319.XSHE', '300320.XSHE', '300321.XSHE', '300322.XSHE', '300323.XSHE', '300324.XSHE', '300325.XSHE', '300326.XSHE', '300327.XSHE', '300328.XSHE', '300329.XSHE', '300330.XSHE', '300331.XSHE', '300332.XSHE', '300333.XSHE', '300334.XSHE', '300335.XSHE', '300336.XSHE', '300337.XSHE', '300338.XSHE', '300339.XSHE', '300340.XSHE', '300341.XSHE', '300342.XSHE', '300343.XSHE', '300344.XSHE', '300345.XSHE', '300346.XSHE', '300347.XSHE', '300348.XSHE', '300349.XSHE', '300350.XSHE', '300351.XSHE', '300352.XSHE', '300353.XSHE', '300354.XSHE', '300355.XSHE', '300356.XSHE', '300357.XSHE', '300358.XSHE', '300359.XSHE', '300360.XSHE', '300362.XSHE', '300363.XSHE', '300364.XSHE', '300365.XSHE', '300366.XSHE', '300367.XSHE', '300368.XSHE', '300369.XSHE', '300370.XSHE', '300371.XSHE', '300372.XSHE', '300373.XSHE', '300374.XSHE', '300375.XSHE', '300376.XSHE', '300377.XSHE', '300378.XSHE', '300379.XSHE', '300380.XSHE', '300381.XSHE', '300382.XSHE', '300383.XSHE', '300384.XSHE', '300385.XSHE', '300386.XSHE', '300387.XSHE', '300388.XSHE', '300389.XSHE', '300390.XSHE', '300391.XSHE', '300392.XSHE', '300393.XSHE', '300394.XSHE', '300395.XSHE', '300396.XSHE', '300397.XSHE', '300398.XSHE', '300399.XSHE', '300400.XSHE', '300401.XSHE', '300402.XSHE', '300403.XSHE', '300404.XSHE', '300405.XSHE', '300406.XSHE', '300407.XSHE', '300408.XSHE', '300409.XSHE', '300410.XSHE', '300411.XSHE', '300412.XSHE', '300413.XSHE', '300414.XSHE', '300415.XSHE', '300416.XSHE', '300417.XSHE', '300418.XSHE', '300419.XSHE', '300420.XSHE', '300421.XSHE', '300422.XSHE', '300423.XSHE', '300424.XSHE', '300425.XSHE', '300426.XSHE', '300427.XSHE', '300428.XSHE', '300429.XSHE', '300430.XSHE', '300431.XSHE', '300432.XSHE', '300433.XSHE', '300434.XSHE', '300435.XSHE', '300436.XSHE', '300437.XSHE', '300438.XSHE', '300439.XSHE', '300440.XSHE', '300441.XSHE', '300442.XSHE', '300443.XSHE', '300444.XSHE', '300445.XSHE', '300446.XSHE', '300447.XSHE', '300448.XSHE', '300449.XSHE', '300450.XSHE', '300451.XSHE', '300452.XSHE', '300453.XSHE', '300454.XSHE', '300455.XSHE', '300456.XSHE', '300457.XSHE', '300458.XSHE', '300459.XSHE', '300460.XSHE', '300461.XSHE', '300462.XSHE', '300463.XSHE', '300464.XSHE', '300465.XSHE', '300466.XSHE', '300467.XSHE', '300468.XSHE', '300469.XSHE', '300470.XSHE', '300471.XSHE', '300472.XSHE', '300473.XSHE', '300474.XSHE', '300475.XSHE', '300476.XSHE', '300477.XSHE', '300478.XSHE', '300479.XSHE', '300480.XSHE', '300481.XSHE', '300482.XSHE', '300483.XSHE', '300484.XSHE', '300485.XSHE', '300486.XSHE', '300487.XSHE', '300488.XSHE', '300489.XSHE', '300490.XSHE', '300491.XSHE', '300492.XSHE', '300493.XSHE', '300494.XSHE', '300495.XSHE', '300496.XSHE', '300497.XSHE', '300498.XSHE', '300499.XSHE', '300500.XSHE', '300501.XSHE', '300502.XSHE', '300503.XSHE', '300504.XSHE', '300505.XSHE', '300506.XSHE', '300507.XSHE', '300508.XSHE', '300509.XSHE', '300510.XSHE', '300511.XSHE', '300512.XSHE', '300513.XSHE', '300514.XSHE', '300515.XSHE', '300516.XSHE', '300517.XSHE', '300518.XSHE', '300519.XSHE', '300520.XSHE', '300521.XSHE', '300522.XSHE', '300523.XSHE', '300525.XSHE', '300526.XSHE', '300527.XSHE', '300528.XSHE', '300529.XSHE', '300530.XSHE', '300531.XSHE', '300532.XSHE', '300533.XSHE', '300534.XSHE', '300535.XSHE', '300536.XSHE', '300537.XSHE', '300538.XSHE', '300539.XSHE', '300540.XSHE', '300541.XSHE', '300542.XSHE', '300543.XSHE', '300545.XSHE', '300546.XSHE', '300547.XSHE', '300548.XSHE', '300549.XSHE', '300550.XSHE', '300551.XSHE', '300552.XSHE', '300553.XSHE', '300554.XSHE', '300555.XSHE', '300556.XSHE', '300557.XSHE', '300558.XSHE', '300559.XSHE', '300560.XSHE', '300561.XSHE', '300562.XSHE', '300563.XSHE', '300564.XSHE', '300565.XSHE', '300566.XSHE', '300567.XSHE', '300568.XSHE', '300569.XSHE', '300570.XSHE', '300571.XSHE', '300572.XSHE', '300573.XSHE', '300575.XSHE', '300576.XSHE', '300577.XSHE', '300578.XSHE', '300579.XSHE', '300580.XSHE', '300581.XSHE', '300582.XSHE', '300583.XSHE', '300584.XSHE', '300585.XSHE', '300586.XSHE', '300587.XSHE', '300588.XSHE', '300589.XSHE', '300590.XSHE', '300591.XSHE', '300592.XSHE', '300593.XSHE', '300594.XSHE', '300595.XSHE', '300596.XSHE', '300597.XSHE', '300598.XSHE', '300599.XSHE', '300600.XSHE', '300601.XSHE', '300602.XSHE', '300603.XSHE', '300604.XSHE', '300605.XSHE', '300606.XSHE', '300607.XSHE', '300608.XSHE', '300609.XSHE', '300610.XSHE', '300611.XSHE', '300612.XSHE', '300613.XSHE', '300614.XSHE', '300615.XSHE', '300616.XSHE', '300617.XSHE', '300618.XSHE', '300619.XSHE', '300620.XSHE', '300621.XSHE', '300622.XSHE', '300623.XSHE', '300624.XSHE', '300625.XSHE', '300626.XSHE', '300627.XSHE', '300628.XSHE', '300629.XSHE', '300630.XSHE', '300631.XSHE', '300632.XSHE', '300633.XSHE', '300634.XSHE', '300635.XSHE', '300636.XSHE', '300637.XSHE', '300638.XSHE', '300639.XSHE', '300640.XSHE', '300641.XSHE', '300642.XSHE', '300643.XSHE', '300644.XSHE', '300645.XSHE', '300647.XSHE', '300648.XSHE', '300649.XSHE', '300650.XSHE', '300651.XSHE', '300652.XSHE', '300653.XSHE', '300654.XSHE', '300655.XSHE', '300656.XSHE', '300657.XSHE', '300658.XSHE', '300659.XSHE', '300660.XSHE', '300661.XSHE', '300662.XSHE', '300663.XSHE', '300664.XSHE', '300665.XSHE', '300666.XSHE', '300667.XSHE', '300668.XSHE', '300669.XSHE', '300670.XSHE', '300671.XSHE', '300672.XSHE', '300673.XSHE', '300674.XSHE', '300675.XSHE', '300676.XSHE', '300677.XSHE', '300678.XSHE', '300679.XSHE', '300680.XSHE', '300681.XSHE', '300682.XSHE', '300683.XSHE', '300684.XSHE', '300685.XSHE', '300686.XSHE', '300687.XSHE', '300688.XSHE', '300689.XSHE', '300690.XSHE', '300691.XSHE', '300692.XSHE', '300693.XSHE', '300694.XSHE', '300695.XSHE', '300696.XSHE', '300697.XSHE', '300698.XSHE', '300699.XSHE', '300700.XSHE', '300701.XSHE', '300702.XSHE', '300703.XSHE', '300705.XSHE', '300706.XSHE', '300707.XSHE', '300708.XSHE', '300709.XSHE', '300710.XSHE', '300711.XSHE', '300712.XSHE', '300713.XSHE', '300715.XSHE', '300716.XSHE', '300717.XSHE', '300718.XSHE', '300719.XSHE', '300720.XSHE', '300721.XSHE', '300722.XSHE', '300723.XSHE', '300724.XSHE', '300725.XSHE', '300726.XSHE', '300727.XSHE', '300729.XSHE', '300730.XSHE', '300731.XSHE', '300732.XSHE', '300733.XSHE', '300735.XSHE', '300736.XSHE', '300737.XSHE', '300738.XSHE', '300739.XSHE', '300740.XSHE', '300741.XSHE', '300742.XSHE', '300743.XSHE', '300745.XSHE', '300746.XSHE', '300747.XSHE', '300748.XSHE', '300749.XSHE', '300750.XSHE', '300751.XSHE', '300752.XSHE', '300753.XSHE', '300755.XSHE', '300756.XSHE', '300757.XSHE', '300758.XSHE', '300759.XSHE', '300760.XSHE', '300761.XSHE', '300762.XSHE', '300763.XSHE', '300765.XSHE', '300766.XSHE', '300767.XSHE', '300768.XSHE', '300769.XSHE', '300770.XSHE', '300771.XSHE', '300772.XSHE', '300773.XSHE', '300774.XSHE', '300775.XSHE', '300776.XSHE', '300777.XSHE', '300778.XSHE', '300779.XSHE', '300780.XSHE', '300781.XSHE', '300782.XSHE', '300783.XSHE', '300784.XSHE', '300785.XSHE', '300786.XSHE', '300787.XSHE', '300788.XSHE', '300789.XSHE', '300790.XSHE', '300791.XSHE', '300792.XSHE', '300793.XSHE', '300795.XSHE', '300796.XSHE', '300797.XSHE', '300798.XSHE', '300799.XSHE', '300800.XSHE', '300801.XSHE', '300802.XSHE', '300803.XSHE', '300804.XSHE', '300805.XSHE', '300806.XSHE', '300807.XSHE', '300808.XSHE', '300809.XSHE', '300810.XSHE', '300811.XSHE', '300812.XSHE', '300813.XSHE', '300814.XSHE', '300815.XSHE', '300816.XSHE', '300817.XSHE', '300818.XSHE', '300819.XSHE', '300820.XSHE', '300821.XSHE', '300822.XSHE', '300823.XSHE', '300824.XSHE', '300825.XSHE', '300826.XSHE', '300827.XSHE', '300828.XSHE', '300829.XSHE', '300830.XSHE', '300831.XSHE', '300832.XSHE', '300833.XSHE', '300834.XSHE', '300835.XSHE', '300836.XSHE', '300837.XSHE', '300838.XSHE', '300839.XSHE', '300840.XSHE', '300841.XSHE', '300842.XSHE', '300843.XSHE', '300844.XSHE', '300845.XSHE', '300846.XSHE', '300847.XSHE', '300848.XSHE', '300849.XSHE', '300850.XSHE', '300851.XSHE', '300852.XSHE', '300853.XSHE', '300854.XSHE', '300855.XSHE', '300856.XSHE', '300857.XSHE', '300858.XSHE', '300859.XSHE', '300860.XSHE', '300861.XSHE', '300862.XSHE', '300863.XSHE', '300864.XSHE', '300865.XSHE', '300866.XSHE', '300867.XSHE', '300868.XSHE', '300869.XSHE', '300870.XSHE', '300871.XSHE', '300872.XSHE', '300873.XSHE', '300875.XSHE', '300876.XSHE', '300877.XSHE', '300878.XSHE', '300879.XSHE', '300880.XSHE', '300881.XSHE', '300882.XSHE', '300883.XSHE', '300884.XSHE', '300885.XSHE', '300886.XSHE', '300887.XSHE', '300888.XSHE', '300889.XSHE', '300890.XSHE', '300891.XSHE', '300892.XSHE', '300893.XSHE', '300894.XSHE', '300895.XSHE', '300896.XSHE', '300897.XSHE', '300898.XSHE', '300899.XSHE', '300900.XSHE', '300901.XSHE', '300902.XSHE', '300903.XSHE', '300904.XSHE', '300905.XSHE', '300906.XSHE', '300907.XSHE', '300908.XSHE', '300909.XSHE', '300910.XSHE', '300911.XSHE', '300912.XSHE', '300913.XSHE', '300915.XSHE', '300916.XSHE', '300917.XSHE', '300918.XSHE', '300919.XSHE', '300920.XSHE', '300921.XSHE', '300922.XSHE', '300923.XSHE', '300925.XSHE', '300926.XSHE', '300927.XSHE', '300928.XSHE', '300929.XSHE', '300930.XSHE', '300931.XSHE', '300932.XSHE', '300933.XSHE', '300935.XSHE', '300936.XSHE', '300937.XSHE', '300938.XSHE', '300939.XSHE', '300940.XSHE', '300941.XSHE', '300942.XSHE', '300943.XSHE', '300945.XSHE', '300946.XSHE', '300947.XSHE', '300948.XSHE', '300949.XSHE', '300950.XSHE', '300951.XSHE', '300952.XSHE', '300953.XSHE', '300955.XSHE', '300956.XSHE', '300957.XSHE', '300958.XSHE', '300959.XSHE', '300960.XSHE', '300961.XSHE', '300962.XSHE', '300963.XSHE', '300964.XSHE', '300965.XSHE', '300966.XSHE', '300967.XSHE', '300968.XSHE', '300969.XSHE', '300970.XSHE', '300971.XSHE', '300972.XSHE', '300973.XSHE', '300975.XSHE', '300976.XSHE', '300977.XSHE', '300978.XSHE', '300979.XSHE', '300980.XSHE', '300981.XSHE', '300982.XSHE', '300983.XSHE', '300984.XSHE', '300985.XSHE', '300986.XSHE', '300987.XSHE', '300988.XSHE', '300989.XSHE', '300990.XSHE', '300991.XSHE', '300992.XSHE', '300993.XSHE', '300994.XSHE', '300995.XSHE', '300996.XSHE', '300997.XSHE', '300998.XSHE', '300999.XSHE', '301000.XSHE', '301001.XSHE', '301002.XSHE', '301003.XSHE', '301004.XSHE', '301005.XSHE', '301006.XSHE', '301007.XSHE', '301008.XSHE', '301009.XSHE', '301010.XSHE', '301011.XSHE', '301012.XSHE', '301013.XSHE', '301015.XSHE', '301016.XSHE', '301017.XSHE', '301018.XSHE', '301019.XSHE', '301020.XSHE', '301021.XSHE', '301022.XSHE', '301023.XSHE', '301024.XSHE', '301025.XSHE', '301026.XSHE', '301027.XSHE', '301028.XSHE', '301029.XSHE', '301030.XSHE', '301031.XSHE', '301032.XSHE', '301033.XSHE', '301035.XSHE', '301036.XSHE', '301037.XSHE', '301038.XSHE', '301039.XSHE', '301040.XSHE', '301041.XSHE', '301042.XSHE', '301043.XSHE', '301045.XSHE', '301046.XSHE', '301047.XSHE', '301048.XSHE', '301049.XSHE', '301050.XSHE', '301051.XSHE', '301052.XSHE', '301053.XSHE', '301055.XSHE', '301056.XSHE', '301057.XSHE', '301058.XSHE', '301059.XSHE', '301060.XSHE', '301061.XSHE', '301062.XSHE', '301063.XSHE', '301065.XSHE', '301066.XSHE', '301067.XSHE', '301068.XSHE', '301069.XSHE', '301070.XSHE', '301071.XSHE', '301072.XSHE', '301073.XSHE', '301075.XSHE', '301076.XSHE', '301077.XSHE', '301078.XSHE', '301079.XSHE', '301080.XSHE', '301081.XSHE', '301082.XSHE', '301083.XSHE', '301085.XSHE', '301086.XSHE', '301087.XSHE', '301088.XSHE', '301089.XSHE', '301090.XSHE', '301091.XSHE', '301092.XSHE', '301093.XSHE', '301095.XSHE', '301096.XSHE', '301097.XSHE', '301098.XSHE', '301099.XSHE', '301100.XSHE', '301101.XSHE', '301102.XSHE', '301103.XSHE', '301105.XSHE', '301106.XSHE', '301107.XSHE', '301108.XSHE', '301109.XSHE', '301110.XSHE', '301111.XSHE', '301112.XSHE', '301113.XSHE', '301115.XSHE', '301116.XSHE', '301117.XSHE', '301118.XSHE', '301119.XSHE', '301120.XSHE', '301121.XSHE', '301122.XSHE', '301123.XSHE', '301125.XSHE', '301126.XSHE', '301127.XSHE', '301128.XSHE', '301129.XSHE', '301130.XSHE', '301131.XSHE', '301132.XSHE', '301133.XSHE', '301135.XSHE', '301136.XSHE', '301137.XSHE', '301138.XSHE', '301139.XSHE', '301141.XSHE', '301148.XSHE', '301149.XSHE', '301150.XSHE', '301151.XSHE', '301152.XSHE', '301153.XSHE', '301155.XSHE', '301156.XSHE', '301157.XSHE', '301158.XSHE', '301159.XSHE', '301160.XSHE', '301161.XSHE', '301162.XSHE', '301163.XSHE', '301165.XSHE', '301166.XSHE', '301167.XSHE', '301168.XSHE', '301169.XSHE', '301170.XSHE', '301171.XSHE', '301172.XSHE', '301175.XSHE', '301176.XSHE', '301177.XSHE', '301178.XSHE', '301179.XSHE', '301180.XSHE', '301181.XSHE', '301182.XSHE', '301183.XSHE', '301185.XSHE', '301186.XSHE', '301187.XSHE', '301188.XSHE', '301189.XSHE', '301190.XSHE', '301191.XSHE', '301192.XSHE', '301193.XSHE', '301195.XSHE', '301196.XSHE', '301197.XSHE', '301198.XSHE', '301199.XSHE', '301200.XSHE', '301201.XSHE', '301202.XSHE', '301203.XSHE', '301205.XSHE', '301206.XSHE', '301207.XSHE', '301208.XSHE', '301209.XSHE', '301210.XSHE', '301211.XSHE', '301212.XSHE', '301213.XSHE', '301215.XSHE', '301216.XSHE', '301217.XSHE', '301218.XSHE', '301219.XSHE', '301220.XSHE', '301221.XSHE', '301222.XSHE', '301223.XSHE', '301225.XSHE', '301226.XSHE', '301227.XSHE', '301228.XSHE', '301229.XSHE', '301230.XSHE', '301231.XSHE', '301232.XSHE', '301233.XSHE', '301234.XSHE', '301235.XSHE', '301236.XSHE', '301237.XSHE', '301238.XSHE', '301239.XSHE', '301246.XSHE', '301248.XSHE', '301251.XSHE', '301252.XSHE', '301255.XSHE', '301256.XSHE', '301257.XSHE', '301258.XSHE', '301259.XSHE', '301260.XSHE', '301261.XSHE', '301262.XSHE', '301263.XSHE', '301265.XSHE', '301266.XSHE', '301267.XSHE', '301268.XSHE', '301269.XSHE', '301270.XSHE', '301272.XSHE', '301273.XSHE', '301276.XSHE', '301277.XSHE', '301278.XSHE', '301279.XSHE', '301280.XSHE', '301281.XSHE', '301282.XSHE', '301283.XSHE', '301285.XSHE', '301286.XSHE', '301287.XSHE', '301288.XSHE', '301289.XSHE', '301290.XSHE', '301291.XSHE', '301292.XSHE', '301293.XSHE', '301295.XSHE', '301296.XSHE', '301297.XSHE', '301298.XSHE', '301299.XSHE', '301300.XSHE', '301301.XSHE', '301302.XSHE', '301303.XSHE', '301305.XSHE', '301306.XSHE', '301307.XSHE', '301308.XSHE', '301309.XSHE', '301310.XSHE', '301311.XSHE', '301312.XSHE', '301313.XSHE', '301314.XSHE', '301315.XSHE', '301316.XSHE', '301317.XSHE', '301318.XSHE', '301319.XSHE', '301320.XSHE', '301321.XSHE', '301322.XSHE', '301323.XSHE', '301325.XSHE', '301326.XSHE', '301327.XSHE', '301328.XSHE', '301329.XSHE', '301330.XSHE', '301331.XSHE', '301332.XSHE', '301333.XSHE', '301335.XSHE', '301336.XSHE', '301337.XSHE', '301338.XSHE', '301339.XSHE', '301345.XSHE', '301348.XSHE', '301349.XSHE', '301353.XSHE', '301355.XSHE', '301356.XSHE', '301357.XSHE', '301358.XSHE', '301359.XSHE', '301360.XSHE', '301361.XSHE', '301362.XSHE', '301363.XSHE', '301365.XSHE', '301366.XSHE', '301367.XSHE', '301368.XSHE', '301369.XSHE', '301370.XSHE', '301371.XSHE', '301372.XSHE', '301373.XSHE', '301376.XSHE', '301377.XSHE', '301378.XSHE', '301379.XSHE', '301380.XSHE', '301381.XSHE', '301382.XSHE', '301383.XSHE', '301386.XSHE', '301387.XSHE', '301388.XSHE', '301389.XSHE', '301390.XSHE', '301391.XSHE', '301392.XSHE', '301393.XSHE', '301395.XSHE', '301396.XSHE', '301397.XSHE', '301398.XSHE', '301399.XSHE', '301408.XSHE', '301413.XSHE', '301418.XSHE', '301419.XSHE', '301421.XSHE', '301428.XSHE', '301429.XSHE', '301439.XSHE', '301446.XSHE', '301448.XSHE', '301456.XSHE', '301459.XSHE', '301468.XSHE', '301469.XSHE', '301486.XSHE', '301487.XSHE', '301488.XSHE', '301489.XSHE', '301498.XSHE', '301499.XSHE', '301500.XSHE', '301502.XSHE', '301503.XSHE', '301505.XSHE', '301507.XSHE', '301508.XSHE', '301509.XSHE', '301510.XSHE', '301511.XSHE', '301512.XSHE', '301515.XSHE', '301516.XSHE', '301517.XSHE', '301518.XSHE', '301519.XSHE', '301520.XSHE', '301525.XSHE', '301526.XSHE', '301528.XSHE', '301529.XSHE', '301533.XSHE', '301536.XSHE', '301538.XSHE', '301539.XSHE', '301548.XSHE', '301550.XSHE', '301552.XSHE', '301555.XSHE', '301558.XSHE', '301559.XSHE', '301565.XSHE', '301566.XSHE', '301567.XSHE', '301568.XSHE', '301571.XSHE', '301577.XSHE', '301578.XSHE', '301580.XSHE', '301587.XSHE', '301588.XSHE', '301589.XSHE', '301591.XSHE', '301596.XSHE', '301603.XSHE', '301606.XSHE', '301608.XSHE', '301611.XSHE', '600000.XSHG', '600001.XSHG', '600002.XSHG', '600003.XSHG', '600004.XSHG', '600005.XSHG', '600006.XSHG', '600007.XSHG', '600008.XSHG', '600009.XSHG', '600010.XSHG', '600011.XSHG', '600012.XSHG', '600015.XSHG', '600016.XSHG', '600017.XSHG', '600018.XSHG', '600019.XSHG', '600020.XSHG', '600021.XSHG', '600022.XSHG', '600023.XSHG', '600025.XSHG', '600026.XSHG', '600027.XSHG', '600028.XSHG', '600029.XSHG', '600030.XSHG', '600031.XSHG', '600032.XSHG', '600033.XSHG', '600035.XSHG', '600036.XSHG', '600037.XSHG', '600038.XSHG', '600039.XSHG', '600048.XSHG', '600050.XSHG', '600051.XSHG', '600052.XSHG', '600053.XSHG', '600054.XSHG', '600055.XSHG', '600056.XSHG', '600057.XSHG', '600058.XSHG', '600059.XSHG', '600060.XSHG', '600061.XSHG', '600062.XSHG', '600063.XSHG', '600064.XSHG', '600065.XSHG', '600066.XSHG', '600067.XSHG', '600068.XSHG', '600069.XSHG', '600070.XSHG', '600071.XSHG', '600072.XSHG', '600073.XSHG', '600074.XSHG', '600075.XSHG', '600076.XSHG', '600077.XSHG', '600078.XSHG', '600079.XSHG', '600080.XSHG', '600081.XSHG', '600082.XSHG', '600083.XSHG', '600084.XSHG', '600085.XSHG', '600086.XSHG', '600087.XSHG', '600088.XSHG', '600089.XSHG', '600090.XSHG', '600091.XSHG', '600092.XSHG', '600093.XSHG', '600094.XSHG', '600095.XSHG', '600096.XSHG', '600097.XSHG', '600098.XSHG', '600099.XSHG', '600100.XSHG', '600101.XSHG', '600102.XSHG', '600103.XSHG', '600104.XSHG', '600105.XSHG', '600106.XSHG', '600107.XSHG', '600108.XSHG', '600109.XSHG', '600110.XSHG', '600111.XSHG', '600112.XSHG', '600113.XSHG', '600114.XSHG', '600115.XSHG', '600116.XSHG', '600117.XSHG', '600118.XSHG', '600119.XSHG', '600120.XSHG', '600121.XSHG', '600122.XSHG', '600123.XSHG', '600125.XSHG', '600126.XSHG', '600127.XSHG', '600128.XSHG', '600129.XSHG', '600130.XSHG', '600131.XSHG', '600132.XSHG', '600133.XSHG', '600135.XSHG', '600136.XSHG', '600137.XSHG', '600138.XSHG', '600139.XSHG', '600141.XSHG', '600143.XSHG', '600145.XSHG', '600146.XSHG', '600148.XSHG', '600149.XSHG', '600150.XSHG', '600151.XSHG', '600152.XSHG', '600153.XSHG', '600155.XSHG', '600156.XSHG', '600157.XSHG', '600158.XSHG', '600159.XSHG', '600160.XSHG', '600161.XSHG', '600162.XSHG', '600163.XSHG', '600165.XSHG', '600166.XSHG', '600167.XSHG', '600168.XSHG', '600169.XSHG', '600170.XSHG', '600171.XSHG', '600172.XSHG', '600173.XSHG', '600175.XSHG', '600176.XSHG', '600177.XSHG', '600178.XSHG', '600179.XSHG', '600180.XSHG', '600181.XSHG', '600182.XSHG', '600183.XSHG', '600184.XSHG', '600185.XSHG', '600186.XSHG', '600187.XSHG', '600188.XSHG', '600189.XSHG', '600190.XSHG', '600191.XSHG', '600192.XSHG', '600193.XSHG', '600195.XSHG', '600196.XSHG', '600197.XSHG', '600198.XSHG', '600199.XSHG', '600200.XSHG', '600201.XSHG', '600202.XSHG', '600203.XSHG', '600205.XSHG', '600206.XSHG', '600207.XSHG', '600208.XSHG', '600209.XSHG', '600210.XSHG', '600211.XSHG', '600212.XSHG', '600213.XSHG', '600215.XSHG', '600216.XSHG', '600217.XSHG', '600218.XSHG', '600219.XSHG', '600220.XSHG', '600221.XSHG', '600222.XSHG', '600223.XSHG', '600225.XSHG', '600226.XSHG', '600227.XSHG', '600228.XSHG', '600229.XSHG', '600230.XSHG', '600231.XSHG', '600232.XSHG', '600233.XSHG', '600234.XSHG', '600235.XSHG', '600236.XSHG', '600237.XSHG', '600238.XSHG', '600239.XSHG', '600240.XSHG', '600241.XSHG', '600242.XSHG', '600243.XSHG', '600246.XSHG', '600247.XSHG', '600248.XSHG', '600249.XSHG', '600250.XSHG', '600251.XSHG', '600252.XSHG', '600253.XSHG', '600255.XSHG', '600256.XSHG', '600257.XSHG', '600258.XSHG', '600259.XSHG', '600260.XSHG', '600261.XSHG', '600262.XSHG', '600263.XSHG', '600265.XSHG', '600266.XSHG', '600267.XSHG', '600268.XSHG', '600269.XSHG', '600270.XSHG', '600271.XSHG', '600272.XSHG', '600273.XSHG', '600275.XSHG', '600276.XSHG', '600277.XSHG', '600278.XSHG', '600279.XSHG', '600280.XSHG', '600281.XSHG', '600282.XSHG', '600283.XSHG', '600284.XSHG', '600285.XSHG', '600286.XSHG', '600287.XSHG', '600288.XSHG', '600289.XSHG', '600290.XSHG', '600291.XSHG', '600292.XSHG', '600293.XSHG', '600295.XSHG', '600296.XSHG', '600297.XSHG', '600298.XSHG', '600299.XSHG', '600300.XSHG', '600301.XSHG', '600302.XSHG', '600303.XSHG', '600305.XSHG', '600306.XSHG', '600307.XSHG', '600308.XSHG', '600309.XSHG', '600310.XSHG', '600311.XSHG', '600312.XSHG', '600313.XSHG', '600315.XSHG', '600316.XSHG', '600317.XSHG', '600318.XSHG', '600319.XSHG', '600320.XSHG', '600321.XSHG', '600322.XSHG', '600323.XSHG', '600325.XSHG', '600326.XSHG', '600327.XSHG', '600328.XSHG', '600329.XSHG', '600330.XSHG', '600331.XSHG', '600332.XSHG', '600333.XSHG', '600335.XSHG', '600336.XSHG', '600337.XSHG', '600338.XSHG', '600339.XSHG', '600340.XSHG', '600343.XSHG', '600345.XSHG', '600346.XSHG', '600348.XSHG', '600350.XSHG', '600351.XSHG', '600352.XSHG', '600353.XSHG', '600354.XSHG', '600355.XSHG', '600356.XSHG', '600357.XSHG', '600358.XSHG', '600359.XSHG', '600360.XSHG', '600361.XSHG', '600362.XSHG', '600363.XSHG', '600365.XSHG', '600366.XSHG', '600367.XSHG', '600368.XSHG', '600369.XSHG', '600370.XSHG', '600371.XSHG', '600372.XSHG', '600373.XSHG', '600375.XSHG', '600376.XSHG', '600377.XSHG', '600378.XSHG', '600379.XSHG', '600380.XSHG', '600381.XSHG', '600382.XSHG', '600383.XSHG', '600385.XSHG', '600386.XSHG', '600387.XSHG', '600388.XSHG', '600389.XSHG', '600390.XSHG', '600391.XSHG', '600392.XSHG', '600393.XSHG', '600395.XSHG', '600396.XSHG', '600397.XSHG', '600398.XSHG', '600399.XSHG', '600400.XSHG', '600401.XSHG', '600403.XSHG', '600405.XSHG', '600406.XSHG', '600408.XSHG', '600409.XSHG', '600410.XSHG', '600415.XSHG', '600416.XSHG', '600418.XSHG', '600419.XSHG', '600420.XSHG', '600421.XSHG', '600422.XSHG', '600423.XSHG', '600425.XSHG', '600426.XSHG', '600428.XSHG', '600429.XSHG', '600432.XSHG', '600433.XSHG', '600435.XSHG', '600436.XSHG', '600438.XSHG', '600439.XSHG', '600444.XSHG', '600446.XSHG', '600448.XSHG', '600449.XSHG', '600452.XSHG', '600455.XSHG', '600456.XSHG', '600458.XSHG', '600459.XSHG', '600460.XSHG', '600461.XSHG', '600462.XSHG', '600463.XSHG', '600466.XSHG', '600467.XSHG', '600468.XSHG', '600469.XSHG', '600470.XSHG', '600472.XSHG', '600475.XSHG', '600476.XSHG', '600477.XSHG', '600478.XSHG', '600479.XSHG', '600480.XSHG', '600481.XSHG', '600482.XSHG', '600483.XSHG', '600485.XSHG', '600486.XSHG', '600487.XSHG', '600488.XSHG', '600489.XSHG', '600490.XSHG', '600491.XSHG', '600493.XSHG', '600495.XSHG', '600496.XSHG', '600497.XSHG', '600498.XSHG', '600499.XSHG', '600500.XSHG', '600501.XSHG', '600502.XSHG', '600503.XSHG', '600505.XSHG', '600506.XSHG', '600507.XSHG', '600508.XSHG', '600509.XSHG', '600510.XSHG', '600511.XSHG', '600512.XSHG', '600513.XSHG', '600515.XSHG', '600516.XSHG', '600517.XSHG', '600518.XSHG', '600519.XSHG', '600520.XSHG', '600521.XSHG', '600522.XSHG', '600523.XSHG', '600525.XSHG', '600526.XSHG', '600527.XSHG', '600528.XSHG', '600529.XSHG', '600530.XSHG', '600531.XSHG', '600532.XSHG', '600533.XSHG', '600535.XSHG', '600536.XSHG', '600537.XSHG', '600538.XSHG', '600539.XSHG', '600540.XSHG', '600543.XSHG', '600545.XSHG', '600546.XSHG', '600547.XSHG', '600548.XSHG', '600549.XSHG', '600550.XSHG', '600551.XSHG', '600552.XSHG', '600553.XSHG', '600555.XSHG', '600556.XSHG', '600557.XSHG', '600558.XSHG', '600559.XSHG', '600560.XSHG', '600561.XSHG', '600562.XSHG', '600563.XSHG', '600565.XSHG', '600566.XSHG', '600567.XSHG', '600568.XSHG', '600569.XSHG', '600570.XSHG', '600571.XSHG', '600572.XSHG', '600573.XSHG', '600575.XSHG', '600576.XSHG', '600577.XSHG', '600578.XSHG', '600579.XSHG', '600580.XSHG', '600581.XSHG', '600582.XSHG', '600583.XSHG', '600584.XSHG', '600585.XSHG', '600586.XSHG', '600587.XSHG', '600588.XSHG', '600589.XSHG', '600590.XSHG', '600591.XSHG', '600592.XSHG', '600593.XSHG', '600594.XSHG', '600595.XSHG', '600596.XSHG', '600597.XSHG', '600598.XSHG', '600599.XSHG', '600600.XSHG', '600601.XSHG', '600602.XSHG', '600603.XSHG', '600604.XSHG', '600605.XSHG', '600606.XSHG', '600607.XSHG', '600608.XSHG', '600609.XSHG', '600610.XSHG', '600611.XSHG', '600612.XSHG', '600613.XSHG', '600614.XSHG', '600615.XSHG', '600616.XSHG', '600617.XSHG', '600618.XSHG', '600619.XSHG', '600620.XSHG', '600621.XSHG', '600622.XSHG', '600623.XSHG', '600624.XSHG', '600626.XSHG', '600627.XSHG', '600628.XSHG', '600629.XSHG', '600630.XSHG', '600631.XSHG', '600633.XSHG', '600634.XSHG', '600635.XSHG', '600636.XSHG', '600637.XSHG', '600638.XSHG', '600639.XSHG', '600640.XSHG', '600641.XSHG', '600642.XSHG', '600643.XSHG', '600644.XSHG', '600645.XSHG', '600647.XSHG', '600648.XSHG', '600649.XSHG', '600650.XSHG', '600651.XSHG', '600652.XSHG', '600653.XSHG', '600654.XSHG', '600655.XSHG', '600656.XSHG', '600657.XSHG', '600658.XSHG', '600659.XSHG', '600660.XSHG', '600661.XSHG', '600662.XSHG', '600663.XSHG', '600664.XSHG', '600665.XSHG', '600666.XSHG', '600667.XSHG', '600668.XSHG', '600671.XSHG', '600672.XSHG', '600673.XSHG', '600674.XSHG', '600675.XSHG', '600676.XSHG', '600677.XSHG', '600678.XSHG', '600679.XSHG', '600680.XSHG', '600681.XSHG', '600682.XSHG', '600683.XSHG', '600684.XSHG', '600685.XSHG', '600686.XSHG', '600687.XSHG', '600688.XSHG', '600689.XSHG', '600690.XSHG', '600691.XSHG', '600692.XSHG', '600693.XSHG', '600694.XSHG', '600695.XSHG', '600696.XSHG', '600697.XSHG', '600698.XSHG', '600699.XSHG', '600700.XSHG', '600701.XSHG', '600702.XSHG', '600703.XSHG', '600704.XSHG', '600705.XSHG', '600706.XSHG', '600707.XSHG', '600708.XSHG', '600710.XSHG', '600711.XSHG', '600712.XSHG', '600713.XSHG', '600714.XSHG', '600715.XSHG', '600716.XSHG', '600717.XSHG', '600718.XSHG', '600719.XSHG', '600720.XSHG', '600721.XSHG', '600722.XSHG', '600723.XSHG', '600724.XSHG', '600725.XSHG', '600726.XSHG', '600727.XSHG', '600728.XSHG', '600729.XSHG', '600730.XSHG', '600731.XSHG', '600732.XSHG', '600733.XSHG', '600734.XSHG', '600735.XSHG', '600736.XSHG', '600737.XSHG', '600738.XSHG', '600739.XSHG', '600740.XSHG', '600741.XSHG', '600742.XSHG', '600743.XSHG', '600744.XSHG', '600745.XSHG', '600746.XSHG', '600747.XSHG', '600748.XSHG', '600749.XSHG', '600750.XSHG', '600751.XSHG', '600752.XSHG', '600753.XSHG', '600754.XSHG', '600755.XSHG', '600756.XSHG', '600757.XSHG', '600758.XSHG', '600759.XSHG', '600760.XSHG', '600761.XSHG', '600762.XSHG', '600763.XSHG', '600764.XSHG', '600765.XSHG', '600766.XSHG', '600767.XSHG', '600768.XSHG', '600769.XSHG', '600770.XSHG', '600771.XSHG', '600772.XSHG', '600773.XSHG', '600774.XSHG', '600775.XSHG', '600776.XSHG', '600777.XSHG', '600778.XSHG', '600779.XSHG', '600780.XSHG', '600781.XSHG', '600782.XSHG', '600783.XSHG', '600784.XSHG', '600785.XSHG', '600786.XSHG', '600787.XSHG', '600788.XSHG', '600789.XSHG', '600790.XSHG', '600791.XSHG', '600792.XSHG', '600793.XSHG', '600794.XSHG', '600795.XSHG', '600796.XSHG', '600797.XSHG', '600798.XSHG', '600799.XSHG', '600800.XSHG', '600801.XSHG', '600802.XSHG', '600803.XSHG', '600804.XSHG', '600805.XSHG', '600806.XSHG', '600807.XSHG', '600808.XSHG', '600809.XSHG', '600810.XSHG', '600811.XSHG', '600812.XSHG', '600814.XSHG', '600815.XSHG', '600816.XSHG', '600817.XSHG', '600818.XSHG', '600819.XSHG', '600820.XSHG', '600821.XSHG', '600822.XSHG', '600823.XSHG', '600824.XSHG', '600825.XSHG', '600826.XSHG', '600827.XSHG', '600828.XSHG', '600829.XSHG', '600830.XSHG', '600831.XSHG', '600832.XSHG', '600833.XSHG', '600834.XSHG', '600835.XSHG', '600836.XSHG', '600837.XSHG', '600838.XSHG', '600839.XSHG', '600840.XSHG', '600841.XSHG', '600842.XSHG', '600843.XSHG', '600844.XSHG', '600845.XSHG', '600846.XSHG', '600847.XSHG', '600848.XSHG', '600849.XSHG', '600850.XSHG', '600851.XSHG', '600852.XSHG', '600853.XSHG', '600854.XSHG', '600855.XSHG', '600856.XSHG', '600857.XSHG', '600858.XSHG', '600859.XSHG', '600860.XSHG', '600861.XSHG', '600862.XSHG', '600863.XSHG', '600864.XSHG', '600865.XSHG', '600866.XSHG', '600867.XSHG', '600868.XSHG', '600869.XSHG', '600870.XSHG', '600871.XSHG', '600872.XSHG', '600873.XSHG', '600874.XSHG', '600875.XSHG', '600876.XSHG', '600877.XSHG', '600879.XSHG', '600880.XSHG', '600881.XSHG', '600882.XSHG', '600883.XSHG', '600884.XSHG', '600885.XSHG', '600886.XSHG', '600887.XSHG', '600888.XSHG', '600889.XSHG', '600890.XSHG', '600891.XSHG', '600892.XSHG', '600893.XSHG', '600894.XSHG', '600895.XSHG', '600896.XSHG', '600897.XSHG', '600898.XSHG', '600899.XSHG', '600900.XSHG', '600901.XSHG', '600903.XSHG', '600905.XSHG', '600906.XSHG', '600908.XSHG', '600909.XSHG', '600916.XSHG', '600917.XSHG', '600918.XSHG', '600919.XSHG', '600925.XSHG', '600926.XSHG', '600927.XSHG', '600928.XSHG', '600929.XSHG', '600933.XSHG', '600935.XSHG', '600936.XSHG', '600938.XSHG', '600939.XSHG', '600941.XSHG', '600955.XSHG', '600956.XSHG', '600958.XSHG', '600959.XSHG', '600960.XSHG', '600961.XSHG', '600962.XSHG', '600963.XSHG', '600965.XSHG', '600966.XSHG', '600967.XSHG', '600968.XSHG', '600969.XSHG', '600970.XSHG', '600971.XSHG', '600973.XSHG', '600975.XSHG', '600976.XSHG', '600977.XSHG', '600978.XSHG', '600979.XSHG', '600980.XSHG', '600981.XSHG', '600982.XSHG', '600983.XSHG', '600984.XSHG', '600985.XSHG', '600986.XSHG', '600987.XSHG', '600988.XSHG', '600989.XSHG', '600990.XSHG', '600991.XSHG', '600992.XSHG', '600993.XSHG', '600995.XSHG', '600996.XSHG', '600997.XSHG', '600998.XSHG', '600999.XSHG', '601000.XSHG', '601001.XSHG', '601002.XSHG', '601003.XSHG', '601005.XSHG', '601006.XSHG', '601007.XSHG', '601008.XSHG', '601009.XSHG', '601010.XSHG', '601011.XSHG', '601012.XSHG', '601015.XSHG', '601016.XSHG', '601018.XSHG', '601019.XSHG', '601020.XSHG', '601021.XSHG', '601022.XSHG', '601028.XSHG', '601033.XSHG', '601038.XSHG', '601058.XSHG', '601059.XSHG', '601061.XSHG', '601065.XSHG', '601066.XSHG', '601068.XSHG', '601069.XSHG', '601077.XSHG', '601083.XSHG', '601086.XSHG', '601088.XSHG', '601089.XSHG', '601096.XSHG', '601098.XSHG', '601099.XSHG', '601100.XSHG', '601101.XSHG', '601106.XSHG', '601107.XSHG', '601108.XSHG', '601111.XSHG', '601113.XSHG', '601116.XSHG', '601117.XSHG', '601118.XSHG', '601121.XSHG', '601126.XSHG', '601127.XSHG', '601128.XSHG', '601133.XSHG', '601136.XSHG', '601137.XSHG', '601138.XSHG', '601139.XSHG', '601155.XSHG', '601156.XSHG', '601158.XSHG', '601162.XSHG', '601163.XSHG', '601166.XSHG', '601168.XSHG', '601169.XSHG', '601177.XSHG', '601179.XSHG', '601186.XSHG', '601187.XSHG', '601188.XSHG', '601198.XSHG', '601199.XSHG', '601200.XSHG', '601208.XSHG', '601211.XSHG', '601212.XSHG', '601216.XSHG', '601218.XSHG', '601222.XSHG', '601225.XSHG', '601226.XSHG', '601228.XSHG', '601229.XSHG', '601231.XSHG', '601233.XSHG', '601236.XSHG', '601238.XSHG', '601258.XSHG', '601268.XSHG', '601279.XSHG', '601288.XSHG', '601298.XSHG', '601299.XSHG', '601311.XSHG', '601313.XSHG', '601318.XSHG', '601319.XSHG', '601326.XSHG', '601328.XSHG', '601330.XSHG', '601333.XSHG', '601336.XSHG', '601339.XSHG', '601360.XSHG', '601366.XSHG', '601368.XSHG', '601369.XSHG', '601375.XSHG', '601377.XSHG', '601388.XSHG', '601390.XSHG', '601398.XSHG', '601399.XSHG', '601456.XSHG', '601500.XSHG', '601512.XSHG', '601515.XSHG', '601518.XSHG', '601519.XSHG', '601528.XSHG', '601555.XSHG', '601558.XSHG', '601566.XSHG', '601567.XSHG', '601568.XSHG', '601577.XSHG', '601579.XSHG', '601588.XSHG', '601595.XSHG', '601598.XSHG', '601599.XSHG', '601600.XSHG', '601601.XSHG', '601606.XSHG', '601607.XSHG', '601608.XSHG', '601609.XSHG', '601611.XSHG', '601615.XSHG', '601616.XSHG', '601618.XSHG', '601619.XSHG', '601628.XSHG', '601633.XSHG', '601636.XSHG', '601658.XSHG', '601665.XSHG', '601666.XSHG', '601668.XSHG', '601669.XSHG', '601677.XSHG', '601678.XSHG', '601686.XSHG', '601688.XSHG', '601689.XSHG', '601696.XSHG', '601698.XSHG', '601699.XSHG', '601700.XSHG', '601702.XSHG', '601717.XSHG', '601718.XSHG', '601727.XSHG', '601728.XSHG', '601766.XSHG', '601777.XSHG', '601778.XSHG', '601788.XSHG', '601789.XSHG', '601798.XSHG', '601799.XSHG', '601800.XSHG', '601801.XSHG', '601808.XSHG', '601811.XSHG', '601816.XSHG', '601818.XSHG', '601825.XSHG', '601827.XSHG', '601828.XSHG', '601838.XSHG', '601857.XSHG', '601858.XSHG', '601860.XSHG', '601865.XSHG', '601866.XSHG', '601868.XSHG', '601869.XSHG', '601872.XSHG', '601877.XSHG', '601878.XSHG', '601880.XSHG', '601881.XSHG', '601882.XSHG', '601886.XSHG', '601888.XSHG', '601890.XSHG', '601898.XSHG', '601899.XSHG', '601900.XSHG', '601901.XSHG', '601908.XSHG', '601916.XSHG', '601918.XSHG', '601919.XSHG', '601921.XSHG', '601928.XSHG', '601929.XSHG', '601933.XSHG', '601939.XSHG', '601949.XSHG', '601952.XSHG', '601956.XSHG', '601958.XSHG', '601963.XSHG', '601965.XSHG', '601966.XSHG', '601968.XSHG', '601969.XSHG', '601975.XSHG', '601985.XSHG', '601988.XSHG', '601989.XSHG', '601990.XSHG', '601991.XSHG', '601992.XSHG', '601995.XSHG', '601996.XSHG', '601997.XSHG', '601998.XSHG', '601999.XSHG', '603000.XSHG', '603001.XSHG', '603002.XSHG', '603003.XSHG', '603004.XSHG', '603005.XSHG', '603006.XSHG', '603007.XSHG', '603008.XSHG', '603009.XSHG', '603010.XSHG', '603011.XSHG', '603012.XSHG', '603013.XSHG', '603015.XSHG', '603016.XSHG', '603017.XSHG', '603018.XSHG', '603019.XSHG', '603020.XSHG', '603021.XSHG', '603022.XSHG', '603023.XSHG', '603025.XSHG', '603026.XSHG', '603027.XSHG', '603028.XSHG', '603029.XSHG', '603030.XSHG', '603031.XSHG', '603032.XSHG', '603033.XSHG', '603035.XSHG', '603036.XSHG', '603037.XSHG', '603038.XSHG', '603039.XSHG', '603040.XSHG', '603041.XSHG', '603042.XSHG', '603043.XSHG', '603045.XSHG', '603048.XSHG', '603050.XSHG', '603051.XSHG', '603052.XSHG', '603053.XSHG', '603055.XSHG', '603056.XSHG', '603057.XSHG', '603058.XSHG', '603059.XSHG', '603060.XSHG', '603061.XSHG', '603062.XSHG', '603063.XSHG', '603065.XSHG', '603066.XSHG', '603067.XSHG', '603068.XSHG', '603069.XSHG', '603070.XSHG', '603071.XSHG', '603073.XSHG', '603075.XSHG', '603076.XSHG', '603077.XSHG', '603078.XSHG', '603079.XSHG', '603080.XSHG', '603081.XSHG', '603082.XSHG', '603083.XSHG', '603085.XSHG', '603086.XSHG', '603087.XSHG', '603088.XSHG', '603089.XSHG', '603090.XSHG', '603093.XSHG', '603095.XSHG', '603096.XSHG', '603097.XSHG', '603098.XSHG', '603099.XSHG', '603100.XSHG', '603101.XSHG', '603102.XSHG', '603103.XSHG', '603105.XSHG', '603106.XSHG', '603107.XSHG', '603108.XSHG', '603109.XSHG', '603110.XSHG', '603111.XSHG', '603112.XSHG', '603113.XSHG', '603115.XSHG', '603116.XSHG', '603117.XSHG', '603118.XSHG', '603119.XSHG', '603121.XSHG', '603122.XSHG', '603123.XSHG', '603125.XSHG', '603126.XSHG', '603127.XSHG', '603128.XSHG', '603129.XSHG', '603130.XSHG', '603131.XSHG', '603132.XSHG', '603133.XSHG', '603135.XSHG', '603136.XSHG', '603137.XSHG', '603138.XSHG', '603139.XSHG', '603150.XSHG', '603151.XSHG', '603153.XSHG', '603155.XSHG', '603156.XSHG', '603157.XSHG', '603158.XSHG', '603159.XSHG', '603160.XSHG', '603161.XSHG', '603162.XSHG', '603163.XSHG', '603165.XSHG', '603166.XSHG', '603167.XSHG', '603168.XSHG', '603169.XSHG', '603170.XSHG', '603171.XSHG', '603172.XSHG', '603173.XSHG', '603176.XSHG', '603177.XSHG', '603178.XSHG', '603179.XSHG', '603180.XSHG', '603181.XSHG', '603182.XSHG', '603183.XSHG', '603185.XSHG', '603186.XSHG', '603187.XSHG', '603188.XSHG', '603189.XSHG', '603190.XSHG', '603191.XSHG', '603192.XSHG', '603193.XSHG', '603195.XSHG', '603196.XSHG', '603197.XSHG', '603198.XSHG', '603199.XSHG', '603200.XSHG', '603201.XSHG', '603203.XSHG', '603206.XSHG', '603208.XSHG', '603209.XSHG', '603211.XSHG', '603212.XSHG', '603213.XSHG', '603214.XSHG', '603215.XSHG', '603216.XSHG', '603217.XSHG', '603218.XSHG', '603219.XSHG', '603220.XSHG', '603221.XSHG', '603222.XSHG', '603223.XSHG', '603225.XSHG', '603226.XSHG', '603227.XSHG', '603228.XSHG', '603229.XSHG', '603230.XSHG', '603231.XSHG', '603232.XSHG', '603233.XSHG', '603235.XSHG', '603236.XSHG', '603237.XSHG', '603238.XSHG', '603239.XSHG', '603255.XSHG', '603256.XSHG', '603258.XSHG', '603259.XSHG', '603260.XSHG', '603261.XSHG', '603266.XSHG', '603267.XSHG', '603268.XSHG', '603269.XSHG', '603270.XSHG', '603272.XSHG', '603273.XSHG', '603275.XSHG', '603276.XSHG', '603277.XSHG', '603278.XSHG', '603279.XSHG', '603280.XSHG', '603281.XSHG', '603282.XSHG', '603283.XSHG', '603285.XSHG', '603286.XSHG', '603288.XSHG', '603289.XSHG', '603290.XSHG', '603291.XSHG', '603296.XSHG', '603297.XSHG', '603298.XSHG', '603299.XSHG', '603300.XSHG', '603301.XSHG', '603303.XSHG', '603305.XSHG', '603306.XSHG', '603307.XSHG', '603308.XSHG', '603309.XSHG', '603310.XSHG', '603311.XSHG', '603312.XSHG', '603313.XSHG', '603315.XSHG', '603316.XSHG', '603317.XSHG', '603318.XSHG', '603319.XSHG', '603320.XSHG', '603321.XSHG', '603322.XSHG', '603323.XSHG', '603324.XSHG', '603325.XSHG', '603326.XSHG', '603327.XSHG', '603328.XSHG', '603329.XSHG', '603330.XSHG', '603331.XSHG', '603332.XSHG', '603333.XSHG', '603335.XSHG', '603336.XSHG', '603337.XSHG', '603338.XSHG', '603339.XSHG', '603341.XSHG', '603344.XSHG', '603345.XSHG', '603348.XSHG', '603350.XSHG', '603351.XSHG', '603353.XSHG', '603355.XSHG', '603356.XSHG', '603357.XSHG', '603358.XSHG', '603359.XSHG', '603360.XSHG', '603363.XSHG', '603365.XSHG', '603366.XSHG', '603367.XSHG', '603368.XSHG', '603369.XSHG', '603373.XSHG', '603375.XSHG', '603377.XSHG', '603378.XSHG', '603379.XSHG', '603380.XSHG', '603381.XSHG', '603383.XSHG', '603385.XSHG', '603386.XSHG', '603387.XSHG', '603388.XSHG', '603389.XSHG', '603390.XSHG', '603391.XSHG', '603392.XSHG', '603393.XSHG', '603396.XSHG', '603398.XSHG', '603399.XSHG', '603408.XSHG', '603416.XSHG', '603421.XSHG', '603429.XSHG', '603439.XSHG', '603444.XSHG', '603456.XSHG', '603458.XSHG', '603466.XSHG', '603477.XSHG', '603486.XSHG', '603488.XSHG', '603489.XSHG', '603496.XSHG', '603499.XSHG', '603500.XSHG', '603501.XSHG', '603505.XSHG', '603506.XSHG', '603507.XSHG', '603508.XSHG', '603511.XSHG', '603515.XSHG', '603516.XSHG', '603517.XSHG', '603518.XSHG', '603519.XSHG', '603520.XSHG', '603527.XSHG', '603528.XSHG', '603529.XSHG', '603530.XSHG', '603533.XSHG', '603535.XSHG', '603536.XSHG', '603538.XSHG', '603551.XSHG', '603555.XSHG', '603556.XSHG', '603557.XSHG', '603558.XSHG', '603559.XSHG', '603565.XSHG', '603566.XSHG', '603567.XSHG', '603568.XSHG', '603569.XSHG', '603577.XSHG', '603578.XSHG', '603579.XSHG', '603580.XSHG', '603583.XSHG', '603585.XSHG', '603586.XSHG', '603587.XSHG', '603588.XSHG', '603589.XSHG', '603590.XSHG', '603595.XSHG', '603596.XSHG', '603598.XSHG', '603599.XSHG', '603600.XSHG', '603601.XSHG', '603602.XSHG', '603603.XSHG', '603605.XSHG', '603606.XSHG', '603607.XSHG', '603608.XSHG', '603609.XSHG', '603610.XSHG', '603611.XSHG', '603612.XSHG', '603613.XSHG', '603615.XSHG', '603616.XSHG', '603617.XSHG', '603618.XSHG', '603619.XSHG', '603626.XSHG', '603628.XSHG', '603629.XSHG', '603630.XSHG', '603633.XSHG', '603636.XSHG', '603637.XSHG', '603638.XSHG', '603639.XSHG', '603648.XSHG', '603650.XSHG', '603655.XSHG', '603656.XSHG', '603657.XSHG', '603658.XSHG', '603659.XSHG', '603660.XSHG', '603661.XSHG', '603662.XSHG', '603663.XSHG', '603665.XSHG', '603666.XSHG', '603667.XSHG', '603668.XSHG', '603669.XSHG', '603676.XSHG', '603677.XSHG', '603678.XSHG', '603679.XSHG', '603680.XSHG', '603681.XSHG', '603682.XSHG', '603683.XSHG', '603685.XSHG', '603686.XSHG', '603687.XSHG', '603688.XSHG', '603689.XSHG', '603690.XSHG', '603693.XSHG', '603696.XSHG', '603697.XSHG', '603698.XSHG', '603699.XSHG', '603700.XSHG', '603701.XSHG', '603703.XSHG', '603706.XSHG', '603707.XSHG', '603708.XSHG', '603709.XSHG', '603711.XSHG', '603712.XSHG', '603713.XSHG', '603716.XSHG', '603717.XSHG', '603718.XSHG', '603719.XSHG', '603721.XSHG', '603722.XSHG', '603725.XSHG', '603726.XSHG', '603727.XSHG', '603728.XSHG', '603729.XSHG', '603730.XSHG', '603733.XSHG', '603737.XSHG', '603738.XSHG', '603739.XSHG', '603755.XSHG', '603757.XSHG', '603758.XSHG', '603759.XSHG', '603766.XSHG', '603767.XSHG', '603768.XSHG', '603773.XSHG', '603776.XSHG', '603777.XSHG', '603778.XSHG', '603779.XSHG', '603786.XSHG', '603787.XSHG', '603788.XSHG', '603789.XSHG', '603790.XSHG', '603797.XSHG', '603798.XSHG', '603799.XSHG', '603800.XSHG', '603801.XSHG', '603803.XSHG', '603806.XSHG', '603808.XSHG', '603809.XSHG', '603810.XSHG', '603811.XSHG', '603813.XSHG', '603815.XSHG', '603816.XSHG', '603817.XSHG', '603818.XSHG', '603819.XSHG', '603822.XSHG', '603823.XSHG', '603825.XSHG', '603826.XSHG', '603828.XSHG', '603829.XSHG', '603833.XSHG', '603836.XSHG', '603838.XSHG', '603839.XSHG', '603843.XSHG', '603848.XSHG', '603855.XSHG', '603856.XSHG', '603858.XSHG', '603859.XSHG', '603860.XSHG', '603861.XSHG', '603863.XSHG', '603866.XSHG', '603867.XSHG', '603868.XSHG', '603869.XSHG', '603871.XSHG', '603876.XSHG', '603877.XSHG', '603878.XSHG', '603879.XSHG', '603880.XSHG', '603881.XSHG', '603882.XSHG', '603883.XSHG', '603885.XSHG', '603886.XSHG', '603887.XSHG', '603888.XSHG', '603889.XSHG', '603890.XSHG', '603893.XSHG', '603895.XSHG', '603896.XSHG', '603897.XSHG', '603898.XSHG', '603899.XSHG', '603900.XSHG', '603901.XSHG', '603903.XSHG', '603906.XSHG', '603908.XSHG', '603909.XSHG', '603912.XSHG', '603915.XSHG', '603916.XSHG', '603917.XSHG', '603918.XSHG', '603919.XSHG', '603920.XSHG', '603922.XSHG', '603926.XSHG', '603927.XSHG', '603928.XSHG', '603929.XSHG', '603931.XSHG', '603933.XSHG', '603936.XSHG', '603937.XSHG', '603938.XSHG', '603939.XSHG', '603948.XSHG', '603949.XSHG', '603950.XSHG', '603955.XSHG', '603956.XSHG', '603958.XSHG', '603959.XSHG', '603960.XSHG', '603963.XSHG', '603966.XSHG', '603967.XSHG', '603968.XSHG', '603969.XSHG', '603970.XSHG', '603976.XSHG', '603977.XSHG', '603978.XSHG', '603979.XSHG', '603980.XSHG', '603982.XSHG', '603983.XSHG', '603985.XSHG', '603986.XSHG', '603987.XSHG', '603988.XSHG', '603989.XSHG', '603990.XSHG', '603991.XSHG', '603992.XSHG', '603993.XSHG', '603995.XSHG', '603996.XSHG', '603997.XSHG', '603998.XSHG', '603999.XSHG', '605001.XSHG', '605003.XSHG', '605005.XSHG', '605006.XSHG', '605007.XSHG', '605008.XSHG', '605009.XSHG', '605011.XSHG', '605016.XSHG', '605018.XSHG', '605020.XSHG', '605028.XSHG', '605033.XSHG', '605050.XSHG', '605055.XSHG', '605056.XSHG', '605058.XSHG', '605060.XSHG', '605066.XSHG', '605068.XSHG', '605069.XSHG', '605077.XSHG', '605080.XSHG', '605081.XSHG', '605086.XSHG', '605088.XSHG', '605089.XSHG', '605090.XSHG', '605098.XSHG', '605099.XSHG', '605100.XSHG', '605108.XSHG', '605111.XSHG', '605116.XSHG', '605117.XSHG', '605118.XSHG', '605122.XSHG', '605123.XSHG', '605128.XSHG', '605133.XSHG', '605136.XSHG', '605138.XSHG', '605151.XSHG', '605155.XSHG', '605158.XSHG', '605162.XSHG', '605166.XSHG', '605167.XSHG', '605168.XSHG', '605169.XSHG', '605177.XSHG', '605178.XSHG', '605179.XSHG', '605180.XSHG', '605183.XSHG', '605186.XSHG', '605188.XSHG', '605189.XSHG', '605196.XSHG', '605198.XSHG', '605199.XSHG', '605208.XSHG', '605218.XSHG', '605222.XSHG', '605228.XSHG', '605255.XSHG', '605258.XSHG', '605259.XSHG', '605266.XSHG', '605268.XSHG', '605277.XSHG', '605286.XSHG', '605287.XSHG', '605288.XSHG', '605289.XSHG', '605296.XSHG', '605298.XSHG', '605299.XSHG', '605300.XSHG', '605303.XSHG', '605305.XSHG', '605318.XSHG', '605319.XSHG', '605333.XSHG', '605336.XSHG', '605337.XSHG', '605338.XSHG', '605339.XSHG', '605358.XSHG', '605365.XSHG', '605366.XSHG', '605368.XSHG', '605369.XSHG', '605376.XSHG', '605377.XSHG', '605378.XSHG', '605388.XSHG', '605389.XSHG', '605398.XSHG', '605399.XSHG', '605488.XSHG', '605499.XSHG', '605500.XSHG', '605507.XSHG', '605555.XSHG', '605566.XSHG', '605567.XSHG', '605577.XSHG', '605580.XSHG', '605588.XSHG', '605589.XSHG', '605598.XSHG', '605599.XSHG', '688001.XSHG', '688002.XSHG', '688003.XSHG', '688004.XSHG', '688005.XSHG', '688006.XSHG', '688007.XSHG', '688008.XSHG', '688009.XSHG', '688010.XSHG', '688011.XSHG', '688012.XSHG', '688013.XSHG', '688015.XSHG', '688016.XSHG', '688017.XSHG', '688018.XSHG', '688019.XSHG', '688020.XSHG', '688021.XSHG', '688022.XSHG', '688023.XSHG', '688025.XSHG', '688026.XSHG', '688027.XSHG', '688028.XSHG', '688029.XSHG', '688030.XSHG', '688031.XSHG', '688032.XSHG', '688033.XSHG', '688035.XSHG', '688036.XSHG', '688037.XSHG', '688038.XSHG', '688039.XSHG', '688041.XSHG', '688045.XSHG', '688046.XSHG', '688047.XSHG', '688048.XSHG', '688049.XSHG', '688050.XSHG', '688051.XSHG', '688052.XSHG', '688053.XSHG', '688055.XSHG', '688056.XSHG', '688057.XSHG', '688058.XSHG', '688059.XSHG', '688060.XSHG', '688061.XSHG', '688062.XSHG', '688063.XSHG', '688065.XSHG', '688066.XSHG', '688067.XSHG', '688068.XSHG', '688069.XSHG', '688070.XSHG', '688071.XSHG', '688072.XSHG', '688073.XSHG', '688075.XSHG', '688076.XSHG', '688077.XSHG', '688078.XSHG', '688079.XSHG', '688080.XSHG', '688081.XSHG', '688082.XSHG', '688083.XSHG', '688084.XSHG', '688085.XSHG', '688086.XSHG', '688087.XSHG', '688088.XSHG', '688089.XSHG', '688090.XSHG', '688091.XSHG', '688092.XSHG', '688093.XSHG', '688095.XSHG', '688096.XSHG', '688097.XSHG', '688098.XSHG', '688099.XSHG', '688100.XSHG', '688101.XSHG', '688102.XSHG', '688103.XSHG', '688105.XSHG', '688106.XSHG', '688107.XSHG', '688108.XSHG', '688109.XSHG', '688110.XSHG', '688111.XSHG', '688112.XSHG', '688113.XSHG', '688114.XSHG', '688115.XSHG', '688116.XSHG', '688117.XSHG', '688118.XSHG', '688119.XSHG', '688120.XSHG', '688121.XSHG', '688122.XSHG', '688123.XSHG', '688125.XSHG', '688126.XSHG', '688127.XSHG', '688128.XSHG', '688129.XSHG', '688130.XSHG', '688131.XSHG', '688132.XSHG', '688133.XSHG', '688135.XSHG', '688136.XSHG', '688137.XSHG', '688138.XSHG', '688139.XSHG', '688141.XSHG', '688143.XSHG', '688146.XSHG', '688147.XSHG', '688148.XSHG', '688150.XSHG', '688151.XSHG', '688152.XSHG', '688153.XSHG', '688155.XSHG', '688156.XSHG', '688157.XSHG', '688158.XSHG', '688159.XSHG', '688160.XSHG', '688161.XSHG', '688162.XSHG', '688163.XSHG', '688165.XSHG', '688166.XSHG', '688167.XSHG', '688168.XSHG', '688169.XSHG', '688170.XSHG', '688171.XSHG', '688172.XSHG', '688173.XSHG', '688175.XSHG', '688176.XSHG', '688177.XSHG', '688178.XSHG', '688179.XSHG', '688180.XSHG', '688181.XSHG', '688182.XSHG', '688183.XSHG', '688184.XSHG', '688185.XSHG', '688186.XSHG', '688187.XSHG', '688188.XSHG', '688189.XSHG', '688190.XSHG', '688191.XSHG', '688192.XSHG', '688193.XSHG', '688195.XSHG', '688196.XSHG', '688197.XSHG', '688198.XSHG', '688199.XSHG', '688200.XSHG', '688201.XSHG', '688202.XSHG', '688203.XSHG', '688205.XSHG', '688206.XSHG', '688207.XSHG', '688208.XSHG', '688209.XSHG', '688210.XSHG', '688211.XSHG', '688212.XSHG', '688213.XSHG', '688215.XSHG', '688216.XSHG', '688217.XSHG', '688218.XSHG', '688219.XSHG', '688220.XSHG', '688221.XSHG', '688222.XSHG', '688223.XSHG', '688225.XSHG', '688226.XSHG', '688227.XSHG', '688228.XSHG', '688229.XSHG', '688230.XSHG', '688231.XSHG', '688232.XSHG', '688233.XSHG', '688234.XSHG', '688235.XSHG', '688236.XSHG', '688237.XSHG', '688238.XSHG', '688239.XSHG', '688244.XSHG', '688246.XSHG', '688247.XSHG', '688248.XSHG', '688249.XSHG', '688251.XSHG', '688252.XSHG', '688253.XSHG', '688255.XSHG', '688256.XSHG', '688257.XSHG', '688258.XSHG', '688259.XSHG', '688260.XSHG', '688261.XSHG', '688262.XSHG', '688265.XSHG', '688266.XSHG', '688267.XSHG', '688268.XSHG', '688269.XSHG', '688270.XSHG', '688271.XSHG', '688272.XSHG', '688273.XSHG', '688275.XSHG', '688276.XSHG', '688277.XSHG', '688278.XSHG', '688279.XSHG', '688280.XSHG', '688281.XSHG', '688282.XSHG', '688283.XSHG', '688285.XSHG', '688286.XSHG', '688287.XSHG', '688288.XSHG', '688289.XSHG', '688290.XSHG', '688291.XSHG', '688292.XSHG', '688293.XSHG', '688295.XSHG', '688296.XSHG', '688297.XSHG', '688298.XSHG', '688299.XSHG', '688300.XSHG', '688301.XSHG', '688302.XSHG', '688303.XSHG', '688305.XSHG', '688306.XSHG', '688307.XSHG', '688308.XSHG', '688309.XSHG', '688310.XSHG', '688311.XSHG', '688312.XSHG', '688313.XSHG', '688314.XSHG', '688315.XSHG', '688316.XSHG', '688317.XSHG', '688318.XSHG', '688319.XSHG', '688320.XSHG', '688321.XSHG', '688322.XSHG', '688323.XSHG', '688325.XSHG', '688326.XSHG', '688327.XSHG', '688328.XSHG', '688329.XSHG', '688330.XSHG', '688331.XSHG', '688332.XSHG', '688333.XSHG', '688334.XSHG', '688335.XSHG', '688336.XSHG', '688337.XSHG', '688338.XSHG', '688339.XSHG', '688343.XSHG', '688345.XSHG', '688347.XSHG', '688348.XSHG', '688349.XSHG', '688350.XSHG', '688351.XSHG', '688352.XSHG', '688353.XSHG', '688355.XSHG', '688356.XSHG', '688357.XSHG', '688358.XSHG', '688359.XSHG', '688360.XSHG', '688361.XSHG', '688362.XSHG', '688363.XSHG', '688365.XSHG', '688366.XSHG', '688367.XSHG', '688368.XSHG', '688369.XSHG', '688370.XSHG', '688371.XSHG', '688372.XSHG', '688373.XSHG', '688375.XSHG', '688376.XSHG', '688377.XSHG', '688378.XSHG', '688379.XSHG', '688380.XSHG', '688381.XSHG', '688382.XSHG', '688383.XSHG', '688385.XSHG', '688386.XSHG', '688387.XSHG', '688388.XSHG', '688389.XSHG', '688390.XSHG', '688391.XSHG', '688392.XSHG', '688393.XSHG', '688395.XSHG', '688396.XSHG', '688398.XSHG', '688399.XSHG', '688400.XSHG', '688401.XSHG', '688403.XSHG', '688408.XSHG', '688409.XSHG', '688410.XSHG', '688416.XSHG', '688418.XSHG', '688419.XSHG', '688420.XSHG', '688425.XSHG', '688426.XSHG', '688428.XSHG', '688429.XSHG', '688432.XSHG', '688433.XSHG', '688435.XSHG', '688439.XSHG', '688443.XSHG', '688448.XSHG', '688450.XSHG', '688455.XSHG', '688456.XSHG', '688458.XSHG', '688459.XSHG', '688466.XSHG', '688468.XSHG', '688469.XSHG', '688472.XSHG', '688475.XSHG', '688478.XSHG', '688479.XSHG', '688480.XSHG', '688484.XSHG', '688485.XSHG', '688486.XSHG', '688488.XSHG', '688489.XSHG', '688496.XSHG', '688498.XSHG', '688499.XSHG', '688500.XSHG', '688501.XSHG', '688502.XSHG', '688503.XSHG', '688505.XSHG', '688506.XSHG', '688507.XSHG', '688508.XSHG', '688509.XSHG', '688510.XSHG', '688511.XSHG', '688512.XSHG', '688513.XSHG', '688515.XSHG', '688516.XSHG', '688517.XSHG', '688518.XSHG', '688519.XSHG', '688520.XSHG', '688521.XSHG', '688522.XSHG', '688523.XSHG', '688525.XSHG', '688526.XSHG', '688528.XSHG', '688529.XSHG', '688530.XSHG', '688531.XSHG', '688533.XSHG', '688535.XSHG', '688536.XSHG', '688538.XSHG', '688539.XSHG', '688543.XSHG', '688548.XSHG', '688549.XSHG', '688550.XSHG', '688551.XSHG', '688552.XSHG', '688553.XSHG', '688555.XSHG', '688556.XSHG', '688557.XSHG', '688558.XSHG', '688559.XSHG', '688560.XSHG', '688561.XSHG', '688562.XSHG', '688563.XSHG', '688565.XSHG', '688566.XSHG', '688567.XSHG', '688568.XSHG', '688569.XSHG', '688570.XSHG', '688571.XSHG', '688573.XSHG', '688575.XSHG', '688576.XSHG', '688577.XSHG', '688578.XSHG', '688579.XSHG', '688580.XSHG', '688581.XSHG', '688582.XSHG', '688584.XSHG', '688585.XSHG', '688586.XSHG', '688588.XSHG', '688589.XSHG', '688590.XSHG', '688591.XSHG', '688592.XSHG', '688593.XSHG', '688595.XSHG', '688596.XSHG', '688597.XSHG', '688598.XSHG', '688599.XSHG', '688600.XSHG', '688601.XSHG', '688602.XSHG', '688603.XSHG', '688606.XSHG', '688607.XSHG', '688608.XSHG', '688609.XSHG', '688610.XSHG', '688611.XSHG', '688612.XSHG', '688613.XSHG', '688616.XSHG', '688617.XSHG', '688618.XSHG', '688619.XSHG', '688620.XSHG', '688621.XSHG', '688622.XSHG', '688623.XSHG', '688625.XSHG', '688626.XSHG', '688627.XSHG', '688628.XSHG', '688629.XSHG', '688630.XSHG', '688631.XSHG', '688633.XSHG', '688636.XSHG', '688638.XSHG', '688639.XSHG', '688646.XSHG', '688648.XSHG', '688651.XSHG', '688652.XSHG', '688653.XSHG', '688655.XSHG', '688656.XSHG', '688657.XSHG', '688658.XSHG', '688659.XSHG', '688660.XSHG', '688661.XSHG', '688662.XSHG', '688663.XSHG', '688665.XSHG', '688667.XSHG', '688668.XSHG', '688669.XSHG', '688670.XSHG', '688671.XSHG', '688676.XSHG', '688677.XSHG', '688678.XSHG', '688679.XSHG', '688680.XSHG', '688681.XSHG', '688682.XSHG', '688683.XSHG', '688685.XSHG', '688686.XSHG', '688687.XSHG', '688689.XSHG', '688690.XSHG', '688691.XSHG', '688692.XSHG', '688693.XSHG', '688695.XSHG', '688696.XSHG', '688697.XSHG', '688698.XSHG', '688699.XSHG', '688700.XSHG', '688701.XSHG', '688702.XSHG', '688707.XSHG', '688709.XSHG', '688711.XSHG', '688716.XSHG', '688717.XSHG', '688718.XSHG', '688719.XSHG', '688720.XSHG', '688721.XSHG', '688722.XSHG', '688728.XSHG', '688733.XSHG', '688737.XSHG', '688739.XSHG', '688766.XSHG', '688767.XSHG', '688768.XSHG', '688772.XSHG', '688776.XSHG', '688777.XSHG', '688778.XSHG', '688779.XSHG', '688786.XSHG', '688787.XSHG', '688788.XSHG', '688789.XSHG', '688793.XSHG', '688798.XSHG', '688799.XSHG', '688800.XSHG', '688819.XSHG', '688981.XSHG', '689009.XSHG']
from jqdatasdk import * if __name__ == '__main__': auth('账户', '密码') # 获取所有的股票代码 stocks = list(get_all_securities(['stock']).index) # print(stocks) # 获取A股所有的行情数据 for stock in stocks: df = get_price(stock, count=10, end_date='2024-05-01', frequency='daily', panel=False) print(df)
运行结果
auth success
open close high low volume money
2024-04-17 9.58 9.91 9.92 9.53 239211490.0 2.337577e+09
2024-04-18 9.87 10.08 10.29 9.86 339205099.0 3.427339e+09
2024-04-19 10.00 9.98 10.10 9.95 156179466.0 1.562376e+09
2024-04-22 9.93 9.80 10.09 9.75 215337682.0 2.125723e+09
2024-04-23 9.81 9.84 9.94 9.76 132860036.0 1.308866e+09
2024-04-24 9.82 9.83 9.87 9.76 100882258.0 9.890935e+08
2024-04-25 9.80 9.90 9.91 9.78 119337026.0 1.176305e+09
...
使用resample函数转化时间序列
日K => 周K
日期 | 周期 | 开盘价 | 收盘价 | 最高价 | 最低价 | 成交量 |
---|---|---|---|---|---|---|
1月1日 | 周一 | 1.11 | 1.23 | 1.31 | 1.01 | 122 |
1月2日 | 周二 | 1.22 | 1.33 | 1.41 | 1.02 | 133 |
1月3日 | 周三 | 1.33 | 1.43 | 1.51 | 1.03 | 144 |
1月4日 | 周四 | 1.44 | 1.53 | 1.61 | 1.04 | 155 |
1月5日 | 周五 | 1.55 | 1.63 | 1.71 | 1.05 | 166 |
这里我们需要将日K转化为周K,周K的开盘价是当周第一天的开盘价,即这里周一的开盘价1.11;收盘价是当周最后一天的收盘价,即这里周五的收盘价1.63;最高价是当周的最高价,即这里的周五的最高价1.71;最低价是当周的最低价,即这里周一的最低价1.01。周成交量即是把每天的成交量加和,这里Sum=720。
月K,年K的选取规则是一样的,只不过月K的周期是一个月,年K的周期是一年。
from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') # 转换周期:日K转换为周K df = get_price('000001.XSHE', count=20, end_date='2024-05-01', frequency='daily', panel=False) # 增加星期几的字段,0表示星期一,1表示星期二,以此类推 df['weekday'] = df.index.weekday print(df) df_week = pd.DataFrame() # 获取周开盘价,这里取一周最后一天周日的日期表示一周 df_week['open'] = df['open'].resample('W').first() # 获取周收盘价 df_week['close'] = df['close'].resample('W').last() # 获取周最高价 df_week['high'] = df['high'].resample('W').max() # 获取周最低价 df_week['low'] = df['low'].resample('W').min() # 获取周成交量 df_week['volume'] = df['volume'].resample('W').sum() # 获取周成交额 df_week['money'] = df['money'].resample('W').sum() print(df_week)
运行结果
auth success
open close high low volume money weekday
2024-04-01 9.82 9.93 9.94 9.81 127616567.0 1.261770e+09 0
2024-04-02 9.92 9.85 9.97 9.83 116299099.0 1.149701e+09 1
2024-04-03 9.83 9.76 9.85 9.73 105197770.0 1.028649e+09 2
2024-04-08 9.73 9.73 9.79 9.68 97110056.0 9.452904e+08 0
2024-04-09 9.73 9.71 9.77 9.67 91838221.0 8.914690e+08 1
2024-04-10 9.69 9.59 9.72 9.59 133541874.0 1.288696e+09 2
2024-04-11 9.56 9.57 9.60 9.45 108237150.0 1.030820e+09 3
2024-04-12 9.54 9.39 9.59 9.37 139870040.0 1.322012e+09 4
2024-04-15 9.40 9.60 9.63 9.39 155700279.0 1.486326e+09 0
2024-04-16 9.59 9.59 9.70 9.54 158361046.0 1.523138e+09 1
2024-04-17 9.58 9.91 9.92 9.53 239211490.0 2.337577e+09 2
2024-04-18 9.87 10.08 10.29 9.86 339205099.0 3.427339e+09 3
2024-04-19 10.00 9.98 10.10 9.95 156179466.0 1.562376e+09 4
2024-04-22 9.93 9.80 10.09 9.75 215337682.0 2.125723e+09 0
2024-04-23 9.81 9.84 9.94 9.76 132860036.0 1.308866e+09 1
2024-04-24 9.82 9.83 9.87 9.76 100882258.0 9.890935e+08 2
2024-04-25 9.80 9.90 9.91 9.78 119337026.0 1.176305e+09 3
2024-04-26 9.88 9.89 9.96 9.78 172245805.0 1.698581e+09 4
2024-04-29 9.86 10.09 10.17 9.82 232411861.0 2.337351e+09 0
2024-04-30 10.08 10.07 10.15 10.01 141916771.0 1.431408e+09 1
open close high low volume money
2024-04-07 9.82 9.76 9.97 9.73 3.491134e+08 3.440120e+09
2024-04-14 9.73 9.39 9.79 9.37 5.705973e+08 5.478288e+09
2024-04-21 9.40 9.98 10.29 9.39 1.048657e+09 1.033676e+10
2024-04-28 9.93 9.89 10.09 9.75 7.406628e+08 7.298568e+09
2024-05-05 9.86 10.07 10.17 9.82 3.743286e+08 3.768759e+09
如果我们要转换月K,只需要进行如下修改即可
df = get_price('000001.XSHE', start_date='2024-01-01', end_date='2024-05-01', frequency='daily', panel=False)
df_mounth = pd.DataFrame() # 获取月开盘价 df_mounth['open'] = df['open'].resample('M').first() # 获取月收盘价 df_mounth['close'] = df['close'].resample('M').last() # 获取月最高价 df_mounth['high'] = df['high'].resample('M').max() # 获取月最低价 df_mounth['low'] = df['low'].resample('M').min()
使用JQData查询财务指标
- 资产负债表:体现企业家底和负债情况。
- 利润表:公司盈利能力,赚了多少,怎么赚的。隐含着对未来利润增长的预期。体现市场空间、成长能力。资产负债表和利润表都是基于权责发生制(比如商业合同,应收账款)。
- 现金流量表:基于收付实现制,只有资金真实到账,现金流量表上才会有。体现造血能力、竞争优势、议价优势。
from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取股票财务指标 df = get_fundamentals(query(indicator), statDate='2023') df.to_csv('finance2023.csv')
运行结果
上图中,code为股票代码;statDate为报表对应的期末值;pubDate为报表公布日期,该日期最晚要在第二年4月份公布,每家公司公布的时间不太一样;eps为每股收益,表示净利润/股本数,代表公司盈利能力;operating_profit为经营活动净收益=营业总收入-营业总成本;roe为净资产收益率,归属于母公司的两倍的净利润/归属于母公司净资产,相当于公司资产的产出;inc_net_profit_year_on_year为净利润的同比增长率=\(今年的利润-去年的利润\over 去年的利润\)。
from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取股票财务指标 df = get_fundamentals(query(indicator), statDate='2023') # df.to_csv('finance2023.csv') # 基于盈利指标选股:eps,operating_profit,roe,inc_net_profit_year_on_year df = df[(df['eps'] > 0) & (df['operating_profit'] > df['operating_profit'].mean()) & (df['roe'] > 11) & (df['inc_net_profit_year_on_year'] > 10)] print(df)
运行结果(略)
使用JQData查询估值指标
对企业进行估值,分为绝对估值和相对估值。
- 绝对估值法
绝对估值法是一种定价模型,计算企业的内在价值。
上图是伊利股份的极简的DCF模型(现金流折现模型),FCFF实际值表示该公司近n年的现金流情况,借此去预测该公司未来n年的现金流情况(FCFF预测值)。按照预测的数据进行折现,也就是未来n年的价格换算到今天是多少钱来判断当前的股价是贵还是便宜。贵还是便宜决定我们是否购买,一般来说一个公司越值钱它的股价是越贵的,但这个不绝对,我们想要的就是找到一个公司价值不错但是股价不高的公司,利用公司本身的内在价值和它在市场价格的差价赚钱。
在绝对估值法中有一个很重要的指标叫做折现率,即未来的钱转化为现在的钱要折掉多少,这里设置的是10%,这个值是可以随意调整的,这个值设置不同会导致我们最后计算企业价值不同。
我们将企业价值除以股本数得到上图中的每股价值28.2,但是我们看到现在市场的价值是48.8,它们差了20.6,处于高估的情况,做过对比之后,我们的选择应该是不购买该公司的股票。现金流折算模型中的参数会极大影响最终的结果,从而很难利用这样的模型去做出准确的判断。
- 相对估值法
估值指标:PE市盈率,PB市净率,PS市销率
计算方法 | 含义 | 公式 | 统计方式 |
---|---|---|---|
PE市盈率 | 市值收益率,可理解为:按当前收益水平,需要多少年收回成本,与盈利增速有关 | \(Price(每股价格or市值)\over Earnings(每股收益or净利润)\) |
|
PS市销率 | 市值主营收比,考察收益的稳定性与可靠性 | \(Price(每股价格or市值)\over Book\ Value(每股销售额or主营收)\) | 市销率(主营业务收入,近4季度总主营业务收入) |
PB市净率 | 市值净资产比,主要为有形资产,常被低估(无形资产、固定资产增值、应收问题) | \(Price(每股价格or市值)\over Sales(每股净资产or净资产)\) | 市净率(归属于母公司股东权益合计,报告期末) |
from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取股票估值指标 df = get_fundamentals(query(valuation), statDate='2023') df.to_csv('valuation.csv')
运行结果
上图中,code为股票代码;pe_ratio为PE市盈率;turnover_ratio为换手;pb_ratio为PB市净率;ps_ratio为PS市销率;pcf_ratio为PCF市现率;capitalization为总股本;market_cap为市值;circulating_cap为流通股本;circulating_market_cap为流通市值。
结合之前的盈利选股指标,我们可以看一下该股的PE市盈率,我们希望PE市盈率足够低,这样未来的成长空间就会比较大。
from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取股票财务指标 df = get_fundamentals(query(indicator), statDate='2023') # df.to_csv('finance2023.csv') # 基于盈利指标选股:eps,operating_profit,roe,inc_net_profit_year_on_year df = df[(df['eps'] > 0) & (df['operating_profit'] > df['operating_profit'].mean()) & (df['roe'] > 11) & (df['inc_net_profit_year_on_year'] > 10)] df.index = df['code'] # 获取股票估值指标 df_valuation = get_fundamentals(query(valuation), statDate='2023') # df.to_csv('valuation.csv') df_valuation.index = df_valuation['code'] # 以股票代码为索引,拼接挑选出的财务指标与市盈率,并指定市盈率小于50的股票 df['pe_ratio'] = df_valuation['pe_ratio'] df = df[df['pe_ratio'] < 50] df.to_csv('result.csv')
运行结果
计算交易指标
使用Shift函数结算涨跌幅
\(涨跌幅={当期收盘价-前期收盘价\over 前期收盘价}\)
from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-04-01', end_date='2024-05-01', frequency='daily') # 计算涨跌幅,验证准确性 data['close_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1) print(data) # 获取周K df_week = pd.DataFrame() # 获取周开盘价,这里取一周最后一天周日的日期表示一周 df_week['open'] = data['open'].resample('W').first() # 获取周收盘价 df_week['close'] = data['close'].resample('W').last() # 获取周最高价 df_week['high'] = data['high'].resample('W').max() # 获取周最低价 df_week['low'] = data['low'].resample('W').min() # 获取周成交量 df_week['volume'] = data['volume'].resample('W').sum() # 获取周成交额 df_week['money'] = data['money'].resample('W').sum() # 周K涨跌幅 df_week['close_pct'] = (df_week['close'] - df_week['close'].shift(1)) / df_week['close'].shift(1) print(df_week)
运行结果
auth success
open close high low volume money close_pct
2024-04-01 9.82 9.93 9.94 9.81 127616567.0 1.261770e+09 NaN
2024-04-02 9.92 9.85 9.97 9.83 116299099.0 1.149701e+09 -0.008056
2024-04-03 9.83 9.76 9.85 9.73 105197770.0 1.028649e+09 -0.009137
2024-04-08 9.73 9.73 9.79 9.68 97110056.0 9.452904e+08 -0.003074
2024-04-09 9.73 9.71 9.77 9.67 91838221.0 8.914690e+08 -0.002055
2024-04-10 9.69 9.59 9.72 9.59 133541874.0 1.288696e+09 -0.012358
2024-04-11 9.56 9.57 9.60 9.45 108237150.0 1.030820e+09 -0.002086
2024-04-12 9.54 9.39 9.59 9.37 139870040.0 1.322012e+09 -0.018809
2024-04-15 9.40 9.60 9.63 9.39 155700279.0 1.486326e+09 0.022364
2024-04-16 9.59 9.59 9.70 9.54 158361046.0 1.523138e+09 -0.001042
2024-04-17 9.58 9.91 9.92 9.53 239211490.0 2.337577e+09 0.033368
2024-04-18 9.87 10.08 10.29 9.86 339205099.0 3.427339e+09 0.017154
2024-04-19 10.00 9.98 10.10 9.95 156179466.0 1.562376e+09 -0.009921
2024-04-22 9.93 9.80 10.09 9.75 215337682.0 2.125723e+09 -0.018036
2024-04-23 9.81 9.84 9.94 9.76 132860036.0 1.308866e+09 0.004082
2024-04-24 9.82 9.83 9.87 9.76 100882258.0 9.890935e+08 -0.001016
2024-04-25 9.80 9.90 9.91 9.78 119337026.0 1.176305e+09 0.007121
2024-04-26 9.88 9.89 9.96 9.78 172245805.0 1.698581e+09 -0.001010
2024-04-29 9.86 10.09 10.17 9.82 232411861.0 2.337351e+09 0.020222
2024-04-30 10.08 10.07 10.15 10.01 141916771.0 1.431408e+09 -0.001982
open close high low volume money close_pct
2024-04-07 9.82 9.76 9.97 9.73 3.491134e+08 3.440120e+09 NaN
2024-04-14 9.73 9.39 9.79 9.37 5.705973e+08 5.478288e+09 -0.037910
2024-04-21 9.40 9.98 10.29 9.39 1.048657e+09 1.033676e+10 0.062833
2024-04-28 9.93 9.89 10.09 9.75 7.406628e+08 7.298568e+09 -0.009018
2024-05-05 9.86 10.07 10.17 9.82 3.743286e+08 3.768759e+09 0.018200
模拟股票交易
- 买入、卖出信号
- 创建周期选股策略,这里只是一个简单的示例,某日买入,某日卖出;
- 生成交易信号
from jqdatasdk import * import pandas as pd import numpy as np if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-04-01', end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四买入 data['buy_signal'] = np.where((data['weekday'] == 3), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) print(data[['close', 'weekday', 'buy_signal', 'sell_signal']])
运行结果
auth success
close weekday buy_signal sell_signal
2024-04-01 9.93 0 0 -1
2024-04-02 9.85 1 0 0
2024-04-03 9.76 2 0 0
2024-04-08 9.73 0 0 1
2024-04-09 9.71 1 0 0
2024-04-10 9.59 2 0 0
2024-04-11 9.57 3 1 0
2024-04-12 9.39 4 0 0
2024-04-15 9.60 0 0 -1
2024-04-16 9.59 1 0 0
2024-04-17 9.91 2 0 0
2024-04-18 10.08 3 1 0
2024-04-19 9.98 4 0 0
2024-04-22 9.80 0 0 1
2024-04-23 9.84 1 0 0
2024-04-24 9.83 2 0 0
2024-04-25 9.90 3 1 0
2024-04-26 9.89 4 0 0
2024-04-29 10.09 0 0 -1
2024-04-30 10.07 1 0 0
如果我们要周四、周五都买入的话,则改为
from jqdatasdk import * import pandas as pd import numpy as np if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-04-01', end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) print(data[['close', 'weekday', 'buy_signal', 'sell_signal']])
运行结果
auth success
close weekday buy_signal sell_signal
2024-04-01 9.93 0 0 -1
2024-04-02 9.85 1 0 0
2024-04-03 9.76 2 0 0
2024-04-08 9.73 0 0 -1
2024-04-09 9.71 1 0 0
2024-04-10 9.59 2 0 0
2024-04-11 9.57 3 1 0
2024-04-12 9.39 4 1 0
2024-04-15 9.60 0 0 -1
2024-04-16 9.59 1 0 0
2024-04-17 9.91 2 0 0
2024-04-18 10.08 3 1 0
2024-04-19 9.98 4 1 0
2024-04-22 9.80 0 0 -1
2024-04-23 9.84 1 0 0
2024-04-24 9.83 2 0 0
2024-04-25 9.90 3 1 0
2024-04-26 9.89 4 1 0
2024-04-29 10.09 0 0 -1
2024-04-30 10.07 1 0 0
整合信号,如果购买信号连续出现两个1的时候消除第二个1。
from jqdatasdk import * import pandas as pd import numpy as np if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-04-01', end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) # 整合信号,消除连续的第二个买入信号 data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) print(data[['close', 'weekday', 'buy_signal', 'sell_signal']])
运行结果
auth success
close weekday buy_signal sell_signal
2024-04-01 9.93 0 0 -1
2024-04-02 9.85 1 0 0
2024-04-03 9.76 2 0 0
2024-04-08 9.73 0 0 -1
2024-04-09 9.71 1 0 0
2024-04-10 9.59 2 0 0
2024-04-11 9.57 3 1 0
2024-04-12 9.39 4 0 0
2024-04-15 9.60 0 0 -1
2024-04-16 9.59 1 0 0
2024-04-17 9.91 2 0 0
2024-04-18 10.08 3 1 0
2024-04-19 9.98 4 0 0
2024-04-22 9.80 0 0 -1
2024-04-23 9.84 1 0 0
2024-04-24 9.83 2 0 0
2024-04-25 9.90 3 1 0
2024-04-26 9.89 4 0 0
2024-04-29 10.09 0 0 -1
2024-04-30 10.07 1 0 0
最后我们将买卖信号放到同一个字段内
from jqdatasdk import * import pandas as pd import numpy as np if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-04-01', end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) # 整合信号,消除连续的第二个买入信号 data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) # 整合买卖信号 data['signal'] = data['buy_signal'] + data['sell_signal'] print(data[['close', 'weekday', 'buy_signal', 'sell_signal', 'signal']])
运行结果
auth success
close weekday buy_signal sell_signal signal
2024-04-01 9.93 0 0 -1 -1
2024-04-02 9.85 1 0 0 0
2024-04-03 9.76 2 0 0 0
2024-04-08 9.73 0 0 -1 -1
2024-04-09 9.71 1 0 0 0
2024-04-10 9.59 2 0 0 0
2024-04-11 9.57 3 1 0 1
2024-04-12 9.39 4 0 0 0
2024-04-15 9.60 0 0 -1 -1
2024-04-16 9.59 1 0 0 0
2024-04-17 9.91 2 0 0 0
2024-04-18 10.08 3 1 0 1
2024-04-19 9.98 4 0 0 0
2024-04-22 9.80 0 0 -1 -1
2024-04-23 9.84 1 0 0 0
2024-04-24 9.83 2 0 0 0
2024-04-25 9.90 3 1 0 1
2024-04-26 9.89 4 0 0 0
2024-04-29 10.09 0 0 -1 -1
2024-04-30 10.07 1 0 0 0
- 计算持仓收益
在上图中,我们需要知道这些指标是怎么得到的
- 总盈亏=(市价-成本价)*股数
- \(浮动盈亏比={市价-成本价\over 成本价}\)
- \(成本价={买入金额\over 持有股数}\) (这里可能是分批次的买入平均值)
- 股数=累计买入股数
from jqdatasdk import * import pandas as pd import numpy as np if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-04-01', end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) # 整合信号,消除连续的第二个买入信号 data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) # 整合买卖信号 data['signal'] = data['buy_signal'] + data['sell_signal'] # 计算单次收益率:开仓、平仓(开仓的全部股数) data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1) # 只需要卖出的收益率 data = data[data['signal'] == -1] print(data[['close', 'signal', 'profit_pct']])
运行结果
auth success
close signal profit_pct
2024-04-15 9.60 -1 0.003135
2024-04-22 9.80 -1 -0.027778
2024-04-29 10.09 -1 0.019192
如果我们要获取该股票从上市的日期开始算,可以进行如下修改
from jqdatasdk import * import pandas as pd import numpy as np if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行上市日期 start_date = get_security_info('000001.XSHE').start_date # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date=start_date, end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) # 整合信号,消除连续的第二个买入信号 data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) # 整合买卖信号 data['signal'] = data['buy_signal'] + data['sell_signal'] # 计算单次收益率:开仓、平仓(开仓的全部股数) data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1) # 只需要卖出的收益率 data = data[data['signal'] == -1] print(data[['close', 'signal', 'profit_pct']])
运行结果(部分)
auth success
close signal profit_pct
2005-01-10 1.32 -1 0.007634
2005-01-17 1.25 -1 -0.053030
2005-01-24 1.30 -1 0.083333
2005-01-31 1.21 -1 -0.016260
2005-02-21 1.34 -1 0.022901
2005-02-28 1.30 -1 -0.022556
2005-03-07 1.25 -1 -0.031008
2005-03-14 1.22 -1 -0.008130
2005-03-21 1.19 -1 -0.008333
2005-03-28 1.06 -1 -0.018519
2005-04-04 1.09 -1 0.048077
2005-04-11 1.39 -1 0.120968
2005-04-18 1.29 -1 -0.022727
...
最后我们看一下单次收益率的各个统计量
from jqdatasdk import * import pandas as pd import numpy as np import matplotlib.pyplot as plt if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行上市日期 start_date = get_security_info('000001.XSHE').start_date # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date=start_date, end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) # 整合信号,消除连续的第二个买入信号 data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) # 整合买卖信号 data['signal'] = data['buy_signal'] + data['sell_signal'] # 计算单次收益率:开仓、平仓(开仓的全部股数) data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1) # 只需要卖出的收益率 data = data[data['signal'] == -1] # print(data[['close', 'signal', 'profit_pct']]) print(data.describe()) # 画出收益率折线图 data['profit_pct'].plot() plt.show()
运行结果
auth success
open close high low volume \
count 883.000000 883.000000 883.000000 883.000000 8.830000e+02
mean 7.811971 7.817916 7.940453 7.689807 1.227682e+08
std 4.351606 4.354984 4.427351 4.271594 9.570331e+07
min 1.080000 1.060000 1.080000 1.050000 0.000000e+00
25% 4.765000 4.765000 4.835000 4.700000 6.221475e+07
50% 7.280000 7.280000 7.400000 7.180000 1.014664e+08
75% 10.555000 10.595000 10.745000 10.445000 1.544504e+08
max 22.110000 22.020000 22.190000 21.420000 7.848542e+08
money weekday buy_signal sell_signal signal profit_pct
count 8.830000e+02 883.0 883.0 883.0 883.0 883.000000
mean 1.039308e+09 0.0 0.0 -1.0 -1.0 0.002574
std 1.030744e+09 0.0 0.0 0.0 0.0 0.038639
min 0.000000e+00 0.0 0.0 -1.0 -1.0 -0.140964
25% 3.668098e+08 0.0 0.0 -1.0 -1.0 -0.017963
50% 7.412006e+08 0.0 0.0 -1.0 -1.0 0.000000
75% 1.412729e+09 0.0 0.0 -1.0 -1.0 0.019402
max 8.596942e+09 0.0 0.0 -1.0 -1.0 0.211604
这里我们只看profit_pct的统计量,均值为0.002574,标准差为0.038639,最小值为-0.140964,25%分位点为-0.017963,50%分位点,即中位数为0.000000,75%分位点为0.019402,最大值为0.211604。
通过上图,如果我们每周四买入,周一卖出,它的单次收益率是上下不断起伏波动的。
- 计算累计收益
假设有一个理财产品,它每天的收益率都不同
理财产品 | 累计收益 |
---|---|
第一天:3% | 1*(1+3%)=103 |
第二天:2% | 以上*(1+2%)=103+2.06=105.06 |
第三天:5% | 以上*(1+5%)=105.06+5.25=110.31 |
第四天:6% | 以上*(1+6%)=110.31+6.62=116.93 |
... | (1+当天收益率)的累计乘积-1 |
这里的1代表本金100块,最后的-1是要扣除本金才是最终的累计收益率。
from jqdatasdk import * import pandas as pd import numpy as np import matplotlib.pyplot as plt if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行上市日期 start_date = get_security_info('000001.XSHE').start_date # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date=start_date, end_date='2024-05-01', frequency='daily', panel=False) # 创建星期字段 data['weekday'] = data.index.weekday # 周四、周五买入 data['buy_signal'] = np.where((data['weekday'] == 3) | (data['weekday'] == 4), 1, 0) # 周一卖出 data['sell_signal'] = np.where((data['weekday'] == 0), -1, 0) # 整合信号,消除连续的第二个买入信号 data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) # 整合买卖信号 data['signal'] = data['buy_signal'] + data['sell_signal'] # 计算单次收益率:开仓、平仓(开仓的全部股数) data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) data['profit_pct'] = (data['close'] - data['close'].shift(1)) / data['close'].shift(1) # 只需要卖出的收益率 data = data[data['signal'] == -1] # 计算累计收益率 data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 print(data[['close', 'signal', 'profit_pct', 'cum_profit']]) print(data.describe()) # 画出累计收益率折线图 data['cum_profit'].plot() plt.show()
运行结果(每期的,部分)
auth success
close signal profit_pct cum_profit
2005-01-10 1.32 -1 0.007634 0.007634
2005-01-17 1.25 -1 -0.053030 -0.045802
2005-01-24 1.30 -1 0.083333 0.033715
2005-01-31 1.21 -1 -0.016260 0.016907
2005-02-21 1.34 -1 0.022901 0.040195
2005-02-28 1.30 -1 -0.022556 0.016732
2005-03-07 1.25 -1 -0.031008 -0.014795
2005-03-14 1.22 -1 -0.008130 -0.022805
2005-03-21 1.19 -1 -0.008333 -0.030948
2005-03-28 1.06 -1 -0.018519 -0.048894
2005-04-04 1.09 -1 0.048077 -0.003167
2005-04-11 1.39 -1 0.120968 0.117417
...
统计量
money weekday buy_signal sell_signal signal profit_pct \
count 8.830000e+02 883.0 883.0 883.0 883.0 883.000000
mean 1.039308e+09 0.0 0.0 -1.0 -1.0 0.002574
std 1.030744e+09 0.0 0.0 0.0 0.0 0.038639
min 0.000000e+00 0.0 0.0 -1.0 -1.0 -0.140964
25% 3.668098e+08 0.0 0.0 -1.0 -1.0 -0.017963
50% 7.412006e+08 0.0 0.0 -1.0 -1.0 0.000000
75% 1.412729e+09 0.0 0.0 -1.0 -1.0 0.019402
max 8.596942e+09 0.0 0.0 -1.0 -1.0 0.211604
cum_profit
count 883.000000
mean 2.647691
std 2.008637
min -0.111908
25% 1.125868
50% 2.433471
75% 4.055035
max 8.822420
这里我们只看cum_profit的统计量,均值为2.647691,标准差为2.008637,最小值为-0.111908,25%分位数为1.125868,50%分位数,即中位数为2.433471,75%分位数为4.055035,最大值为8.822420。
通过上图,如果我们每周四买入,周一卖出,它的累计收益率在2021年是不断上升的,之后在不断下降。如果我们在2005年买入该股1000块钱,在股市里面不断的滚动,在2021年可以达到1000000。
计算风险指标:最大回撤
最大回撤:在选定周期内任一历史时点往后推,产品净值走到最低点时的收益率回撤幅度的最大值。是一个非常重要的风险指标。
假设上图是大盘的表现,横坐标是时间,纵坐标是净值。我们选定一个周期(0到低谷值),即上图红框内的时间。
\(MDD={Trough\ value-Peak\ Value\over Peak\ Value}\)
上式中MDD表示最大回撤值,Trough value表示低谷值,Peak Value表示最高值。表示一段周期内最低值减最高值再除以最高值。假设上图中红色框周期内的最高值为4000,最低值为2000,
\(MDD={2000-4000\over 4000}=50\%\)
这里我们计算最大回撤值的时候是不计正负号的。
最大回撤描述的是我们购买后可能产生最糟糕的情况,亏损最大的比例是多少。假设有两个理财产品,它们的收益率是一样的
收益率 | 回撤A | 回撤B |
---|---|---|
近一周:7% | 2% | 1% |
近一月:11% | 5% | 3.8% |
近一年:28% | 17% | 13% |
通过上表我们知道在相同的收益率条件下,产品B的回撤更小,亏损更小。如果这两个产品挑一种购买,那我们肯定挑产品B,因为该产品更扛跌,虽然大家都在跌,但是产品B跌的更少。最大回撤的意义就在于帮助我们去做风险控制。
from os import close from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2024-03-01', end_date='2024-05-01', frequency='daily', panel=False) # 计算最大回撤 window = 7 # 选取时间周期,7天 # 选择时间周期中的最大净值 data['roll_max'] = data['close'].rolling(window=window, min_periods=1).max() # 计算当天回撤比=(谷值-峰值)/峰值=谷值/峰值-1 data['daily_dd'] = data['close'] / data['roll_max'] - 1 # 选取时间周期内最大的回撤比,即最大回撤,因为是负值,所以用min() data['max_dd'] = data['daily_dd'].rolling(window=window, min_periods=1).min() print(data[['close', 'roll_max', 'daily_dd', 'max_dd']])
运行结果
auth success
close roll_max daily_dd max_dd
2024-03-01 9.79 9.79 0.000000 0.000000
2024-03-04 9.64 9.79 -0.015322 -0.015322
2024-03-05 9.73 9.79 -0.006129 -0.015322
2024-03-06 9.64 9.79 -0.015322 -0.015322
2024-03-07 9.69 9.79 -0.010215 -0.015322
2024-03-08 9.69 9.79 -0.010215 -0.015322
2024-03-11 9.77 9.79 -0.002043 -0.015322
2024-03-12 9.86 9.86 0.000000 -0.015322
2024-03-13 9.64 9.86 -0.022312 -0.022312
2024-03-14 9.55 9.86 -0.031440 -0.031440
2024-03-15 9.89 9.89 0.000000 -0.031440
2024-03-18 9.84 9.89 -0.005056 -0.031440
2024-03-19 9.71 9.89 -0.018200 -0.031440
2024-03-20 9.75 9.89 -0.014156 -0.031440
2024-03-21 9.77 9.89 -0.012133 -0.031440
2024-03-22 9.67 9.89 -0.022245 -0.031440
2024-03-25 9.71 9.89 -0.018200 -0.022245
2024-03-26 9.89 9.89 0.000000 -0.022245
2024-03-27 9.83 9.89 -0.006067 -0.022245
2024-03-28 9.79 9.89 -0.010111 -0.022245
2024-03-29 9.82 9.89 -0.007078 -0.022245
2024-04-01 9.93 9.93 0.000000 -0.022245
2024-04-02 9.85 9.93 -0.008056 -0.018200
2024-04-03 9.76 9.93 -0.017120 -0.017120
2024-04-08 9.73 9.93 -0.020141 -0.020141
2024-04-09 9.71 9.93 -0.022155 -0.022155
2024-04-10 9.59 9.93 -0.034240 -0.034240
2024-04-11 9.57 9.93 -0.036254 -0.036254
2024-04-12 9.39 9.85 -0.046701 -0.046701
2024-04-15 9.60 9.76 -0.016393 -0.046701
2024-04-16 9.59 9.73 -0.014388 -0.046701
2024-04-17 9.91 9.91 0.000000 -0.046701
2024-04-18 10.08 10.08 0.000000 -0.046701
2024-04-19 9.98 10.08 -0.009921 -0.046701
2024-04-22 9.80 10.08 -0.027778 -0.046701
2024-04-23 9.84 10.08 -0.023810 -0.027778
2024-04-24 9.83 10.08 -0.024802 -0.027778
2024-04-25 9.90 10.08 -0.017857 -0.027778
2024-04-26 9.89 10.08 -0.018849 -0.027778
2024-04-29 10.09 10.09 0.000000 -0.027778
2024-04-30 10.07 10.09 -0.001982 -0.027778
这里我们需要说明的是由于时间周期为7天,所以roll_max并不是一直都取的close的最大值,我们可以看到
2024-04-11 9.57 9.93 -0.036254 -0.036254
2024-04-12 9.39 9.85 -0.046701 -0.046701
4月12日的roll_max比4月11日的roll_max小,实际上roll_max只是向上7天内的最大的close值。
现在我们将时间跨度拉大,时间周期为1年
from jqdatasdk import * import pandas as pd import matplotlib.pyplot as plt if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2023-01-01', end_date='2024-05-01', frequency='daily', panel=False) # 计算最大回撤 window = 255 # 选取时间周期,255天 # 选择时间周期中的最大净值 data['roll_max'] = data['close'].rolling(window=window, min_periods=1).max() # 计算当天回撤比=(谷值-峰值)/峰值=谷值/峰值-1 data['daily_dd'] = data['close'] / data['roll_max'] - 1 # 选取时间周期内最大的回撤比,即最大回撤,因为是负值,所以用min() data['max_dd'] = data['daily_dd'].rolling(window=window, min_periods=1).min() print(data[['close', 'roll_max', 'daily_dd', 'max_dd']]) # 画出当天回撤比,最大回撤比折线图 data[['daily_dd', 'max_dd']].plot() plt.show()
运行结果(部分)
auth success
close roll_max daily_dd max_dd
2023-01-03 12.55 12.55 0.000000 0.000000
2023-01-04 13.05 13.05 0.000000 0.000000
2023-01-05 13.19 13.19 0.000000 0.000000
2023-01-06 13.32 13.32 0.000000 0.000000
2023-01-09 13.48 13.48 0.000000 0.000000
2023-01-10 13.16 13.48 -0.023739 -0.023739
2023-01-11 13.37 13.48 -0.008160 -0.023739
2023-01-12 13.37 13.48 -0.008160 -0.023739
2023-01-13 13.62 13.62 0.000000 -0.023739
2023-01-16 13.74 13.74 0.000000 -0.023739
2023-01-17 13.64 13.74 -0.007278 -0.023739
2023-01-18 13.77 13.77 0.000000 -0.023739
2023-01-19 13.75 13.77 -0.001452 -0.023739
2023-01-20 13.79 13.79 0.000000 -0.023739
2023-01-30 13.80 13.80 0.000000 -0.023739
2023-01-31 13.66 13.80 -0.010145 -0.023739
2023-02-01 13.39 13.80 -0.029710 -0.029710
2023-02-02 13.30 13.80 -0.036232 -0.036232
...
计算风险收益指标:夏普比率
夏普比率(Sharpe Ratio):夏普指数,衡量的是一项投资在对其调整风险后,相对于无风险资产的收益表现。在1966年,由威廉⋅F⋅夏普提出,美国金融经济学学者,曾在1990年获得过诺贝尔经济学奖。
\(SharpeRatio={E(R_P)-R_f\over σ_P}\)
上式中\(E(R_P)\)表示期望的投资回报率;\(R_f\)表示无风险利率,指的是没有风险的资产所获的的回报,通常为国债年化回报3%左右;\(σ_P\)表示投资回报率标准差,指的是一种离散指标,体现数据样本内部的差异性,公式为
\(\sqrt{\sum_i^n(x_i-mean(x))^2\over n}\)
这里的\(x_i\)表示样本的每一个数据项,mean(x)为样本均值。它代表的是股票或者基金的波动很大,风险很大。
夏普比率整体代表着投资者额外承受的每一单位风险所获得的额外收益。该值越大越好,该值越大,大于1说明收益高于风险,小于1说明风险高于收益。
import numpy as np from jqdatasdk import * import pandas as pd if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取平安银行的行情数据(日K) data = get_price('000001.XSHE', start_date='2023-01-01', end_date='2024-05-01', frequency='daily', panel=False) # 计算夏普比率:sharp=(回报率的均值-无风险利率) / 回报率标准差 # 计算收盘价的百分比变化,回报率,等同于(当前-之前)/之前 daily_return = data['close'].pct_change() avg_return = daily_return.mean() # 回报率均值 sd_return = daily_return.std() # 回报率标准差 sharp = avg_return / sd_return # 每日夏普比率 sharp_year = sharp * np.sqrt(252) # 年化夏普比率 print(sharp, sharp_year)
运行结果
auth success
-0.04118789415018597 -0.6538375496870648
- 比较三支股票的夏普指数
import numpy as np from jqdatasdk import * import pandas as pd import matplotlib.pyplot as plt def calculate_sharp(data): ''' 计算夏普比率:sharp=(回报率的均值-无风险利率) / 回报率标准差 :param data: :return: ''' # 计算收盘价的百分比变化,回报率,等同于(当前-之前)/之前 daily_return = data['close'].pct_change() avg_return = daily_return.mean() # 回报率均值 sd_return = daily_return.std() # 回报率标准差 sharp = avg_return / sd_return # 每日夏普比率 sharp_year = sharp * np.sqrt(252) # 年化夏普比率 return sharp, sharp_year if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 获取3支股票的数据:比亚迪、宁德时代、隆基 codes = ['002594.XSHE', '300750.XSHE', '601012.XSHG'] sharps = [] for code in codes: data = get_price(code, start_date='2023-01-01', end_date='2024-05-01', frequency='daily', panel=False) daily_sharp, annual_sharp = calculate_sharp(data) sharps.append([code, annual_sharp]) sharps = pd.DataFrame(sharps, columns=['code', 'sharp']).set_index('code') print(sharps) # 绘制三支股票夏普值的条形图 sharps.plot.bar(title='Compare Annul Sharp Ratio') plt.xticks(rotation=30) plt.show()
运行结果
auth success
sharp
code
002594.XSHE -0.326931
300750.XSHE 0.091455
601012.XSHG -1.614862
通过上图,我们可以看出这三支股票中,宁德时代在23年到24年4月的风险收益是最高的。
设计交易策略:择时策略
均线策略
均线:由美国投资专家Joseph E.Granville 1962年提出,利用股价和均线择时。代表过去n日股价平均走势。如
\(5日均线={第1天价格+...+第5天价格\over 5天}\)
一般是每日的收盘价。如果是日内交易,分时的,那么价格可能是每分钟、每小时的最终价格。这里得到的只是一个值,叫做5日均线值,通过不断的计算近5日均线的点位,连点成线,就形成了均线。
- 双均线策略
上图是五粮液的2024年的日K图,我们用红色框标记出来的MA5为5日均线,MA10为10日均线,MA20为20日均线,MA30为30日均线,MA60为60日均线。我们可以看到近期处于一个暴跌的走势,首先我们可以看到MA60,它是最长期的均线,比较滞后,它离主体K线图是最远的;MA5是最及时的,周期最短的,最能反映近期的情况,基本上是贴着K线图走的;其次是MA10,它贴着K线图也是比较近的;再就是MA20和MA30。
结合之前的暴涨和现在的暴跌,MA60是比较平缓的,这是MA60和其他均线非常不一样的原因。在做择时策略的时候,通常我们挑的均线周期越短,则买卖的周期就会越短,比如说1周;如果我们挑的均线周期越长,则买卖的周期就会越长,比如说1个月甚至更长。这和交易的频次有关系,和市场行情的表现有关系,和股价的表现有关系。
现在我们挑选MA5和MA30来做择时策略(双均线策略)
在上图中,我们可以看到MA5和MA10有一个交叉点,是MA5上穿MA10,是较短周期的均线上穿了较长周期的均线,这个点位称为金叉。也就是短期的均价超过了长期的均价,从市场层面来看,短期的做多趋势大于做空的趋势,也就是股价要涨。
在上图中,我们可以看到MA5和MA10也有一个交叉点,是MA5下穿MA10,是较短周期的均线下穿了较长周期的均线,这个点位称为死叉。也就是长期的均价超过了短期的均价,从市场层面来看,短期的做空趋势大于做多的趋势,也就是股价要跌。
利用金叉和死叉,我们就可以买入和卖出。策略实现思路为:
- 获取标的行情
- 计算技术指标,移动平均线:5日、10日等等.....
- 生成交易信号,金叉买入、死叉卖出。
- 计算收益率,包括单次收益率和累计收益率。
- 寻找最优参数,如均线周期、投资标的。
- 与市场基准比较,如沪深300、上证、中证500。
- 策略评估,如收益率、夏普比、波动率、最大回撤、胜率(指的是赚钱的次数占总次数的比率,一般在50%到60%)。
import numpy as np from jqdatasdk import * import pandas as pd def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) data = get_price('000001.XSHE', start_date='2023-01-01', end_date='2024-05-01', frequency='daily', panel=False) data = ma_strategy(data) # 筛选有信号点 data = data[data['signal'] != 0] print('开仓次数', int(len(data) / 2)) print(data[['close', 'short_ma', 'long_ma', 'signal']])
运行结果
auth success
开仓次数 11
close short_ma long_ma signal
2023-02-06 12.76 13.232 13.3880 -1
2023-03-03 13.02 12.786 12.7190 1
2023-03-09 12.03 12.494 12.6230 -1
2023-04-18 11.84 11.598 11.5520 1
2023-04-25 11.19 11.386 11.4920 -1
2023-05-08 12.14 11.620 11.5000 1
2023-05-17 11.38 11.556 11.5580 -1
2023-07-17 10.56 10.576 10.5680 1
2023-07-24 10.51 10.544 10.5460 -1
2023-07-25 10.94 10.632 10.5665 1
2023-08-16 10.95 11.048 11.1105 -1
2024-01-03 8.59 8.656 8.6255 1
2024-01-08 8.54 8.576 8.5920 -1
2024-01-16 8.72 8.588 8.5810 1
2024-01-23 8.55 8.560 8.5885 -1
2024-01-25 8.87 8.636 8.6175 1
2024-03-15 9.89 9.742 9.7450 -1
2024-03-21 9.77 9.792 9.7695 1
2024-03-25 9.71 9.722 9.7405 -1
2024-03-26 9.89 9.758 9.7450 1
2024-04-10 9.59 9.728 9.7645 -1
2024-04-19 9.98 9.832 9.7585 1
这里我们可以看到第一个买入信号1,是2023年3月3日,对比K线图
我们会发现该日5日均线确实上穿了20日均线。但是我们会发现3月9日就出现了死叉
如果我们此时卖出,反而是亏的。说明策略不一定一直有效,此时我们要做出调整,并不是说看见无效的情况就丢弃,而是要基于这个基础之上进行优化,比如做止损优化,调参优化(如更换两条均线的周期,如换成MA5和MA10去比)。这里先不讨论。
- 计算信号收益率
import numpy as np from jqdatasdk import * import pandas as pd def calculate_prof_pct(data): ''' 计算单次收益 :param data: :return: ''' data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) # 收益率,等同于(当前-之前)/之前 data['profit_pct'] = data['close'].pct_change() # 只需要卖出的收益率 data = data[data['signal'] == -1] return data def calculate_cum_prof(data): ''' 计算累计收益 :param data: :return: ''' data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 return data def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) # 计算单次收益 data = calculate_prof_pct(data) # 计算累计收益 data = calculate_cum_prof(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) data = get_price('000001.XSHE', start_date='2023-01-01', end_date='2024-05-01', frequency='daily', panel=False) data = ma_strategy(data) # print('开仓次数', int(len(data) / 2)) print(data[['close', 'signal', 'profit_pct', 'cum_profit']])
运行结果
auth success
close signal profit_pct cum_profit
2023-02-06 12.76 -1 NaN NaN
2023-03-09 12.03 -1 -0.076037 -0.076037
2023-04-25 11.19 -1 -0.054899 -0.126761
2023-05-17 11.38 -1 -0.062603 -0.181429
2023-07-24 10.51 -1 -0.004735 -0.185304
2023-08-16 10.95 -1 0.000914 -0.184560
2024-01-08 8.54 -1 -0.005821 -0.189306
2024-01-23 8.55 -1 -0.019495 -0.205111
2024-03-15 9.89 -1 0.114994 -0.113703
2024-03-25 9.71 -1 -0.006141 -0.119146
2024-04-10 9.59 -1 -0.030334 -0.145866
由结果,我们可以看出从2023年到2024年4月总的累积收益率是负的14.6%,也就是说我们不但没有赚钱还亏钱,这里有两个方向,第一个方向是投资标的的问题,这里我们投的是平安银行,也许这一支股票不赚钱但是不代表其他股票不赚钱,对于某些股票很烂,一直下跌,很难赚钱。如果一直开仓、平仓周期很短,很难抓到长期的趋势。又或者波动很小,很难有一个买入卖出点。这里的时间是一年四个月,正常的策略回测可能取的是3到5年,越近的有效性越高,越长越容易了解该股的趋势性;另一方面就是策略是否有效的问题,这里只是测的是MA5和MA20的金叉、死叉,如果我们加入了一些其他的辅助的方式,比如说止损策略,它最终的累计收益率的结果又会不同。
对于第一个方向,我们可以使用多支股票来进行测试,并且延长交易的时间
import numpy as np from jqdatasdk import * import pandas as pd import matplotlib.pyplot as plt def calculate_prof_pct(data): ''' 计算单次收益 :param data: :return: ''' data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) # 收益率,等同于(当前-之前)/之前 data['profit_pct'] = data['close'].pct_change() # 只需要卖出的收益率 data = data[data['signal'] == -1] return data def calculate_cum_prof(data): ''' 计算累计收益 :param data: :return: ''' data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 return data def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) # 计算单次收益 data = calculate_prof_pct(data) # 计算累计收益 data = calculate_cum_prof(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 平安银行、五粮液、比亚迪 stocks = ['000001.XSHE', '000858.XSHE', '002594.XSHE'] # 存放累计收益率 cum_profits = pd.DataFrame() for code in stocks: data = get_price(code, start_date='2019-01-01', end_date='2024-01-01', frequency='daily', panel=False) data = ma_strategy(data) cum_profits[code] = data['cum_profit'].reset_index(drop=True) print('开仓次数:', len(data)) print(cum_profits) cum_profits.plot() plt.title('Comparison of Ma Strategy Profits') plt.show()
运行结果
auth success
开仓次数: 34
开仓次数: 33
开仓次数: 40
000001.XSHE 000858.XSHE 002594.XSHE
0 0.101053 0.572578 NaN
1 0.060980 0.419285 0.015656
2 0.171173 0.628251 -0.006533
3 0.127689 0.693723 -0.038171
4 0.064470 0.653854 -0.117529
5 0.195224 0.631528 -0.117529
6 0.210504 0.394660 -0.158473
7 0.148244 0.334218 -0.185948
8 0.149266 0.156963 -0.190120
9 0.167508 0.974205 0.081976
10 0.112144 0.942267 0.092778
11 0.054119 1.040683 0.557437
12 0.103675 1.134788 2.095945
13 0.182731 1.086764 2.029389
14 0.170013 0.863219 2.520753
15 0.336079 0.800270 2.375753
16 0.260904 0.948485 2.302132
17 0.283762 0.868942 3.276296
18 0.187119 0.846104 4.063234
19 0.020110 1.058119 4.444919
20 -0.052672 0.935974 4.313736
21 -0.091069 0.944996 3.715171
22 -0.163122 1.226222 3.549445
23 -0.196488 1.040772 3.306997
24 -0.214803 1.067218 4.819191
25 -0.216018 1.729220 4.762849
26 -0.218808 1.583998 4.520381
27 -0.114499 1.444360 4.403016
28 -0.099682 1.315695 3.910924
29 -0.168139 1.184578 3.833190
30 -0.213807 1.171091 4.119964
31 -0.263025 1.127741 3.898140
32 -0.266515 1.118122 3.633480
33 -0.265844 NaN 3.687981
这里我们可以看到对于平安银行、五粮液、比亚迪三支股票从2019年到2023年5年的时间里,它们的累计收益分别为-26.6%,118.8%,368.8%。
验证策略的可靠性
双均线策略是一种基于不同周期平均价格的突破型策略。如何验证策略的可靠性,比如策略A:100次开仓、平仓,90次亏钱,10次赚钱,最终收益为正。
我们不敢保证这个策略A是一个可靠的策略,需要进行验证。简单来讲可以去看一些评估指标,比如胜率、年化收益、最大回撤、夏普......。比如年化收益还不错,但是胜率很低,夏普也不高(低于1),那么这个策略A可能不稳定,风险较高,比较适合特殊的行情,比如大牛市。
除上面说的简单检验方法,还可以使用统计学中的假设检验方法来进行判断收益>0是否为大概率事件。有关假设检验的内容可以参考统计学整理(二) 中的假设检验 (Hypothesis Testing)。
这里我们以周四买入,周一卖出的周期策略为例来看看该如何进行假设检验
上图是该周期策略的频数直方图,横轴为每日收益率,纵轴为频数。样本数count=773,收益率的均值mean=0.003749,标准差std=0.03988,最小值min=-0.141176,最大值max=0.209091。我们可以看到它整体呈一种正态分布的趋势,但是它的整体方差未知,故而使用t检验来进行假设检验。
- \(H_0\):μ=0
- \(H_A\):μ>0
这里我们的零假设是收益率的总体均值为0,表示不赚也不亏;备择假设为收益率的总体均值>0,赚钱。构建T统计量
\(T={mean(X)-μ\over {S\over \sqrt{n}}}\)~t(n-1)
计算得
\({mean(X)-μ\over {S\over \sqrt{n}}}={0.003749-0\over {0.03988\over \sqrt{773}}}=2.61366569\)
这里我们使用程序来计算整个过程
import math from scipy.stats import t def t_test(tail, mu): ''' t检验(方差未知) :param mu: 总体均值 :return: ''' assert tail in ['both', 'left', 'right'], 'tail should be one of "both", "left", "right"' mean_val = 0.003749 # 样本均值 n = 773 # 样本容量 df = n - 1 # t分布的自由度 s = 0.03988 # 样本标准差 se = s / math.sqrt(n) # 标准误 t_value = (mean_val - mu) / se if tail == 'both': p_value = 2 * (1 - t.cdf(abs(t_value), df)) elif tail == 'left': p_value = t.cdf(t_value, df) else: p_value = 1 - t.cdf(t_value, df) return t_value, p_value if __name__ == '__main__': print(t_test(tail='right', mu=0))
运行结果
(2.613665695358198, 0.0045660672538097025)
由于我们的备择假设是μ>0,故使用右尾检验。由结果可知,p-value=0.0045660672538097025<0.05,拒绝\(H_0\),故收益率的总体均值>0,是赚钱的。
- 对双均线策略的统计检验
首先我们需要知道数据总体的分布情况,可以通过频率直方图来进行观察。
import numpy as np from jqdatasdk import * import pandas as pd import matplotlib.pyplot as plt from scipy.stats import shapiro def calculate_prof_pct(data): ''' 计算单次收益 :param data: :return: ''' data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) # 收益率,等同于(当前-之前)/之前 data['profit_pct'] = data['close'].pct_change() # 只需要卖出的收益率 data = data[data['signal'] == -1] return data def calculate_cum_prof(data): ''' 计算累计收益 :param data: :return: ''' data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 return data def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) # 计算单次收益 data = calculate_prof_pct(data) # 计算累计收益 data = calculate_cum_prof(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) start_date = get_security_info('000001.XSHE').start_date data = get_price('000001.XSHE', start_date=start_date, end_date='2024-01-01', frequency='daily', panel=False) data = ma_strategy(data) # 这里我们的数据为单日收益率 data_return = data['profit_pct'].dropna() print(data_return) # 正态性检验 stat, p = shapiro(data_return) print(stat, p) # 画出频率直方图 plt.hist(data_return, bins=30) plt.show()
运行结果
auth success
2005-03-04 -0.037879
2005-04-27 -0.072581
2005-06-01 -0.032520
2005-06-30 -0.084615
2005-08-22 0.016807
2005-09-21 -0.039683
2005-11-01 -0.102362
2006-01-17 0.098214
2006-02-13 -0.023622
2006-03-08 0.015873
2006-06-13 0.092308
2006-07-19 -0.111801
2007-03-02 1.563380
2007-07-04 0.442500
2007-08-21 0.264881
2007-08-30 -0.017730
2007-11-12 0.096659
2007-12-17 -0.112885
2008-01-22 -0.082558
2008-04-15 -0.093248
2008-05-21 -0.055195
2008-07-17 -0.108460
2008-08-11 -0.072052
2008-09-01 -0.060674
2008-11-28 -0.081851
2008-12-26 -0.105769
2009-04-20 0.521311
2009-05-26 0.018672
2009-07-27 0.262357
2009-08-11 -0.030702
2009-09-23 -0.057143
2009-11-26 0.118033
2009-12-11 0.004196
2009-12-21 -0.076398
2010-02-24 0.006452
2010-03-18 0.026357
2010-03-24 -0.015038
2010-04-09 -0.032689
2010-07-05 -0.056285
2010-09-13 -0.061185
2010-11-10 0.009690
2011-01-18 -0.063694
2011-03-16 -0.004348
2011-05-06 0.063291
2011-06-01 -0.025292
2011-07-25 -0.010204
2011-08-23 -0.024490
2011-09-06 -0.060000
2011-09-26 -0.059184
2011-11-16 -0.041580
2011-12-13 -0.008791
2012-02-20 0.041850
2012-03-13 -0.004115
2012-05-10 -0.002151
2012-07-11 -0.018391
2012-07-20 -0.011574
2012-08-21 -0.025229
2012-10-30 -0.013021
2012-11-19 -0.033163
2013-02-21 0.399015
2013-03-19 -0.067365
2013-03-28 -0.127820
2013-06-07 -0.035836
2013-07-24 -0.059794
2013-07-30 0.004435
2013-09-30 0.198276
2013-10-15 -0.022260
2013-11-28 0.047697
2013-12-05 -0.023328
2014-02-24 -0.064516
2014-04-21 -0.007937
2014-05-06 -0.024762
2014-07-09 0.045714
2014-08-20 0.025818
2014-09-15 -0.023295
2014-10-27 -0.015544
2014-11-20 0.032423
2015-01-13 0.298600
2015-03-05 -0.030573
2015-05-06 0.303249
2015-06-02 -0.051528
2015-06-17 -0.035619
2015-09-23 -0.023841
2015-11-27 0.053455
2015-12-31 -0.041763
2016-02-29 -0.071932
2016-04-22 0.015363
2016-05-06 -0.017615
2016-09-07 0.091413
2016-11-04 -0.014194
2016-12-15 0.007792
2017-03-07 0.033898
2017-08-11 0.117955
2017-09-19 0.002116
2017-10-26 -0.032553
2017-11-06 -0.024390
2017-12-05 0.116371
2018-01-09 -0.032174
2018-02-01 0.035559
2018-02-07 -0.077246
2018-05-03 -0.066327
2018-08-07 0.006353
2018-08-14 -0.023839
2018-09-14 0.050680
2018-10-15 -0.053145
2018-11-12 -0.052960
2019-03-25 0.198167
2019-05-06 -0.036395
2019-07-23 0.103860
2019-08-06 -0.037129
2019-08-28 -0.056061
2019-11-12 0.122835
2020-01-16 0.012784
2020-03-02 -0.051433
2020-04-17 0.000890
2020-05-18 0.015873
2020-06-16 -0.047421
2020-07-24 -0.052174
2020-09-29 0.047012
2020-11-13 0.071629
2020-12-10 -0.010753
2021-02-23 0.141935
2021-04-13 -0.056266
2021-06-15 0.018128
2021-08-27 -0.075281
2021-09-23 -0.140684
2021-11-02 -0.071347
2021-12-16 -0.040532
2022-01-28 -0.079272
2022-02-16 -0.039869
2022-04-25 -0.022794
2022-07-12 -0.001547
2022-09-22 -0.003559
2022-12-22 0.133525
2023-02-06 0.016733
2023-03-09 -0.076037
2023-04-25 -0.054899
2023-05-17 -0.062603
2023-07-24 -0.004735
2023-08-16 0.000914
Name: profit_pct, dtype: float64
0.49042731523513794 5.024614280664747e-20
无论是频率直方图还是正态性检验,我们都可以看出来该数据分布并不符合正态分布。我们先假设其符合正态分布,来看一下t检验的结果,之后使用非参数的威尔科克森符号秩检验来进行重新检验。有关威尔科克森符号秩检验的内容可以参考统计学整理(四) 中的单样本 / 配对 t 检验 <=> 威尔科克森符号秩检验 (Wilcoxon signed-rank test)。
import numpy as np from jqdatasdk import * import pandas as pd from scipy.stats import ttest_1samp def calculate_prof_pct(data): ''' 计算单次收益 :param data: :return: ''' data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) # 收益率,等同于(当前-之前)/之前 data['profit_pct'] = data['close'].pct_change() # 只需要卖出的收益率 data = data[data['signal'] == -1] return data def calculate_cum_prof(data): ''' 计算累计收益 :param data: :return: ''' data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 return data def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) # 计算单次收益 data = calculate_prof_pct(data) # 计算累计收益 data = calculate_cum_prof(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) start_date = get_security_info('000001.XSHE').start_date data = get_price('000001.XSHE', start_date=start_date, end_date='2024-01-01', frequency='daily', panel=False) data = ma_strategy(data) # 这里我们的数据为单日收益率 data_return = data['profit_pct'].dropna() # t检验 t, p = ttest_1samp(data_return, 0) # 单尾检验 p = p / 2 print(t, p)
运行结果
auth success
1.1427300912583633 0.12755756478725003
由结果可知,p值0.12755756478725003>0.05,故接受\(H_0\),即既不赚钱也不亏钱。但由于我们知道数据整体并不呈现正态分布,故而这个假设检验是有很大问题的。
import numpy as np from jqdatasdk import * import pandas as pd from scipy.stats import wilcoxon def calculate_prof_pct(data): ''' 计算单次收益 :param data: :return: ''' data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) # 收益率,等同于(当前-之前)/之前 data['profit_pct'] = data['close'].pct_change() # 只需要卖出的收益率 data = data[data['signal'] == -1] return data def calculate_cum_prof(data): ''' 计算累计收益 :param data: :return: ''' data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 return data def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) # 计算单次收益 data = calculate_prof_pct(data) # 计算累计收益 data = calculate_cum_prof(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) start_date = get_security_info('000001.XSHE').start_date data = get_price('000001.XSHE', start_date=start_date, end_date='2024-01-01', frequency='daily', panel=False) data = ma_strategy(data) # 这里我们的数据为单日收益率 data_return = data['profit_pct'].dropna() # 威尔科克森符号秩检验 t, p = wilcoxon(data_return) # 单尾检验 p = p / 2 print(t, p)
运行结果
auth success
3898.0 0.015501358727512897
由结果可知,p值0.015501358727512897<0.05,拒绝\(H_0\),即赚钱。
寻找最优参数
这里我们要寻找的参数包括股票标的,均线周期。
import numpy as np from jqdatasdk import * import pandas as pd from numexpr.expressions import long_ from scipy.stats import wilcoxon def calculate_prof_pct(data): ''' 计算单次收益 :param data: :return: ''' data = data[data['signal'] != 0] # 这里只接受一买一卖 to_exclude_indices = [] for i in range(len(data)): if i + 1 < len(data): if data['signal'][i] == -1: if data['signal'][i + 1] == -1: to_exclude_indices.append(data.index[i]) to_exclude_indices.append(data.index[i + 1]) data = data.drop(to_exclude_indices) # 收益率,等同于(当前-之前)/之前 data['profit_pct'] = data['close'].pct_change() # 只需要卖出的收益率 data = data[data['signal'] == -1] return data def calculate_cum_prof(data): ''' 计算累计收益 :param data: :return: ''' data['cum_profit'] = (1 + data['profit_pct']).cumprod() - 1 return data def compos_signal(data): ''' 整合信号 :param data: :return: ''' data['buy_signal'] = np.where((data['buy_signal'] == 1) & (data['buy_signal'].shift(1) == 1), 0, data['buy_signal']) data['sell_signal'] = np.where((data['sell_signal'] == -1) & (data['sell_signal'].shift(1) == -1), 0, data['sell_signal']) data['signal'] = data['buy_signal'] + data['sell_signal'] return data def ma_strategy(data, short_window=5, long_window=20): ''' 双均线策略 :param data: 交易数据 :param short_window: 短期均线时间 :param long_window: 长期均线时间 :return: ''' print('========当前周期参数对:', short_window, long_window) # 短期均线 data['short_ma'] = data['close'].rolling(window=short_window).mean() # 长期均线 data['long_ma'] = data['close'].rolling(window=long_window).mean() # 生成信号:金叉买入、死叉卖出 data['buy_signal'] = np.where(data['short_ma'] > data['long_ma'], 1, 0) data['sell_signal'] = np.where(data['short_ma'] < data['long_ma'], -1, 0) # 过滤信号 data = compos_signal(data) # 计算单次收益 data = calculate_prof_pct(data) # 计算累计收益 data = calculate_cum_prof(data) data.drop(labels=['buy_signal', 'sell_signal'], axis=1) return data if __name__ == '__main__': auth('账户', '密码') pd.set_option('display.max_rows', 5000) pd.set_option('display.max_columns', 100) # 股票池 stocks = ['000001.XSHE'] # 周期参数 params = [5, 10, 20, 60, 120, 250] # 存放参数与收益 res = [] for code in stocks: for short in params: for long in params: if long > short: data = get_price(code, start_date='2019-01-01', end_date='2024-01-01', frequency='daily', panel=False) data = ma_strategy(data, short_window=short, long_window=long) print(data[['close', 'short_ma', 'long_ma', 'signal', 'cum_profit']]) # 获取周期参数,及其对应累计收益值(最后一行) cum_profit = data['cum_profit'].iloc[-1] res.append([short, long, cum_profit]) res = pd.DataFrame(res, columns=['short_window', 'long_window', 'cum_profit']) # 对累积收益进行排序(倒序) res = res.sort_values(by='cum_profit', ascending=False) print(res)
运行结果
auth success
========当前周期参数对: 5 10
close short_ma long_ma signal cum_profit
2019-03-12 10.68 10.852 10.917 -1 0.206780
2019-03-26 10.45 10.752 10.819 -1 0.141253
2019-04-26 11.91 12.194 12.292 -1 0.177844
2019-05-23 10.62 10.726 10.826 -1 0.169038
2019-07-10 11.84 11.984 12.069 -1 0.274531
2019-07-23 12.01 12.038 12.040 -1 0.280931
2019-08-05 11.65 12.170 12.228 -1 0.231258
2019-08-22 12.49 12.848 12.923 -1 0.165031
2019-09-17 12.43 12.656 12.685 -1 0.137575
2019-10-22 14.33 14.546 14.581 -1 0.217435
2019-11-01 14.72 14.512 14.547 -1 0.214136
2019-11-05 14.97 14.600 14.613 -1 0.230576
2019-11-12 14.26 14.514 14.557 -1 0.184876
2019-12-27 14.52 14.326 14.341 -1 0.285830
2020-01-14 14.63 14.646 14.719 -1 0.300048
2020-02-27 13.19 13.262 13.303 -1 0.306984
2020-03-12 12.82 12.854 12.895 -1 0.299886
2020-04-07 11.24 11.198 11.242 -1 0.292984
2020-05-14 11.61 11.990 12.012 -1 0.334360
2020-06-12 11.54 11.876 11.938 -1 0.280009
2020-07-15 12.67 13.184 13.217 -1 0.392079
2020-08-25 12.97 13.002 13.016 -1 0.477517
2020-09-25 13.49 13.742 13.774 -1 0.483014
2020-11-02 15.66 15.726 15.752 -1 0.628612
2020-11-11 15.82 15.826 15.855 -1 0.583567
2020-12-08 16.62 17.066 17.241 -1 0.572215
2020-12-21 16.23 16.576 16.590 -1 0.565463
2021-02-19 21.18 21.552 21.638 -1 0.944664
2021-03-10 18.12 19.202 19.333 -1 0.776074
2021-03-23 18.85 18.860 18.880 -1 0.734663
2021-04-09 18.92 19.126 19.184 -1 0.678763
2021-05-14 20.87 20.872 20.896 -1 0.714919
2021-06-03 21.27 21.530 21.628 -1 0.710897
2021-06-15 20.78 21.474 21.514 -1 0.611624
2021-07-02 19.52 20.182 20.358 -1 0.542860
2021-08-24 17.33 17.728 17.744 -1 0.567278
2021-09-22 16.09 16.912 17.250 -1 0.464431
2021-11-01 17.35 17.646 17.682 -1 0.463587
2021-11-23 16.00 16.120 16.175 -1 0.419236
2021-12-16 15.86 16.020 16.189 -1 0.362535
2022-01-17 14.52 15.028 15.150 -1 0.285511
2022-01-28 14.17 14.826 14.925 -1 0.183606
2022-02-17 14.70 14.820 14.830 -1 0.137190
2022-04-18 14.23 14.336 14.407 -1 0.190744
2022-05-26 12.70 13.036 13.062 -1 0.155267
2022-06-23 12.71 12.786 12.795 -1 0.143571
2022-07-08 13.01 13.126 13.155 -1 0.135714
2022-09-07 11.23 11.392 11.426 -1 0.156307
2022-09-21 11.33 11.460 11.478 -1 0.129393
2022-11-24 10.72 10.652 10.692 -1 0.221705
2022-12-16 12.15 12.028 12.134 -1 0.379527
2023-02-02 13.30 13.588 13.646 -1 0.545721
2023-03-02 12.97 12.708 12.709 -1 0.566250
2023-03-09 12.03 12.494 12.601 -1 0.493026
2023-04-12 11.37 11.462 11.477 -1 0.469758
2023-04-25 11.19 11.386 11.492 -1 0.389071
2023-05-16 11.50 11.620 11.702 -1 0.358360
2023-06-15 10.84 10.766 10.826 -1 0.333752
2023-07-10 10.45 10.522 10.532 -1 0.317364
2023-07-21 10.58 10.554 10.554 -1 0.319859
2023-08-10 11.35 11.366 11.386 -1 0.369323
2023-09-04 10.79 10.540 10.543 -1 0.397824
2023-09-13 10.50 10.540 10.575 -1 0.380729
2023-10-09 10.37 10.428 10.429 -1 0.370159
2023-11-13 9.57 9.732 9.774 -1 0.340738
========当前周期参数对: 5 20
close short_ma long_ma signal cum_profit
2019-03-25 10.46 10.872 10.8725 -1 0.101053
2019-05-06 11.12 11.878 12.0455 -1 0.060980
2019-07-23 12.01 12.038 12.0460 -1 0.171173
2019-08-06 11.67 11.994 12.1170 -1 0.127689
2019-08-28 12.46 12.534 12.5705 -1 0.064470
2019-11-12 14.26 14.514 14.5715 -1 0.195224
2020-01-16 14.26 14.542 14.5450 -1 0.210504
2020-03-02 12.91 12.996 13.0510 -1 0.148244
2020-04-17 11.25 11.156 11.1595 -1 0.149266
2020-05-18 11.52 11.724 11.7520 -1 0.167508
2020-06-16 11.45 11.594 11.7085 -1 0.112144
2020-07-24 11.99 12.636 12.7435 -1 0.054119
2020-09-29 13.14 13.508 13.6015 -1 0.103675
2020-11-13 15.26 15.736 15.7665 -1 0.182731
2020-12-10 16.56 16.746 16.8300 -1 0.170013
2021-02-23 19.47 20.650 20.8035 -1 0.336079
2021-04-13 18.45 18.824 18.9430 -1 0.260904
2021-06-15 20.78 21.474 21.5595 -1 0.283762
2021-08-27 16.46 16.946 17.1085 -1 0.187119
2021-09-23 15.82 16.608 16.7685 -1 0.020110
2021-11-02 16.27 17.310 17.3155 -1 -0.052672
2021-12-16 15.86 16.020 16.0350 -1 -0.091069
2022-01-28 14.17 14.826 15.0490 -1 -0.163122
2022-02-16 14.69 14.922 14.9250 -1 -0.196488
2022-04-25 13.29 14.030 14.0720 -1 -0.214803
2022-07-12 12.91 12.954 13.0090 -1 -0.216018
2022-09-22 11.20 11.332 11.4505 -1 -0.218808
2022-12-22 11.80 11.840 11.8820 -1 -0.114499
2023-02-06 12.76 13.232 13.3880 -1 -0.099682
2023-03-09 12.03 12.494 12.6230 -1 -0.168139
2023-04-25 11.19 11.386 11.4920 -1 -0.213807
2023-05-17 11.38 11.556 11.5580 -1 -0.263025
2023-07-24 10.51 10.544 10.5460 -1 -0.266515
2023-08-16 10.95 11.048 11.1105 -1 -0.265844
========当前周期参数对: 5 60
close short_ma long_ma signal cum_profit
2019-05-10 10.95 10.932 11.105500 -1 -0.051127
2019-11-26 13.64 13.746 13.808667 -1 0.098696
2020-01-22 14.05 14.190 14.202167 -1 0.074229
2020-05-14 11.61 11.990 11.997833 -1 0.023957
2020-06-17 11.41 11.480 11.552500 -1 -0.028815
2020-07-29 12.02 12.012 12.056167 -1 -0.077182
2021-03-12 19.08 18.758 18.871167 -1 0.411977
2021-03-19 18.18 18.944 19.057000 -1 0.363237
2021-06-23 20.71 20.410 20.432833 -1 0.365214
2021-06-29 19.99 20.532 20.536167 -1 0.305148
2021-11-03 16.14 16.972 17.018000 -1 0.225427
2022-04-25 13.29 14.030 14.086833 -1 0.109395
2022-07-07 12.91 13.194 13.233500 -1 0.073635
2022-11-21 10.44 10.672 10.723167 -1 0.061435
2023-03-08 12.33 12.682 12.697667 -1 0.180116
2023-08-21 10.57 10.812 10.815667 -1 0.090370
========当前周期参数对: 5 120
close short_ma long_ma signal cum_profit
2020-02-03 12.21 13.632 13.726083 -1 -0.013732
2020-07-29 12.02 12.012 12.082917 -1 -0.148352
2021-07-05 19.74 20.052 20.055667 -1 0.375739
2021-07-08 19.25 19.816 20.127667 -1 0.298822
2023-03-20 11.45 11.674 11.732250 -1 0.245520
2023-08-07 11.35 11.384 11.385417 -1 0.231416
2023-08-11 11.10 11.290 11.343250 -1 0.203232
========当前周期参数对: 5 250
close short_ma long_ma signal cum_profit
2020-03-16 12.00 12.642 12.71708 -1 -0.181446
2020-07-17 12.56 12.812 12.87036 -1 -0.265640
2020-08-26 12.76 12.872 12.90276 -1 -0.303314
2021-07-27 15.90 17.452 17.53100 -1 -0.175795
2021-08-23 17.27 17.784 17.88460 -1 -0.228927
2023-03-13 11.89 12.138 12.22820 -1 -0.311707
========当前周期参数对: 10 20
close short_ma long_ma signal cum_profit
2019-03-21 10.96 10.835 10.8460 -1 0.153684
2019-05-07 11.19 12.016 12.0245 -1 0.118694
2019-07-19 12.21 12.002 12.0125 -1 0.235014
2019-09-02 12.62 12.570 12.6385 -1 0.256925
2019-11-04 14.77 14.549 14.5555 -1 0.448111
2019-11-08 14.54 14.640 14.6495 -1 0.406515
2019-11-15 14.26 14.508 14.5275 -1 0.407502
2020-01-21 13.97 14.455 14.5215 -1 0.365473
2020-03-06 13.12 13.051 13.1040 -1 0.346993
2020-04-17 11.25 11.148 11.1595 -1 0.349392
2020-04-21 11.74 11.231 11.2365 -1 0.396989
2020-05-21 11.70 11.817 11.8265 -1 0.415132
2020-06-19 11.37 11.632 11.6755 -1 0.329756
2020-07-24 11.99 12.724 12.7435 -1 0.145386
2020-10-13 14.26 13.670 13.6985 -1 0.297316
2020-11-17 15.83 15.760 15.7745 -1 0.396092
2020-12-14 16.77 16.954 16.9565 -1 0.398594
2021-02-26 18.99 20.539 20.7555 -1 0.529033
2021-04-15 18.08 18.824 18.8620 -1 0.448136
2021-06-15 20.78 21.514 21.5595 -1 0.477283
2021-08-31 15.93 17.056 17.0915 -1 0.317644
2021-09-28 16.08 16.581 16.6290 -1 0.212806
2021-11-04 15.99 17.258 17.3075 -1 0.123567
2021-12-23 15.50 15.831 15.9320 -1 0.058680
2022-04-27 14.01 14.063 14.0965 -1 0.128775
2022-07-15 11.85 12.780 12.8730 -1 0.042556
2022-09-26 10.93 11.403 11.4075 -1 0.008419
2022-12-23 11.83 11.902 11.9190 -1 0.095463
2023-02-08 12.79 13.324 13.3950 -1 0.073638
2023-03-09 12.03 12.601 12.6230 -1 -0.007998
2023-04-26 11.04 11.459 11.4680 -1 -0.064757
2023-05-23 11.12 11.450 11.4615 -1 -0.111878
2023-08-18 10.79 11.083 11.1325 -1 -0.094250
2023-09-19 10.46 10.532 10.5385 -1 -0.101125
========当前周期参数对: 10 60
close short_ma long_ma signal cum_profit
2019-05-15 11.16 11.139 11.161500 -1 -0.032929
2019-11-29 13.35 13.780 13.860167 -1 0.112965
2020-02-03 12.21 14.061 14.156167 -1 -0.045024
2020-05-18 11.52 11.915 11.937500 -1 -0.075519
2020-06-22 11.22 11.544 11.575333 -1 -0.139197
2020-08-05 12.22 12.054 12.055333 -1 -0.244324
2021-03-18 19.30 19.017 19.034500 -1 0.177123
2021-06-29 19.99 20.482 20.536167 -1 0.134556
2021-11-08 15.59 16.801 17.011333 -1 0.009573
2022-04-29 13.71 13.929 13.987000 -1 -0.036125
2023-02-28 12.56 12.606 12.625167 -1 0.091639
2023-03-08 12.33 12.678 12.697667 -1 0.042595
2023-08-24 10.39 10.755 10.794667 -1 -0.045589
========当前周期参数对: 10 120
close short_ma long_ma signal cum_profit
2020-02-05 12.77 13.667 13.736167 -1 0.031502
2020-08-06 12.34 12.044 12.049083 -1 -0.090804
2021-07-09 19.04 19.951 20.139417 -1 0.422439
2023-03-23 11.75 11.720 11.740167 -1 0.355528
2023-08-14 10.89 11.291 11.332000 -1 0.300590
========当前周期参数对: 10 250
close short_ma long_ma signal cum_profit
2020-03-17 11.71 12.692 12.71988 -1 -0.201228
2020-07-23 12.44 12.845 12.88372 -1 -0.248357
2021-07-30 15.83 17.247 17.56716 -1 -0.072602
2023-03-16 11.68 12.163 12.20560 -1 -0.176899
========当前周期参数对: 20 60
close short_ma long_ma signal cum_profit
2019-05-23 10.62 11.2435 11.262833 -1 -0.079723
2019-12-05 13.47 13.8660 13.921333 -1 0.013584
2020-02-07 12.76 14.0210 14.021167 -1 -0.131991
2021-03-24 18.23 19.1120 19.186833 -1 0.399099
2021-07-07 20.18 20.5540 20.623500 -1 0.332412
2021-11-11 16.42 16.9570 16.960833 -1 0.218841
2022-05-12 12.87 13.7940 13.826167 -1 0.190174
2023-03-07 12.47 12.6880 12.696167 -1 0.263104
2023-09-05 10.63 10.7410 10.764333 -1 0.182977
========当前周期参数对: 20 120
close short_ma long_ma signal cum_profit
2020-02-12 12.89 13.7005 13.767333 -1 0.041195
2021-07-13 18.90 20.0895 20.148500 -1 0.509095
2023-04-03 11.54 11.7320 11.770000 -1 0.395429
========当前周期参数对: 20 250
close short_ma long_ma signal cum_profit
2020-03-19 10.68 12.6715 12.72192 -1 -0.271487
2021-08-05 15.82 17.5135 17.63056 -1 -0.152568
2023-03-23 11.75 12.1605 12.17956 -1 -0.275304
========当前周期参数对: 60 120
close short_ma long_ma signal cum_profit
2020-02-27 13.19 13.793333 13.80100 -1 0.065428
2021-08-11 17.73 19.557000 19.58950 -1 0.545830
2023-05-04 11.60 11.987833 11.99625 -1 0.341184
========当前周期参数对: 60 250
close short_ma long_ma signal cum_profit
2020-04-09 11.12 12.719833 12.74204 -1 -0.241473
2021-09-09 17.01 18.005333 18.06520 -1 -0.070422
2023-05-12 11.50 11.889500 11.89104 -1 -0.126622
========当前周期参数对: 120 250
close short_ma long_ma signal cum_profit
2020-05-29 11.54 12.726833 12.74176 -1 -0.212824
2021-11-08 15.59 18.412750 18.45200 -1 -0.236811
2023-07-31 11.50 11.445333 11.44832 -1 -0.214264
short_window long_window cum_profit
10 20 120 0.395429
12 60 120 0.341184
0 5 10 0.340738
7 10 120 0.300590
3 5 120 0.203232
9 20 60 0.182977
2 5 60 0.090370
6 10 60 -0.045589
5 10 20 -0.101125
13 60 250 -0.126622
8 10 250 -0.176899
14 120 250 -0.214264
1 5 20 -0.265844
11 20 250 -0.275304
4 5 250 -0.311707
由结果可知,对于平安银行这支股票来说,从2019年到2023年使用双均线策略来说,最好的结果是短期均线为MA20和长期均线为MA120的两条均线。
数据回测与优化
回测:测试历史数据的预测模型,是一种反向测试,旨在估计策略或模型的在过去一段时间内的表现,需要提供足够的细节模拟过去的条件。
它是以一种大数据的方式去验证策略,设定的交易是否有效,从各种评价指标或者统计学层面。同时,我们也需要正确看待回测:
回测结果好≠100%赚钱
我们需要去看交割单,开仓和平仓的价格是否正确,收益是在哪个节点产生变化,节点数是否正确,从亏损到产生正收益的时候需要查看数据是否准确。
数据回测 vs 实盘交易
- 这两种情况其实是有一定差异的,产生差异的原因之一——未来函数。
如果我们真实使用过一个策略,针对一个个股,尝试进行交易,不管是手工开仓、平仓还是使用自动化交易的方式,都会产生未来函数的问题。比如在上图中使用的布林道策略,这里简单介绍一下布林道策略
一、布林带指标介绍
布林带由三条轨道线组成:
- 中轨:通常是一条简单移动平均线,如 20 日移动平均线。
- 上轨:中轨加上一定倍数的标准差。
- 下轨:中轨减去一定倍数的标准差。
二、布林策略的原理
- 价格波动特性:价格通常在布林带的上下轨之间波动。当价格接近上轨时,可能被视为超买状态,价格有回调的可能;当价格接近下轨时,可能被视为超卖状态,价格有反弹的可能。
- 趋势判断:布林带的中轨可以作为趋势的参考。当价格在中轨上方运行时,通常被认为处于上升趋势;当价格在中轨下方运行时,通常被认为处于下降趋势。
三、布林策略的具体应用
- 买入信号:
- 当价格从下轨附近向上突破中轨时,可以考虑买入。这表明价格可能从超卖状态转为上涨趋势。
- 当价格在中轨附近获得支撑,且布林带呈现收口后重新开口向上的形态时,也可以作为买入信号。
- 卖出信号:
- 当价格从上轨附近向下跌破中轨时,可以考虑卖出。这表明价格可能从超买状态转为下跌趋势。
- 当价格在中轨附近遇到阻力,且布林带呈现收口后重新开口向下的形态时,也可以作为卖出信号。
由于我们平时使用的是日K的收盘价数据,对于实盘来说,收盘后我们是无法买入的。这里有两种解决方案
- T+1而不是T+0,产生的信号都是在第二天进行交易。
- 使用一天中的分时数据去替代收盘价,只要今天的价格,从历来的收盘价来看,碰到了下轨就买入,碰到了上轨就卖出。
方式1的问题
- 错过最佳入场时机
- 交易成本变高(第二天的开盘价90%会升高),收益变低,亏损的概率提升。
方式2的问题
- 代码的复杂度提升,因为取的是分时价格,对数据处理的要求会提升。
- 产生差异的原因之二——滑点
滑点指的是一笔交易或挂单交易中所要求的价格和实际订单执行或成交价格之间的差异。简单说就是委托价和实际成交价不一样。如
- 市价单:理论价格1,实际价格1.1,按照实际价格成交,造成损失。
- 限价单:理论价格1,可能无法成交。