量化交易之QT篇 - TQZButton - 自定义按钮

Posted Post-Truth

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了量化交易之QT篇 - TQZButton - 自定义按钮相关的知识,希望对你有一定的参考价值。

// TQZButton.h

#ifndef TQZBUTTON_H
#define TQZBUTTON_H

#include <QPushButton>

enum TQZButtonType 
    COMMON,
    CLOSE
;

class TQZButton : public QPushButton

    Q_OBJECT
public:
    explicit TQZButton(const QString &text, TQZButtonType buttonType , QWidget *parent = nullptr);
    virtual ~TQZButton();

protected:
    void enterEvent(QEvent* event);
    void leaveEvent(QEvent* event);


private:
    void UpdateSelf(const QString &text);
    QMap<TQZButtonType, QMap<QString, QString> *>* GetButtonStyleConfig();

private:
    QMap<TQZButtonType, QMap<QString, QString> *>* m_buttonStyleConfig;

    TQZButtonType m_buttonType;

signals:

;

#endif // TQZBUTTON_H
// TQZButton.cpp

#include "TQZButton.h"

#include <QFont>
#include <QMouseEvent>

#include <QDebug>


TQZButton::TQZButton(const QString &text, TQZButtonType buttonType, QWidget *parent):
    QPushButton(parent),
    m_buttonStyleConfig(nullptr),
    m_buttonType(buttonType)

    this->UpdateSelf(text);



void TQZButton::UpdateSelf(const QString &text) 
    this->setText(text);

    this->setStyleSheet(GetButtonStyleConfig()->find(m_buttonType).value()->find("common").value());



void TQZButton::enterEvent(QEvent* event) 
    this->setStyleSheet(GetButtonStyleConfig()->find(m_buttonType).value()->find("movein").value());

    QPushButton::enterEvent(event);


void TQZButton::leaveEvent(QEvent* event) 
    this->setStyleSheet(GetButtonStyleConfig()->find(m_buttonType).value()->find("common").value());

    QPushButton::enterEvent(event);



QMap<TQZButtonType, QMap<QString, QString>*>* TQZButton::GetButtonStyleConfig() 
    if (this->m_buttonStyleConfig == nullptr) 
        this->m_buttonStyleConfig = new QMap<TQZButtonType, QMap<QString, QString>*>;

        QMap<QString, QString> *commonButtonConfig = new QMap<QString, QString>;
        commonButtonConfig->insert("common", "TQZButton  border: none; color: white; ");
        commonButtonConfig->insert("movein", "TQZButton  border-radius: 6px; border: none; background-color: rgb(63, 60, 60); color: white; ");

        QMap<QString, QString> *closeButtonConfig = new QMap<QString, QString>;
        closeButtonConfig->insert("common", "TQZButton  border: none; color: white; ");
        closeButtonConfig->insert("movein", "TQZButton  border-radius: 6px; border: none; background-color: rgb(228, 64, 50); color: white; ");

        this->m_buttonStyleConfig->insert(COMMON, commonButtonConfig);
        this->m_buttonStyleConfig->insert(CLOSE, closeButtonConfig);
    

    return this->m_buttonStyleConfig;



TQZButton::~TQZButton() 
    if (this->m_buttonStyleConfig != nullptr) 
        foreach (const TQZButtonType &key, this->m_buttonStyleConfig->keys()) 
            delete this->m_buttonStyleConfig->value(key);
            this->m_buttonStyleConfig->insert(key, nullptr);
        

        delete this->m_buttonStyleConfig;
        this->m_buttonStyleConfig = nullptr;
    


量化交易之单因子策略

量化交易之单因子策略

 


单因子策略

你知道剩男剩女是如何剩下的吗?

许多年后,他们都一样,都会发现自己其实可能有过一次以上的机会(虽然不一定吧)。可当初他们为什么没有出手选择呢?你再跟他们聊聊,他们都一样的,都认为自己的要求并不高,不求最有钱最好看…… 他们是这样想的:

  • 长相不能太丑吧?
  • 个子不能太矮吧?
  • 人不能太无趣吧?
  • 收入不能太低吧?
  • 学历不能太差吧?
  • ……

看起来,确实各个都是很一般般的要求,都没要求最好,只要求 1/3 以上,咋就找不着呢?

这是个简单的数学应用题,每个要求都只剩下 1/3 的选择,最终,只剩下差不多 4% 的选择 —— 而事实上,每个人在适龄期间,能够足够深入了解的人数不超过 150 人(包括同性),于是,得活上三辈子才有可能真的碰到。

  • 这还没有算上另外一个因素:对方也在挑!

