文件’沪市股票top300.csv’中包含上海股票交易所上市的多支股票的名称和股票代码,其他文件为文件名对应股票代码的股票交易数据,使用这些文件进行运算并输出结果,如跌幅最大的10支股票代码的集合、成交量最大的10支股票代码集合、最高价最高的10支股票代码的集合、最低价最低的10支股票代码集合等。(为方便统计,本题中涨跌幅计算公式设定为:(最新记录收盘价-最早记录收盘价) / 最早记录收盘价 * 100。)‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    交易数据文件数据内容格式为:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

    1. Date,High,Low,Open,Close,Volume,Adj Close
    2. 2018-01-02,5.929999828338623,5.829999923706055,5.860000133514404,5.909999847412109,10649302.0,5.6797099113464355
    3. 2018-01-03,5.989999771118164,5.820000171661377,5.880000114440918,5.909999847412109,14893773.0,5.6797099113464355
    4. 2018-01-04,5.889999866485596,5.829999923706055,5.869999885559082,5.849999904632568,9974470.0,5.622048854827881
    5. 2018-01-05,5.880000114440918,5.820000171661377,5.849999904632568,5.849999904632568,6584055.0,5.622048854827881
    6. 2018-01-08,5.929999828338623,5.860000133514404,5.860000133514404,5.920000076293945,11096694.0,5.689321041107178
    7. ... ...

    根据用户输入,利用集合运算和这些文件数据完成以下任务:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    输入’涨幅与成交量’时:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    参考示例格式输出:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅和成交量均在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅或成交量在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅前10名,但成交量未进前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅和成交量不同时在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    输入’涨幅与最高价’时:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    参考示例格式输出:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅和最高价均在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅或最高价在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅前10名,但最高价未进前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    涨幅和最高价不同时在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    输入’跌幅与最低价’时:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    参考示例格式输出:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    跌幅和最低价均在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    跌幅或最低价在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    跌幅前10名,但最低价未进前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    跌幅和最低价不同时在前10名的股票:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    输入其他数据时:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
    输出:’输入错误’

    1. # -------- ------- --------
    2. # @File : 股票分析.py
    3. # @Author : 赵广辉
    4. # @Contact: vasp@qq.com
    5. # @Company: 武汉理工大学
    6. # @Version: 1.5
    7. # @Modify : 2021/12/06 21:28
    8. # Python程序设计基础,高等教育出版社
    9. # -------- ------- --------
    10. import os
    11. import numpy as np
    12. # 设置常量,对应各列数据的语义,方便索引
    13. HIGH = 0
    14. LOW = 1
    15. OPEN = 2
    16. CLOSE = 3
    17. VOLUME = 4
    18. ADJCLOSE = 5
    19. def file_list(file):
    20. """
    21. @参数 file: 文件名,字符串类型
    22. 将文件中的股票代码与股票名称读入到字典中,返回股票代码字典。
    23. ['600000', '600004', '600006', '600007', '600008', '600009',...]
    24. """
    25. stock_name = {}
    26. with open(file, 'r', encoding='utf-8') as stock_file:
    27. for line in stock_file:
    28. x = line.strip().split(',')
    29. stock_name[x[0]] = x[1]
    30. return stock_name # 股票代码与股票名字典
    31. def filename_list(path):
    32. """接收路径字符串为参数,获取该路径下所有文件名,以列表形式返回
    33. os.listdir(path)以列表形式返回path路径下的所有文件名,不包括子路径中的文件名"""
    34. name_list = os.listdir(path)
    35. return name_list
    36. def statistics_of_all(code_list):
    37. """
    38. @参数 code_list:股票代码列表,列表类型
    39. 接收股票数据文件名列表,逐个统计各股票数据文件涨跌幅、总成交量、最高价和最低价。
    40. 涨跌幅计算公式为:(最新记录收盘价-最早记录收盘价) / 最早记录收盘价 * 100
    41. 为方便处理,读入数据时,略过日期列。
    42. """
    43. statistics_of_stock = []
    44. for code in code_list:
    45. data_of_code = np.genfromtxt('../data/' + code, dtype=None,
    46. usecols=[1, 2, 3, 4, 5, 6], delimiter=',',
    47. skip_header=1)
    48. # 计算当前股票涨跌幅、总成交量、最高价和最低价
    49. uplift_or_fall = round((data_of_code[:, CLOSE][-1] - data_of_code[:, CLOSE][0]) / data_of_code[:, CLOSE][0] * 100, 2)
    50. volumes = round(sum(data_of_code[:, VOLUME]), 2)
    51. high = round(max(data_of_code[:, HIGH]), 2)
    52. low = round(min(data_of_code[:, LOW]), 2)
    53. statistics_of_stock.append([code[:6], uplift_or_fall, volumes, high, low])
    54. return statistics_of_stock # 每支股票涨跌幅、总成交量、最高价和最低价
    55. def top_10_uplift(statistics_of_stock):
    56. """
    57. @参数 statistics_of_stock:每支股票涨跌幅、总成交量、最高价和最低价统计信息,列表类型
    58. 按涨幅降序排序,涨幅相同时按股票代码降序排序,取排名前10的股票,
    59. 返回排名前10的股票代码,返回值为列表类型。
    60. """
    61. sort_by_uplift = sorted(statistics_of_stock, key=lambda x: (x[1], x[0]), reverse=True)[:10]
    62. top_uplift = [x[0] for x in sort_by_uplift]
    63. return top_uplift
    64. def top_10_fall(statistics_of_stock):
    65. """
    66. @参数 statistics_of_stock:每支股票涨跌幅、总成交量、最高价和最低价统计信息,列表类型
    67. 按跌幅升序排序,跌幅相同时,按股票代码升序排序,取排名前10的股票,返回跌幅最大的10支股
    68. 票代码的集合。
    69. """
    70. sort_by_fall = sorted(statistics_of_stock, key=lambda x: (x[1], x[0]))[:10]
    71. top_fall = [x[0] for x in sort_by_fall]
    72. return top_fall
    73. def top_10_volumes(statistics_of_stock):
    74. """
    75. @参数 statistics_of_stock:每支股票涨跌幅、总成交量、最高价和最低价统计信息,列表类型
    76. 按成交量降序排序,成交量相同时,按股票代码降序排序,取成交量前10的股票代码,返回成交量
    77. 最大的10支股票代码列表。
    78. """
    79. sort_by_volumes = sorted(statistics_of_stock, key=lambda x: (x[2], x[0]))[-1:-11:-1]
    80. top_volumes = [x[0] for x in sort_by_volumes]
    81. return top_volumes
    82. def top_10_high(statistics_of_stock):
    83. """
    84. @参数 statistics_of_stock:每支股票涨跌幅、总成交量、最高价和最低价统计信息,列表类型
    85. 按最高价降序排序,最高价相同时,按股票代码降序排序返回,取排名前10的股票,返回最高价最
    86. 高的10支股票代码的列表。
    87. """
    88. sort_by_high = sorted(statistics_of_stock, key=lambda x: (x[3], x[0]))[-1:-11:-1]
    89. top_high = [x[0] for x in sort_by_high]
    90. return top_high
    91. def top_10_low(statistics_of_stock):
    92. """
    93. @参数 statistics_of_stock:每支股票涨跌幅、总成交量、最高价和最低价统计信息,列表类型
    94. 按最低价升序排序,最低价相同时,按股票代码升序排序,取排名前10的股票,返回最低价最低的
    95. 10支股票代码集合。
    96. """
    97. sort_by_low = sorted(statistics_of_stock, key=lambda x: (x[4], x[0]))[:10]
    98. top_low = [x[0] for x in sort_by_low]
    99. return top_low
    100. def uplift_and_volumes(top_uplift, top_volumes):
    101. """
    102. @参数 top_high,最高价在前10名的股票代码,字符串
    103. @参数 top_volumes,成交量在前10名的股票代码,字符串
    104. 返回一个列表,其元素依序为以下4个:
    105. 涨幅和成交量均在前10名的股票,按股票代码升序,列表
    106. 涨幅或成交量在前10名的股票,按股票代码升序,列表
    107. 涨幅前10名,但成交量未进前10名的股票,按股票代码升序,列表
    108. 涨幅和成交量不同时在前10名的股票,按股票代码升序,列表
    109. """
    110. both_of = sorted(set(top_uplift) & set(top_volumes))
    111. any_of = sorted(set(top_uplift) | set(top_volumes))
    112. uplift_no_volumes = sorted(set(top_uplift) - set(top_volumes))
    113. uplift_or_volumes = sorted(set(top_uplift) ^ set(top_volumes))
    114. # print(both_of,any_of,uplift_no_volumes,uplift_or_volumes)
    115. return [both_of,any_of,uplift_no_volumes,uplift_or_volumes]
    116. def high_and_uplift(top_uplift, top_high):
    117. """
    118. @参数 top_high,最高价在前10名的股票代码,字符串
    119. @参数 top_uplift,涨幅在前10名的股票代码,字符串
    120. 返回一个列表,其元素依序为以下4个:
    121. 涨幅和最高价均在前10名的股票代码,按股票代码升序,列表
    122. 涨幅或最高价在前10名的股票代码,按股票代码升序,列表
    123. 涨幅前10名,但最高价未进前10名的股票代码,按股票代码升序,列表
    124. 涨幅和最高价不同时在前10名的股票,按股票代码升序,列表
    125. 票代码。
    126. """
    127. both_of = sorted(set(top_uplift) & set(top_high)) # 涨幅和最高价均在前10名的股票
    128. any_of = sorted(set(top_uplift) | set(top_high)) # 涨幅或最高价在前10名的股票
    129. uplift_no_high = sorted(set(top_uplift) - set(top_high)) # 涨幅前10名,但最高价未进前10名的股票
    130. uplift_or_high = sorted(set(top_uplift) ^ set(top_high)) # 涨幅和最高价不同时在前10名的股票
    131. return [both_of, any_of, uplift_no_high, uplift_or_high]
    132. def low_and_fall(top_fall, top_low):
    133. """
    134. @参数 top_low,最低价在前10名的股票代码,字符串
    135. @参数 top_fall,跌幅在前10名的股票代码,字符串
    136. 返回一个列表,其元素依序为以下4个
    137. 跌幅和最低价均在前10名的股票代码,按股票代码升序,列表
    138. 跌幅或最低价在前10名的股票代码,按股票代码升序,列表
    139. 跌幅前10名,但最低价未进前10名的股票代码,按股票代码升序,列表
    140. 跌幅和最低价不同时在前10名的股票,按股票代码升序,列表
    141. """
    142. both_of = sorted(set(top_fall) & set(top_low)) # 跌幅和最低价均在前10名的股票
    143. any_of = sorted(set(top_fall) | set(top_low)) # 跌幅或最低价在前10名的股票
    144. uplift_no_high = sorted(set(top_fall) - set(top_low)) # 跌幅前10名,但最低价未进前10名的股票
    145. uplift_or_high = sorted(set(top_fall) ^ set(top_low)) # 跌幅和最低价不同时在前10名的股票
    146. return [both_of, any_of, uplift_no_high, uplift_or_high]
    147. def operation():
    148. """接收一个字符串为参数,根据参数值调用不同函数完成任务"""
    149. statistics_of_list = statistics_of_all(stock_lst) # 对获取的股票数据进行统计
    150. uplift_set = top_10_uplift(statistics_of_list) # 涨幅前10名集合
    151. fall_set = top_10_fall(statistics_of_list) # 跌幅前10名集合
    152. volumes_set = top_10_volumes(statistics_of_list) # 成交量前10名集合
    153. high_set = top_10_high(statistics_of_list) # 最高价前10名集合
    154. low_set = top_10_low(statistics_of_list) # 最低价前10名集合
    155. opt = input()
    156. if opt == '涨幅与成交量': # 输出抽中的单词
    157. u_and_v = uplift_and_volumes(uplift_set, volumes_set)
    158. print('涨幅和成交量均在前10名的股票:')
    159. print(u_and_v[0]) # 涨幅和成交量均在前10名的股票
    160. print('涨幅或成交量在前10名的股票:')
    161. print(u_and_v[1]) # 涨幅或成交量在前10名的股票
    162. print('涨幅前10名,但成交量未进前10名的股票:')
    163. print(u_and_v[2]) # 涨幅前10名,但成交量未进前10名的股票
    164. print('涨幅和成交量不同时在前10名的股票:')
    165. print(u_and_v[3]) # 涨幅和成交量均在前10名的股票
    166. elif opt == '涨幅与最高价':
    167. u_and_h = high_and_uplift(uplift_set, high_set)
    168. print('涨幅和最高价均在前10名的股票:')
    169. print(u_and_h[0])
    170. print('涨幅或最高价在前10名的股票:')
    171. print(u_and_h[1])
    172. print('涨幅前10名,但最高价未进前10名的股票:')
    173. print(u_and_h[2])
    174. print('涨幅和最高价不同时在前10名的股票:')
    175. print(u_and_h[3])
    176. elif opt == '跌幅与最低价':
    177. f_and_l = low_and_fall(fall_set, low_set)
    178. print('跌幅和最低价均在前10名的股票:')
    179. print(f_and_l[0]) # 跌幅和最低价均在前10名的股票
    180. print('跌幅或最低价在前10名的股票:')
    181. print(f_and_l[1]) # 跌幅或最低价在前10名的股票
    182. print('跌幅前10名,但最低价未进前10名的股票:')
    183. print(f_and_l[2]) # 跌幅前10名,但最低价未进前10名的股票
    184. print('跌幅和最低价不同时在前10名的股票:')
    185. print(f_and_l[3]) # 跌幅前10名,但最低价未进前10名的股票,和最低价前10名但跌幅没进前10名的股票
    186. else:
    187. print('输入错误')
    188. if __name__ == '__main__':
    189. filename = './data/沪市股票top300.csv' # 股票名称与代码文件
    190. stock_lst = ['600000.csv', '600004.csv', '600006.csv',
    191. '600007.csv', '600008.csv', '600009.csv',
    192. '600010.csv', '600011.csv', '600012.csv',
    193. '600015.csv', '600016.csv', '600018.csv',
    194. '600019.csv', '600020.csv', '600026.csv',
    195. '600028.csv', '600029.csv', '600030.csv',
    196. '600031.csv', '600033.csv', '600036.csv']
    197. operation()