主观决策:传统的投资方法通常涉及主观判断和情感因素,投资者可能会因情绪波动而做出不明智的决策。量化择时策略旨在通过数据和规则来减少主观性,提高投资决策的客观性。
人为错误:人为错误和疏忽可能导致投资亏损。量化模型通过自动执行决策,可以减少这些错误的机会。
情绪驱动的波动:市场中的情绪波动和群体行为可能导致股价的不稳定性。量化模型可以通过分析数据来减少对情绪的依赖,从而更好地抵御市场波动。
精确的市场定时:股票市场中的定时至关重要。量化择时策略的目的是利用数据和算法来识别买入和卖出的最佳时机,从而提高投资回报。
风险管理:股票市场涉及风险,投资者需要有效的风险管理方法来降低损失。量化策略通常包括风险控制模块,以帮助管理投资组合的风险。
自动化和效率:量化策略的自动化特性可以减少投资者的时间和精力成本。它们可以在市场开放时自动执行决策,无需持续的人工监控。
数据分析:量化策略依赖于大量的数据分析,可以处理和分析大规模数据以支持决策制定
- """
- 通过一个简单的案例策略,来演示择时策略
- """
- import pandas as pd
- from decimal import Decimal, ROUND_HALF_UP
- pd.set_option('expand_frame_repr', False) # 当列太多时不换行
- pd.set_option('display.max_rows', 5000) # 最多显示数据的行数
-
-
- # =====读入股票数据
- stock_code = 'sz000002'
- df = pd.read_csv('F:/投资研究模型/MassInvest/课程第二阶段/xbx_stock_2019/data/择时策略-回测/%s.csv' % stock_code,
- encoding='gbk', skiprows=1, parse_dates=['交易日期'])
- # 任何原始数据读入都进行一下排序、去重,以防万一
- df.sort_values(by=['交易日期'], inplace=True) # 交易日期
- df.drop_duplicates(subset=['交易日期'], inplace=True) # 排序
- df.reset_index(inplace=True, drop=True)
-
-
- # =====计算后复权价
- df['涨跌幅'] = df['收盘价'] / df['前收盘价'] - 1 # 收盘家/前收盘价,前收盘价要
- df['复权因子'] = (1 + df['涨跌幅']).cumprod() # 复权因子,复权因子是复权后价格的等比例数据
- df['收盘价_复权'] = df['复权因子'] * (df.iloc[0]['收盘价'] / df.iloc[0]['复权因子']) # 复权 以一个价格为基,就可以得到所有的价格
-
- df['开盘价_复权'] = df['开盘价'] / df['收盘价'] * df['收盘价_复权'] #想比较于收盘价的等比例
- df['最高价_复权'] = df['最高价'] / df['收盘价'] * df['收盘价_复权'] #
- df['最低价_复权'] = df['最低价'] / df['收盘价'] * df['收盘价_复权'] #
- df.drop(['复权因子'], axis=1, inplace=True)
-
-
- # =====计算涨跌停价格
- df['涨停价'] = df['前收盘价'] * 1.1
- df['跌停价'] = df['前收盘价'] * 0.9
- # 四舍五入
- # print(round(3.5), round(4.5)) # 银行家舍入法:四舍六进,五,奇进偶不进
- df['涨停价'] = df['涨停价'].apply(lambda x: float(Decimal(x*100).quantize(Decimal('1'), rounding=ROUND_HALF_UP) / 100))
- df['跌停价'] = df['跌停价'].apply(lambda x: float(Decimal(x*100).quantize(Decimal('1'), rounding=ROUND_HALF_UP) / 100))
-
-
- # =====计算移动平均线策略的交易信号
-
- # ===策略参数
- para_list = [10, 90]
- ma_short = para_list[0] # 短期均线。ma代表:moving_average
- ma_long = para_list[1] # 长期均线
-
- # ===计算均线。所有的指标,都要使用复权价格进行计算。
- df['ma_short'] = df['收盘价_复权'].rolling(ma_short, min_periods=1).mean() # 10 移动平均线
- df['ma_long'] = df['收盘价_复权'].rolling(ma_long, min_periods=1).mean() # 90 移动平均线
-
- # ===找出做多信号
- condition1 = df['ma_short'] > df['ma_long'] # 短期均线 > 长期均线
- condition2 = df['ma_short'].shift(1) <= df['ma_long'].shift(1) # 上一周期的短期均线 <= 长期均线
- df.loc[condition1 & condition2, 'signal'] = 1 # 将产生做多信号的那根K线的signal设置为1,1代表做多
-
- # ===找出做多平仓信号
- condition1 = df['ma_short'] < df['ma_long'] # 短期均线 < 长期均线
- condition2 = df['ma_short'].shift(1) >= df['ma_long'].shift(1) # 上一周期的短期均线 >= 长期均线
-
- print(condition1 & condition2)
- exit()
- df.loc[condition1 & condition2, 'signal'] = 0 # 将产生平仓信号当天的signal设置为0,0代表平仓
-
- # ===删除无关中间变量
- df.drop(['ma_short', 'ma_long'], axis=1, inplace=True) #删除pandas
-
- # =====将数据存入hdf文件中
- df.to_hdf('F:/投资研究模型/MassInvest/课程第二阶段/xbx_stock_2019/data/择时策略-回测/signals.h5', key='df', mode='w') # 携程hdf
Pandas 是一个非常强大和流行的数据分析库,具有许多优势,但也有一些潜在的痛点。下面是 Pandas 的优势和痛点,以及与其他类似库相比的一些比较:
Pyhton是相当流行的编程语言,其简单易用,其开放的生态社区有着巨大的活跃度,pandas作为长久不衰的一个与excel相关信息绑定的一个库,极受欢迎,生命力旺盛。技术上简单易用,功能强大。
Pandas 的优势(针对性的场景特异性功能):
灵活性: Pandas 提供了丰富的数据结构,最重要的是数据框(DataFrame),可以容纳多种数据类型,包括数值、文本、日期时间等,使其非常适用于复杂的数据处理和分析任务。
数据清洗: Pandas 提供了丰富的数据清洗和预处理功能,可以轻松处理缺失数据、重复数据、异常值等。
数据选择和筛选: 使用 .loc
和 .iloc
方法,可以根据标签或整数位置轻松选择和筛选数据。这使得数据子集的创建非常便捷。
强大的分组和聚合: Pandas 允许进行高效的数据分组、聚合和统计分析,例如,使用 groupby
和聚合函数。
时间序列分析: Pandas 在时间序列数据处理方面非常强大,支持日期时间索引和各种时间序列操作。
数据导入和导出: 支持多种数据格式,包括 CSV、Excel、SQL 数据库等,使数据的导入和导出变得容易。
广泛的社区支持: Pandas 拥有庞大的用户社区,因此有大量文档、教程和支持资源可供参考。
Pandas 的痛点:
内存消耗: 对于非常大的数据集,Pandas 可能会占用大量内存,这可能会导致性能问题。不适合处理大规模数据。
性能: 在某些情况下,Pandas 操作可能较慢,尤其是在需要循环处理每行数据时。应该尽量使用 Pandas 的内置向量化操作。
陡峭学习曲线: 对于初学者来说,Pandas 的语法可能有一定学习曲线,尤其是在处理复杂的数据操作时。
与其他库的比较(有一定的差异性的,有自己的一手):
NumPy: NumPy 专注于数值计算,而 Pandas 更适用于数据分析。NumPy 更适合处理数值数据和执行数学运算,而 Pandas 更适合处理多维数据和进行数据操作。
SQL 数据库: SQL 数据库适用于数据存储和复杂查询,而 Pandas 用于数据清洗、分析和转换。通常,可以将数据从 SQL 数据库导入到 Pandas 进行分析。
Spark: Apache Spark 适用于大规模数据分析和处理,而 Pandas 更适合小规模数据和单台机器上的数据处理。Spark 分布式计算引擎更适合大数据处理。
R语言: R 语言也是用于数据分析的强大工具,但与 Pandas 不同,R 有自己的语法和生态系统。