一图胜千言,一码抵万金。能用图表示的争取不哔哔,能上代码的绝不欺骗你们感情。但是,我和你们的思路可能不太一样,像J神那样很屌,但是我可能模仿不了。希望可以不做我不懂的事情,不说我不相信的话。这俩图excel也能做,但是做成python可以一键获取,看着图我就可以做决策了,可能会懒得写策略。。。你们也不要太失望
一、思路
这里用邢大西大他们提供的数据可能会更好,因为后面发现数据有点问题虽然影响不大。我希望每天看,所以还是用了tushare.pro。先整理日线数据,主要是代码:
# -*- coding:utf8 -*-
import pandas as pd
import tushare as tsfrom multiprocessing.pool import Poolfrom datetime import datetime
pd.set_option('display.max_rows', 2000)
pd.set_option('expand_frame_repr', False) # 当列太多时不换行
pd.set_option('display.max_columns', None)
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
token = '************' # 输入你tushare的token
pro = ts.pro_api(token)
ts.set_token(token)
# =====行业和个股数据# 从tushare获取申万一级行业数据
class_1 = pro.index_classify(level='L1', src='SW')
# 从tushare获取申万一级行业成分股
stock_indus = pd.DataFrame() # index_code con_code in_date out_datefor i in class_1['index_code']:
df = pro.index_member(index_code=i)
stock_indus = stock_indus.append(df, ignore_index=True)
stock_indus['ts_code'] = stock_indus['con_code']
stock_indus = stock_indus[['index_code', 'ts_code']]print(stock_indus)
# =====个股日线涨跌数据"""tushare原始数据格式
# ts_code trade_date open high low close pre_close change pct_chg vol amount
# 0 000001.SZ 20200721 14.68 14.68 14.40 14.49 14.73 -0.24 -1.6293 1252865.69 1.815570e+06
# 1 000001.SZ 20200720 14.23 14.77 14.10 14.73 14.14 0.59 4.1726 1979632.00 2.872758e+06
# 2 000001.SZ 20200717 14.17 14.28 13.95 14.14 14.15 -0.01 -0.0707 1291346.77 1.821044e+06
# 3 000001.SZ 20200716 14.30 14.55 14.12 14.15 14.27 -0.12 -0.8409 1930891.29 2.771496e+06
# 4 000001.SZ 20200715 14.78 14.86 14.23 14.27 14.68 -0.41 -2.7929 2042562.83 2.947173e+06
"""# 处理单个股票
def calculate_by_stock(code):
# =读入股票数据和行业数据
df = pro.query('daily', ts_code=code)
df['circ_mv'] = pro.query('daily_basic', ts_code=code, fields='circ_mv')
#调转数据顺序
df = df.sort_values('trade_date', ascending=True)
# =计算涨跌幅
df['涨跌幅'] = df['close'] / df['pre_close'] - 1
# =计算后复权价
df['复权因子'] = (1 + df['涨跌幅']).cumprod()
df['收盘价_复权'] = df['复权因子'] * (df.iloc[0]['close'] / df.iloc[0]['复权因子'])
df['开盘价_复权'] = df['open'] / df['close'] * df['收盘价_复权']
df['最高价_复权'] = df['high'] / df['close'] * df['收盘价_复权']
df['最低价_复权'] = df['low'] / df['close'] * df['收盘价_复权']
# =合并所属指数
df = pd.merge(left=df, right=stock_indus, on='ts_code', how='left', sort=True, indicator=True)
# =计算均线MA20
df['ma_20'] = df['收盘价_复权'].rolling(20, min_periods=1).mean() # 计算均线
df.loc[df['收盘价_复权'] > df['ma_20'], 'ma_20多头'] = 1 # 当处于均线之上时,标记为1,否则为空
df['ma_20多头'] = df['ma_20多头'] * df['circ_mv']
df = df[['ts_code', 'trade_date', '收盘价_复权', '开盘价_复权', '最高价_复权', '最低价_复权' , '涨跌幅', 'vol', 'amount', 'index_code', 'ma_20多头','circ_mv']]
return df
# =====并行# 并行提速的办法。一定要并行跑,不然会很慢,保养了机器,浪费了生命
start_time = datetime.now() # 标记开始时间
now_time = datetime.now().strftime('%Y%m%d')if __name__ == '__main__':
with Pool(processes=4) as pool: # processes的数量需要你自己根据自己的硬件决定,可以试跑,看哪个最快。
# 使用并行批量获得DataFrame的一个列表
df_list = pool.map(calculate_by_stock, stock_indus['ts_code'])
print('读入完成, 开始合并', datetime.now() - start_time) # macbook pro 2016款跑完需要:0:03:26.473298
# 合并为一个大的DataFrame
all_stock_data = pd.concat(df_list, ignore_index=True)
# =====输出数据
all_stock_data.to_csv('/Users/25311/Documents/my_machine/output/Industry/行业轮动_原始数据_%s.csv' % now_time,
index=False, mode='a',
encoding='gbk')