然后,那些没剩下的人,好像在这方面也没花多少心思,就直接没有了另外一些人的烦恼 —— 让人感觉真是“不公平”!

那些没剩下的人如何想的呢?他们在这方面其实都是差不多的,他们的思考模式大抵上是这样的:

  • 对方只要满足最重要的一条就足够了……

绝大部分人都不是高富帅/白富美,一般是又懒又馋,工作态度能力都很糟,但身体好,心宽,生的孩子都挺可爱,或者节俭、踏实、忠诚,这些都是适合结婚的因素。

漂亮重要吗?重要,但显然有比它更重要的考虑因素。身材好重要吗?重要,但显然有比它更重要的考虑因素。学历重要吗?重要,但显然有比它更重要的考虑因素…… 经过反复探究“什么更重要”?我终于找到了一个“最重要的因素”:

  • 对方是不是一个能讲道理的人?

这可能是唯一最重要的因素 —— 因为这一条满足之后,几乎没有什么问题是不能解决的,不是吗?而后来,一不小心遇到了一个各方面都不错,却竟然还是个“能讲道理”的女生。

比如说,我男人懒得令人发指(懒、没有上进心、还不愿意沟通、生活和工作态度消极),怎么办?

  • 想想自己是否对亲近之人有过高期待,如果说期待不高,但他自己的生活一团糟,如果是男朋友,换了比较好
  • 如果说,虽然他不上进,但他孩子、家庭照顾的很好,是一个好父亲,那就不要去要求他上进了,温和的沟通、讲道理,相当于发脾气改造他,引导他上进,不如让他支持你这个上进的人,也许效果会更好。

可能你们之间有差异、三观不同,但俩个讲道理的人在一起,也会越来越舒适、舒服。

单因子选取思路:什么更重要?什么更重要?什么更重要?······ 什么最重要?!
 


小市值选股策略

小市值选股策略是单因子策略的一种,以市值因子与股票收益率的相关性作为依据,选取市值较小的股票。

小市值策略诞生以来,在美股市场经过了大量的数据验证,因为收益高,有部分声音甚至认为它是过去几十年最有效的策略。

在 A 股市场上的表现也同样出色,在 2017 年以前,A 股市场上市值因子的显著性甚至超过了欧美等发达国家市场。

它来源于 1981 年美国经济学家 Banz 对纽交所长达 40 年的数据进行的一次分析统计,他发现小市值股票月均收益率比其他股票高 0.4%。

背后的原因是小市值的公司价格普遍偏低,甚至低于成本价,以及在实际的金融市场中,相较于大市值公司较为平稳的价格,小市值公司的价格波动性更强,更容易出现价格快速增长的情况。

因此投资者们会偏爱小市值的公司,期望在小市值的成长和价格波动中获得收益,从而也导致了小市值有较高的预期收益率。

由此产生了小市值策略,即投资于市值较小的股票。

不过,需要注意的是,由于小市值的核心理念就是投资市值较小的股票。

但是市值规模较小的股票在拥有更高的成长空间的同时,也意味着相较于市值规模较大的股票,有不稳定、抵御风险能力差以及消化风险能力差等缺点。

而对于 A 股市场来说,总市值规模较小的股票,往往伴随着较高的因财务状态而被退市的风险。

此时,一旦我们选中的小市值股票被退市,就会给我们带来较大的损失,策略的表现也会大受影响。

在网站的搜索框里输入:市值最小的 50 只股票,

得到了目前整个 A 股市场总市值从小到大排名的前 50 只股票。

但是仔细看的话,可以发现其中包含了不少 *ST 股票和 ST 股票。

而 *ST 股票表示着该公司的经营处于连续三年亏损的状态,退市预警。

ST 股票表示着该公司的经营处于连续二年亏损的状态,特别处理。

简单来说,这些股票有极高的被退市风险。

当我们使用小市值选股策略筛选买入这类股票时,一旦退市,将对我们的策略表现造成极大的影响。

因此,在筛选小市值股票时,这类股票是需要被我们排除的。

此外,我们不一定在整个 A 股市场挑,因为后面的可能是最不太好的股票,那家公司可以小,但一定得有未来、可增值。

更稳妥的方法是,在上证 50、中证 100、沪深 300、中证 500、中证 1000 里面选。

再选一次,发现中证 1000 最适合这个策略。

我们把中证 1000 指数作为筛选范围,从其中的 1000 只股票筛选市值较小的股票。

可是市值较小的标准究竟是什么呢,是以一个市值数值作为标准,小于标准数值的即为“市值较小”吗?

