打印

概率学计算问题

[复制链接]
楼主: lfc315
手机看帖
扫描二维码
随时随地手机跟帖
81
lfc315|  楼主 | 2015-3-16 17:21 | 只看该作者 回帖奖励 |倒序浏览
lanmp 发表于 2015-3-15 00:23
服了,几天没看,这帖子居然变成这样了。难道电工们不都是理科生么?这高中概率问题还有不懂得?
什么叫预 ...

好像也挺有道理的

使用特权

评论回复
82
lxyppc| | 2015-3-18 21:09 | 只看该作者
想了下,可以用代码模拟一下,结果如下
success_cnt:7722  fail_cnt:2278 result:0.7722

#include <vector>
#include <algorithm>
#include <time.h>
#include <iostream>
using namespace std;
//有一个市场有M只股票,每天涨跌情况随机
struct market:vector<bool>{
    market(int M):vector<bool>(M){ srand( (unsigned int)time(0)); }
    void newday(){ for(size_t i=0;i<size();++i) at(i) = (rand()&1) == 1;}
};
// 现在有三个预测软件,预测概率和样本数由构造函数决定
struct select : vector<int>{
    select(float ratio, int sample):ratio(ratio),sample(sample),vector<int>(sample){}
    // 从市场中选股票,并满足概率要求
    vector<int> pick(const market& mkt, int n = 10){
        int success_sample = sample * ratio;        // 成功股票数
        int fail_sample = sample - success_sample;  // 失败股票数
        vector<int> success;
        vector<int> fail;
        for(size_t i=0;i<mkt.size();++i){
            mkt? success.push_back(i):fail.push_back(i);
        }
        // 打乱成功的股票
        random_shuffle(success.begin(), success.end());
        // 打乱失败的股票
        random_shuffle(fail.begin(), fail.end());
        // 根据概率选择成功失败的股票个数
        success.resize(success_sample);
        fail.resize(fail_sample);
        // 构造结果
        vector<int> r(success);
        r.insert(r.end(), fail.begin(), fail.end());
        // 至此,结果中的股票随机且成功率满足预设要求
        // 打乱结果
        random_shuffle(r.begin(), r.end());
        r.resize(n);
        return r;
    }
    float ratio;
    int sample;
};

int main(int argc, char *argv[])
{
    // 一个有1000只股票的市场
    market mkt(1000);
    // 一个成功率0.55, 500个样本的选择器
    select s55(0.55, 500);
    select s60(0.60, 500); // 成功率0.60
    select s65(0.65, 500); // 成功率0.65
    int success_cnt = 0;
    int fail_cnt = 0;
    // 测试100天
    for(int i=0;i<1000;i++){
        mkt.newday();
        vector<int > r55 = s55.pick(mkt, 400); // 得到其预测的400只股
        vector<int > r60 = s60.pick(mkt, 400); // 得到其预测的400只股
        vector<int > r65 = s65.pick(mkt, 400); // 得到其预测的400只股
        sort(r55.begin(), r55.end());
        sort(r60.begin(), r60.end());
        sort(r65.begin(), r65.end());
        vector<int> r1(400), r2(400);
        vector<int>::iterator it;
        it = set_intersection(r55.begin(), r55.end(), r60.begin(), r60.end(), r1.begin());
        r1.erase(it, r1.end());
        it = set_intersection(r1.begin(), r1.end(), r65.begin(), r65.end(), r2.begin());
        r2.erase(it, r2.end());
        // 得到综合预测结果,随机选择其中的10只股
        random_shuffle(r2.begin(), r2.end());
        r2.resize(10);
        // 统计成功失败的概率
        for(size_t j=0;j<r2.size();++j){
            mkt[r2[j]] ? success_cnt++ : fail_cnt++;
        }
    }
    cout<<("success_cnt:")<< success_cnt << "  fail_cnt:" << fail_cnt
       << " result:" << (float)success_cnt/(success_cnt+fail_cnt);
}

使用特权

评论回复
83
lfc315|  楼主 | 2015-3-19 09:14 | 只看该作者
lxyppc 发表于 2015-3-18 21:09
想了下,可以用代码模拟一下,结果如下
success_cnt:7722  fail_cnt:2278 result:0.7722

版主好牛

使用特权

评论回复
84
mars4zhu| | 2018-12-12 14:10 | 只看该作者
三年之后我才看到这个有趣的帖子。我来回复一下:这个题目还缺少一个数据。那就是股票的真实涨跌概率p。即经过真实的买卖股票后整个大盘的股票涨跌概率。

