【python股票量化_股市精华帖_策略12篇】陪米开朗基罗看行业轮动

本文通过Python分析股票历史数据,研究行业轮动现象。作者探讨了不同市场阶段各行业表现,提出行业轮动监控的核心思想,并分享了策略构建思路,包括在大盘不同走势下的投资选择。
摘要由CSDN通过智能技术生成

一图胜千言,一码抵万金。能用图表示的争取不哔哔,能上代码的绝不欺骗你们感情。但是,我和你们的思路可能不太一样,像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')
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值