而在小市值选股策略中,我们是让股票按照总市值的大小进行从小到大排序,选择市值最小的第 i 名至第 j 名。

  • 筛选标的:中证 1000
  • 筛选标准:选择市值最小的第 i 名至第 j 名
  • 筛选数量:在标的(中证 1000)池总数量的 1% ~ 5% 左右
  • 筛选方式:一般来说,当我们进行策略研究的时候,选择最小的那部分即可,而当应用到实际市场的时候,就需要考虑风险等因素来决定是否排除市值最小的那几只,比如最后 5 名不要,因为他们随时都会掉出中证 1000
  • 买入卖出:根据对公司特性和当下市场环境的研究,可以选择每个月都进行筛选买入,动态更新自己持有的标的,也可以选择只进行一次标的筛选,买入并长期持有筛选好的标的
     

移动平均线:如何躲过股灾和大跌

移动平均线,是计算股票之前若干天收盘价格的平均值,而后连城一条线,刻画的是价格变换的趋势。

计算均线需要先设置均线周期,将均线周期设置为 15 日(国内长期一般 120 - 240 天,短期 2-4 周),就能进入下面的计算:

  • 将第 1-15 个交易日的收盘价求和,除以 15,就能得到第一个均价;
  • 向后移动一个交易日,再将第 2-16 个交易日的收盘价求和,除以 15,得到第二个均价;
  • 在当前交易日,股票前天 15 日均价大于昨天 15 日均价,昨天 15 日均价小于今日 15 日均价,这时均线会出现「向上的拐点」,则大概率认为股票价格在未来一段时间内上涨;
  • 而当该股票前天 15 日均价小于昨天 15 日均价,昨天 15 日均价大于今日 15 日均价,均线出现「向下的拐点」,则大概率在未来一段时间内下跌。

只要投资组合收盘价高于 15 天移动平均线至少 1 个百分点,就买入;若低于 15 天移动平均线至少 1 个百分点,卖出。

这个策略会使得整个投资的波动率大幅降低了,能避开绝大部分的灭顶之灾的日子,大幅降低了股灾的一些,但也会多很多小幅但亏损,把极端风险平摊到平时了。
 


『布带林线:衡量市场的波动性/趋势』

布带林从统计学的标准差演变而来,由 3 根线构成,分别是上轨、中轨、下轨,形状像一个宽窄不一的“通道”。

中轨将“通道”分成了上下两部分,中轨到上轨为强势区,中轨到下轨为弱势区。

那布带林线怎么计算呢?

  • 中轨:周期 N 日的移动平均线
  • 上轨:中轨 + 俩倍的标准差
  • 下轨:中轨 - 俩倍的标准差

股价基本都是围绕着中轨运动,并且在大部分时间股价都运行在布林带的上轨和下轨之间,小部分时间里,股价会“跑”到布林带外面去。

  • 当股价处于中轨以上、上轨以下,说明投资者对其看好,预计还会涨,持有或者买入

  • 当股价处于中轨以下、下轨以上,说明投资者对其看坏,预计还会跌,卖出或者不买

布带林的作用:

一、可以指示超买和超卖:

  • 超买就意味着买多了,买多了,股民就需要进行卖出。可以观察到,当股价突破上轨的时候表示超买,此时极有可能回调。
  • 另一方面,当股价跌落到下轨之下的时候,那么这个时候表示超卖,超卖就是卖多了,此时极有可能出现反转,有原来的下跌转变为上涨。

二、指示趋势

中轨作为一个重要的指标,可以用来指示趋势。当中轨往上运行的时候,表示市场是一个逐渐上涨的趋势。

同样的当中轨是朝下运行的时候,意味着现在是一个下跌趋势。

特别要说明的是,当股价运行在中轨和下轨之间,并且中轨是向下运行的时候,表明市场是一个非常疲软的趋势。在这样的情况下,要特别注意交易当中存在的风险。因为在这样的情况下进行股票的买入有极大的风险,可能导致较大亏损。

三、指示通道作用

当看到股价涨跌幅度加大时,布林带的带状区会变宽,表明新一波行情的到来;当股价涨跌幅度变小的时候,那么带状区域就会逐步变窄,表明现在进入盘整当中。


 


以上是关于量化交易之QT篇 - TQZButton - 自定义按钮的主要内容,如果未能解决你的问题,请参考以下文章

量化交易之通用因子

量化交易之通用因子

量化交易之单因子策略

量化交易之多因子策略

量化交易之单因子策略

量化交易之多因子策略