date: 2017年05月17日 择时策略框架的主函数 """ import pandas as pd import Signals import Timing_Functions # 目前遇到的问题就是导入自己的文件夹的时候不正确 from program import Functions # 或者 import program.Functions # import program.Functions as Functions pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # ===== 第一个模块: 数据准备 # === 读入数据 code = 'sz300001' df = Functions.import_stock_data(code) # 判断股票上市是否满一定时间,如果不满足,则不运行策略 if df.shape[0] < 250: print '股票上市未满一年,不运行策略' exit() # === 计算复权价 fuquan_type = '后复权' df[[i + '_' + fuquan_type for i in '开盘价', '最高价', '最低价', '收盘价' ]] = Functions.cal_fuquan_price(df, fuquan_type) # ===== 第二个模块:产生交易信号 # === 根据均线策略产生交易信号 df = Signals.signal_ma(df, ma_short=5, ma_long=50) # ===== 第三个模块: 根据交易信号计算每天的仓位
# -*- coding: utf-8 -*- """ @author: Xingbuxing date: 2017年05月06日 本程序示例如何将日线数据转换为周线数据、以及resample函数的使用方式 """ import pandas as pd from program import Functions pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # =====读入数据 code = 'sz300001' df = Functions.import_stock_data(code) # =====以日线数据转化为周线数据为例, # ===上课资料文件夹中的《日线转周线说明》 # ===将'交易日期'这一列设置为index,之后讲为什么需要这么做 df.set_index('交易日期', inplace=True) # ===周期转换方法:resample week_df = df.resample(rule='w').last() # 'w'意思是week,意味着转变为周线; # last意思是取最后一个值 # 查看week_df中2009-11-08这一行的数据 # print df.iloc[:7] # print week_df # exit() # 这一周的开、高、低的价格
# -*- coding: utf-8 -*- """ @author: xingbuxing """ from program import Functions from program import config import pandas as pd import talib pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # 通过pattern_name设定要跑的指标,在此处设定指标名称 pattern_name = 'CDL3OUTSIDE' # 得到所有股票的列表 code_list = Functions.get_stock_code_list_in_one_dir(config.input_data_path + '/stock_data') # 遍历所有股票 output = pd.DataFrame() for code in code_list: print code # 导入数据 df = Functions.import_stock_data(code) # 计算后复权价,计算指标要用复权价 df[[i + '_后复权' for i in ['开盘价', '最高价', '最低价', '收盘价'] ]] = Functions.cal_fuquan_price(df) # 计算N天后涨跌幅 for i in [1, 3, 5, 10]:
# -*- coding: utf-8 -*- """ @author: xingbuxing """ from program import Functions import pandas as pd import talib pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # 通过pattern_name设定要跑的指标,在此处设定指标名称 pattern_name = 'CDL2CROWS' # 导入一只股票的数据,在此处设定股票代码 code = 'sz000001' df = Functions.import_stock_data(code) # 计算后复权价,计算指标要用复权价 df[[i + '_后复权' for i in ['开盘价', '最高价', '最低价', '收盘价']]] = Functions.cal_fuquan_price(df) # 计算N天后涨跌幅 for i in [1, 3, 5, 10]: df[str(i) + '天后涨跌幅'] = df['收盘价_后复权'].shift(-i) / df['收盘价_后复权'] - 1 # 计算技术指标。不同指标此处需要参数可能不同,需要修改。 df[pattern_name] = getattr(talib, pattern_name)(df['开盘价_后复权'].values, df['最高价_后复权'].values, df['最低价_后复权'].values, df['收盘价_后复权'].values) # 找出符合pattern的日期
# x = stock_data.iloc[:3]['下月每天资金曲线'] # print x # print list(x), len(list(x)) # 将x变成list # print np.array(list(x)) # 矩阵化 # print np.array(list(x)).mean(axis=0) # 求每天的资金曲线 # print list(np.array(list(x)).mean(axis=0)) # print [1] + list(np.array(list(x)).mean(axis=0)) # print pd.DataFrame([1] + list(np.array(list(x)).mean(axis=0))) # print pd.DataFrame([1] + list(np.array(list(x)).mean(axis=0))).pct_change()[0] # print list(pd.DataFrame([1] + list(np.array(list(x)).mean(axis=0))).pct_change()[0]) # print list(pd.DataFrame([1] + list(np.array(list(x)).mean(axis=0))).pct_change()[0])[1:] select_stock.reset_index(inplace=True) select_stock['资金曲线'] = (select_stock['下月平均涨跌幅'] + 1).cumprod() # 计算每日资金曲线 index_data = Functions.import_sh000001_data() equity = pd.merge(left=index_data, right=select_stock[['交易日期', '股票代码']], on=['交易日期'], how='left', sort=True) # 将选股结果和大盘指数合并 equity['股票代码'] = equity['股票代码'].shift() equity['股票代码'].fillna(method='ffill', inplace=True) equity.dropna(subset=['股票代码'], inplace=True) equity['每日涨幅'] = select_stock['下月每天平均涨跌幅'].sum() # print select_stock[['交易日期', '下月每天平均涨跌幅']] # print select_stock['下月每天平均涨跌幅'].sum() equity['equity_curve'] = (equity['每日涨幅'] + 1).cumprod() equity['benchmark'] = (equity['大盘涨跌幅'] + 1).cumprod() print equity
本程序演示如何抓取股票数据 """ import pandas as pd from program import config import numpy as np from program import Functions pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # 神奇的链接http://hq.sinajs.cn/list=sh600000,sh600004 # 本程序的作用是:从新浪网上,将所有股票最新的数据抓取下来并且保存。 # 可以每天定期运行,然后就能得到每天的数据了。 # ===读取所有股票代码列表 s_list = pd.read_hdf(config.input_data_path + '/stock_code_list_store.h5', 'table') all_code_list = list(s_list) # ===分组遍历股票 # 逐个股票的去遍历,会太慢。因为每次请求和新浪的交互时间都比较久。 # 也不能所有股票一次全部请求。 # 可以分组去遍历 chunk_len = 50 for code_list in np.array_split(all_code_list, len(all_code_list) / chunk_len + 1): Functions.save_stock_data_from_sina_to_h5(code_list) # ===从h5文件中中读取数据 code = 'sh600004' df = pd.read_hdf(config.output_data_path + '/each_stock_data_h5.h5', code) print df
# -*- coding: utf-8 -*- """ @author: xingbuxing """ from program import Functions from program import config import pandas as pd import talib pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # 通过pattern_name设定要跑的指标,在此处设定指标名称 pattern_name = 'CDL3OUTSIDE' # 得到所有股票的列表 code_list = Functions.get_stock_code_list_in_one_dir(config.input_data_path + '/stock_data') # 遍历所有股票 output = pd.DataFrame() for code in code_list: print code # 导入数据 df = Functions.import_stock_data(code) # 计算后复权价,计算指标要用复权价 df[[i + '_后复权' for i in ['开盘价', '最高价', '最低价', '收盘价']]] = Functions.cal_fuquan_price(df) # 计算N天后涨跌幅 for i in [1, 3, 5, 10]: df[str(i) + '天后涨跌幅'] = df['收盘价_后复权'].shift(-i) / df['收盘价_后复权'] - 1
# -*- coding: utf-8 -*- """ 本段程序用于生成选股策略所需要的数据 """ import pandas as pd from program import config from program import Functions pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # ===读取所有股票代码的列表 stock_code_list = Functions.get_stock_code_list_in_one_dir(config.input_data_path+'/stock_data') stock_code_list = stock_code_list[:20] # ===循环读取并且合并 # 导入上证指数 index_data = Functions.import_sh000001_data()[['交易日期']] # 循环读取股票数据 all_stock_data = pd.DataFrame() for code in stock_code_list: print code # 读入数据,额外读入'总市值'这一列 df = Functions.import_stock_data(code, other_columns=['总市值']) # 将股票和上证指数合并,补全停牌的日期 df = Functions.merge_with_index_data(df, index_data) # 将日线数据转化为月线,并且计算'是否交易'、'最后一天涨跌幅'、'交易天数'、'市场交易天数' # 并且计算'每天资金曲线',excel展示计算原理 df = Functions.transfer_to_period_data(df, period_type='m') # 对数据进行整理
# -*- coding: utf-8 -*- """ 邢不行量化小讲堂系列文章配套代码 文章标题:Python说:这个炒股指标是我见过最废的,没有之一 文章链接:https://mp.weixin.qq.com/s/3oXyBrWdAK2__u5-08qNag 作者:邢不行 微信:xingbx007 """ from program import Functions import program.config as config import pandas as pd pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # 得到所有股票的列表 code_list = Functions.get_stock_code_list_in_one_dir(config.input_data_path + '/stock_data') # 遍历所有股票 output = pd.DataFrame() for code in code_list: print code # 导入数据 data = Functions.import_stock_data(code) # 计算后复权价 data[['开盘价', '最高价', '最低价', '收盘价']] = Functions.cal_fuquan_price(data) # 计算N天后涨跌幅 for i in [1, 3, 5, 10]: data[str(i) + '天后涨跌幅'] = data['收盘价'].shift(-i) / data['收盘价'] - 1
# -*- coding: utf-8 """ @author: davidfnck date: 2017年6月20日 本段程序用于生成选股策略所需要的数据 """ import pandas as pd from program import config from program import Functions pd.set_option('expand_frame_repr', False) # 当列太多时不换行 # ==读取所有股票代码的列表 stock_code_list = Functions.get_stock_code_list_in_one_dir(config.input_data_path+'/stock_data') stock_code_list = stock_code_list[:20] print stock_code_list exit()