考虑极端情况,假如是大牛市,所有的股票全部上涨,那么预测系统预测上涨的股票数分别为55%,60%,65%,预测下跌的股票数为45%,40%,35%(预测失败),或者预测系统对某一只特定的股票重复独立预测N次,预测上涨的次数为55%,60%,65%。预测下跌的次数占比为45%,40%,34%。
这种情况下,买3个系统都预测上涨的股票是绝对会上涨的,成功率100%,
PS:即使买3个预测系统都预测下跌的股票,一样会上涨,因为三个系统都预测失败了,即失败率100%,多头完胜,空头完败,
(真实事件几乎可以参考历年来几次股市大牛的情况,炒股的人不管买啥几乎都赚钱了。还有各路股神之流分析的头头是道好像很有学问的样子)。

反过来同理,如果是大熊市,所有的股票下跌,那么买3个系统都预测上涨的股票,最终真的上涨的概率为0%,因为所有股票都在下跌。多头完败,空头完胜。
(真实情况参考前几年股灾的情况。多少牛X哄哄叱咤风云的股神、证券分析师、基金经理吃瘪了,他们就是这个问题里的预测系统A、B、C)

因此必须给定一个前提,即真实的股票上涨概率p,意味着总数X的股票,无数次实验后发现,平均有P只股票会上涨。
而Q只股票会下跌,R只股票不涨不跌(Q和R是同一个性质,只要不涨,就是非p的集合)。

令:X=P+Q+R。p=P/X; ^p=(Q+R)/X

其中P只股票(这些股票是100%会上涨)通过三个系统都预测上涨的概率为55% * 60% * 65% = 21.45%。78.55%的概率有一个预测系统预测会下跌。
另外的(Q+R)只股票(这些股票是100%不会上涨)都通过三个系统预测上涨的概率为,45% * 40% * 35% = 6.3%

那么我们对所有的股票一共X只进行预测,3个系统都判断上涨的股票数为 21.45%*P + 6.3%*(Q+R)。
我们在这些股票里任选一只股票买入,其中真实上涨的股票数为21.45*P
所以我们成功的概率是   21.45%*P /( (21.45%*P) + 6.3%*(Q+R) )。

代入极端情况,大牛市p=100%, ^p=0%,那么成功的概率是100%
大熊市p=0%,^p=100%,成功的概率为0.
中位数p=50%,成功的概率为 21.45% / (21.45%+6.3%) = 77.3%

楼上最接近的答案是lxyppc大神。就是预设了P=50%。在缺乏数据的前提下,这是一个最合理的预设。





我记得以前有个同样的问题,是关于流感(艾滋病、xxx病毒)检测的。题目就是根据历年数据经验,某流感的发病率为p,然后检测成功率为q,那么今年流感,有个人检测出了阳性,那么他真的感染了流感的概率为?

这个问题的关键点在于要搞清楚我们需要分析的目标集合,就是那些通过了3个系统都预测上涨的股票数。这里面包括了真实上涨且3个系统都预测成功的股票数,也包括了真实下跌且3个系统都预测失败的股票数。然后在反推这两种股票数的计算方式。思路搞清楚了,计算这些就是基本的概率论概念了。问题的理论基础是跟贝叶斯公式、先验概率、后验概率等概念。

举一个简单的例子:一口袋里有3只红球、2只白球,采用不放回方式摸取,求:
⑴ 第一次摸到红球(记作A)的概率;
⑵ 第二次摸到红球(记作B)的概率;
⑶ 已知第二次摸到了红球,求第一次摸到的是红球的概率。
解:⑴ P(A)=3/5,这就是验前概率;
⑵ P(B)=P(A)P(B|A)+P(A逆)P(B|A逆)=3/5
⑶ P(A|B)=P(A)P(B|A)/P(B)=1/2,这就是验后概率。


使用特权

评论回复
85
mars4zhu| | 2018-12-12 15:05 | 只看该作者

其中:
        第一次摸到红球 = 股票真实上涨。

        第二次摸到红球,= 预测系统预测上涨。

第二次摸到红球,包括第一次摸到红球 且 第二次也摸到红球,也包括第一次摸到白球 且 第二次摸到红球。

预测系统预测上涨 包括 股票真实上涨 且 预测系统预测上涨,也包括 股票真实下跌 且 预测系统预测上涨

这一下就一目了然了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则