特殊相対性理論の光とロケットを使った時間のおかしな話

インターネットで特殊相対性理論の話を見たのですが、おかしな話だと思うんですけどね。(^^;

今回も、私の視点から考えてみたいと思います。

今回は、次の話の続きです。
1.一体時間とは何なのか?時間は止まるのか?


大きすぎるロケットですが、ロケットに付いている窓の高さが30万Km、ロケットの奥行きが144万Km、ロケットの速度が15万Km/秒、光の速度は30万Km/秒とします。
インターネットから伝わる話によると、ロケットから光を発したとき、次のように光が動くらしいのです。


元々光があった位置を白で表すと、光は図の様に動いたことに成ります。
これは、ロケットの移動速度に光が影響されていることを示し、光は上へ30万Km/秒、横へ15万Km/秒で移動しているということになります。


光の移動速度は30万Km/秒なので、次のように光が天井へ到達する時間が掛かることになります。

33.54万Km÷30万Km=1.118秒


実は、ロケットの中で起きていることは、地球では少し送れて見えます。


例えば、ロケットと地球で時計の時間を合わせたとします。
ロケットで12:00分00秒に赤い旗を上げたとします。

ロケットと地球上の人までの距離が30万Kmだったとすると、赤い旗の光が地球にいる人へ届くまで1秒掛かります。

つまり、地球上では12:00分01秒後に赤い旗が建つという事が分かります。

通常、色は物体が吸収せずに反射した色が人の目へ入射することにより色を識別します。
つまり旗へ光が当たり、旗が反射する赤色の光が人の目へ入ることにより、赤い旗だと認識するということです。

この赤い光も同じ光なので、30万Km先の人へ赤い光が届くまでの時間は1秒。

つまり、ロケットの中で赤い旗を建て、1秒後に地球上の人は赤い旗が建ったと気づきます。

特殊相対性理論では時間が遅れるという話ですが、私はそう思いません。(^^;

インターネットの話でも学問であっても、どこまでが事実なのか分からないのですが、間違いが含まれているかもしれませんので、一意見として注意しながら情報を捉えてください。

以上。

確率通りになるまでの試行回数、パチンコ・パチスロ・投資の統計的確率

投資ではボリンジャーバンド、賭け事ではパチスロのボーナス確率等、賭け引きをする上で確率を扱うことが多いと思います。
大雑把ですが確率を算出するプログラムを作りましたので、賭け事や投資をする上で避けて通ることが出来ない確率について調べたいと思います。

例えば、パチスロでBIGボーナスの確率が300分の1だとします。
実際、1000回転させても300分の1にはなり難いことを証明したいと思います。

実は確率には2つの種類があります。
1つは必ず確率通りに当選する確率、もう1つは確率通りに当選しない確率です。
#これらには名前が付いていたはずですが、インターネットで探したけど見つかりませんでした。


これは4個の中に必ず1つの当たりがある確率で、4分の1です。
4個引くと必ず当たりが出ますが、当たりは1つしかありません。


サイコロを使用し1を当たりとして抽選すると、6個中1個に当たりがあるので、6分の1です。
この場合、6回転がしても1が出ない場合があったり、6回とも1になることがあります。

パチスロはサイコロと同じ原理で、レバーを押す度に役を抽選しています。
以前調べた情報によりますと、「ノーマル機でボーナスの確率が300分の1ならば、レバーを押す度に300分の1でボーナスを抽選する」と聞いています。

では、サイコロの様に抽選し、300分の1の統計的確率になるまで、どれぐらいレバーを押したらいいか検証してみましょう。
検証には、メルセンヌ・ツイスタ ライブラリによる乱数から、統計的確率算出したいと思います。

※理論的確率 前述したくじやサイコロの様な数学的に算出した確率を理論的確率といいます。
※統計的確率 実際サイコロを振り、出現数から算出した確率を統計的確率といいます。

ソースコード
2021-02-43.cpp
 
上記のプログラムにより簡単なテストをし、次のような結果が出ました。

試行回数 当選数 試行結果 統計的確率 ファイル
1000回転×10回 BIG=2, 1, 3, 2, 2, 5, 0, 0, 5, 1
REG=4, 4, 1, 2, 3, 4, 5, 3, 5, 3
BIG=21
REG=34
BIG=1/476
REG=1/294
2021-02-45
1万回転×10回 BIG=39, 34, 20, 39, 30, 30, 40, 20, 29, 30
REG=56, 49, 49, 51, 49, 43, 40, 50, 60, 41
BIG=311
REG=488
BIG=1/321
REG=1/204
2021-02-46
10万回転×10回 BIG=329, 349, 352, 371, 329, 358, 336, 336, 357, 358

REG=520, 561, 515, 515, 490, 546, 505, 486, 477, 513

BIG=3475
REG=5128
BIG=1/287
REG=1/195
2021-02-47
50万回転×10回 BIG=1686, 1708, 1709, 1707, 1733, 1647, 1661, 1743, 1682, 1663

REG=2476, 2572, 2528, 2536, 2469, 2448, 2561, 2440, 2566, 2494

BIG=16939
REG=25090
BIG=1/295
REG=1/199
2021-02-48
100万回転×10回 BIG=3400, 3287, 3434, 3329, 3398, 3334, 3425, 3384, 3337, 3284

REG=4977, 5077, 4824, 5076, 4963, 4972, 5091, 4935, 5143, 4956

BIG=33612
REG=50014
BIG=1/297
REG=1/199
2021-02-49

※4号機、ノーマルAタイプで仮定して試行。
※BIGは300分の1で当選。
※REGは200分の1で当選。
※回転数×10回を10回試行し、BIGとREGの理論的確率と統計的確率の差が最も大きい試行結果を載せています。

大雑把な計算ですが、300分の1、200分の1といった理論的確率に近くなる試行回数(回転数)は、図の様になります。
10万回転×10回で、BIGとREGの確率と統計的確率の分母が13前後違う。
50万回転×10回で、BIGとREGの確率と統計的確率の分母が5前後違う。
100万回転×10回で、BIGとREGの確率と統計的確率の分母が3前後違う。

このように、300分の1で500万回~1000万回程試行しなければ、理論的確率と統計的確率の間に大きな誤差が生じます。
つまり、1000回程度ならば300分の1になり難いということです。

今回は、メルセンヌ・ツイスタ ライブラリを使用して出た結果なので、このライブラリを使用することにより、統計的確率が理論的確率通りになるかを試したに過ぎません。
ですが、基本的には相当な回数試行しなければ、統計的な確率と理論的な確率は近い数値にならないと思います。(^^;

以上

2021-02-43.cpp

これは、確率から統計的な確率を生成するプログラムですのソースコードです。

確率通りになるまでの試行回数、パチンコ・パチスロ・投資の統計的確率」で使用しています。

 



/*
実行には、別途メルセンヌ・ツイスタ ライブラリが必要です。
次のファイル必須
	SFMT-alti.h
	SFMT-common.h
	SFMT-neon.h
	SFMT-params.h
	SFMT-params11213.h
	SFMT-params1279.h
	SFMT-params132049.h
	SFMT-params19937.h
	SFMT-params216091.h
	SFMT-params2281.h
	SFMT-params4253.h
	SFMT-params44497.h
	SFMT-params607.h
	SFMT-params86243.h
	SFMT-sse2-msc.h
	SFMT-sse2.h
	SFMT.c
	SFMT.h

*/
#include 

#include "SFMT.h"

HINSTANCE	s_hInstanceHandle	=NULL;
LPSTR		s_lpWindowClassName	="SimpleWindow2020";

// 1/300で195が出たらBIGに当選。
LPSTR		s_lpBigDenominator="300";
// 1/200で188が出たらREGに当選。
LPSTR		s_lpRegDenominator="200";
// 試行回数
LPSTR		s_lpNumTry="10000";

typedef struct __BONUS{
	DWORD	dwNumBonus;
	DWORD	dwDenominator, dwMolecules;
}BONUS, *LPBONUS;

#define	ID_ADD		100
#define	ID_CLEAR	101
#define	ID_COPY		102
#define	ID_BIG		103
#define	ID_REG		104
#define	ID_TRY		105
#define	ID_EDIT		106

// dwDenominator:	分母
// dwMolecules:		分子
inline void InitBonus(LPBONUS lpBonus, DWORD dwDenominator, DWORD dwMolecules)
{
	lpBonus->dwNumBonus			=0;
	lpBonus->dwDenominator		=dwDenominator;
	lpBonus->dwMolecules		=dwMolecules;
}
inline BOOL LoteryBonus(LPBONUS lpBonus, DWORD dwLottery)
{
	if((dwLottery%
		lpBonus->dwDenominator)==lpBonus->dwMolecules)
	{
		lpBonus->dwNumBonus++;
		return TRUE;	// 当選
	}
	return FALSE;
}




typedef struct __DATA{
	BONUS	big;
	BONUS	reg;
}DATA, *LPDATA;

typedef struct __SIMPLEWINDOWINFO{
	HWND	hWnd;
	HWND	hAdd;
	HWND	hCopy;
	HWND	hClear;
	HWND	hBig;
	HWND	hReg;
	HWND	hTry;
	HWND	hEdit;

	LPDATA	lpData;
	DWORD	dwNumData;
	LPSTR	lpTextBuffer;
	LPBYTE	lpBuffer;
}SIMPLEWINDOWINFO, *LPSIMPLEWINDOWINFO;
#define	MAXDATA			1000
#define	MAXTEXTBUFFER	MAXDATA*200


HRESULT	AllocAllData(LPSIMPLEWINDOWINFO lpInfo)
{
	DWORD	dwDataSize;

	dwDataSize=MAXDATA*sizeof(DATA);
	lpInfo->lpBuffer=new BYTE[dwDataSize+MAXTEXTBUFFER];
	if(lpInfo->lpBuffer==NULL)
		return E_OUTOFMEMORY;

	LPBYTE	lpBuffer;
	lpBuffer=lpInfo->lpBuffer;

	lpInfo->lpData		=(LPDATA)lpBuffer;
	lpBuffer+=dwDataSize;

	lpInfo->lpTextBuffer=(LPSTR)lpBuffer;

	return S_OK;
}

HRESULT	FreeAllData(LPSIMPLEWINDOWINFO lpInfo)
{
	if(lpInfo->lpBuffer!=NULL)
	{
		delete lpInfo->lpBuffer;
		lpInfo->lpBuffer=NULL;
	}
	lpInfo->lpData			=NULL;
	lpInfo->lpTextBuffer	=NULL;
	return S_OK;
}

HRESULT	DestroyClientWindows(LPSIMPLEWINDOWINFO lpInfo)
{
	if(lpInfo->hAdd!=NULL)
	{
		DestroyWindow(lpInfo->hAdd);
	}
	if(lpInfo->hCopy!=NULL)
	{
		DestroyWindow(lpInfo->hCopy);
	}
	if(lpInfo->hClear!=NULL)
	{
		DestroyWindow(lpInfo->hClear);
	}
	if(lpInfo->hBig!=NULL)
	{
		DestroyWindow(lpInfo->hBig);
	}
	if(lpInfo->hReg!=NULL)
	{
		DestroyWindow(lpInfo->hReg);
	}
	if(lpInfo->hTry!=NULL)
	{
		DestroyWindow(lpInfo->hTry);
	}
	if(lpInfo->hEdit!=NULL)
	{
		DestroyWindow(lpInfo->hEdit);
	}

	ZeroMemory(lpInfo, sizeof(*lpInfo));
	return S_OK;
}

HRESULT AddData(HWND hWnd, LPSIMPLEWINDOWINFO lpInfo)
{
	if(lpInfo->dwNumData>=MAXDATA)
	{
		return E_FAIL;
	}

	LONG	lBig, lReg, lTry;
	lBig=GetDlgItemInt(hWnd, ID_BIG, NULL, NULL);
	lReg=GetDlgItemInt(hWnd, ID_REG, NULL, NULL);
	lTry=GetDlgItemInt(hWnd, ID_TRY, NULL, NULL);
	if(lBig<1)
		lBig=1;
	if(lReg<1)
		lReg=1;
	if(lTry<1)
		lTry=1;

	sfmt_t	sfmt;
	sfmt_init_gen_rand(&sfmt, GetTickCount());

	LONG	i;
	DWORD	lottery;
	BONUS	big, reg;

	InitBonus(&big, lBig, lBig*2/7);
	InitBonus(&reg, lReg, lReg*3/4);

	for(i=0; i<lTry; i++) { lottery=(DWORD)sfmt_genrand_uint32(&sfmt); if(LoteryBonus(&big, lottery) || LoteryBonus(&reg, lottery)) {// ボーナスを同時に当選しない continue; } } CopyMemory(&lpInfo->lpData[lpInfo->dwNumData].big, &big, sizeof(big));
	CopyMemory(&lpInfo->lpData[lpInfo->dwNumData].reg, &reg, sizeof(reg));
	lpInfo->dwNumData++;

	// ----- reset
	LPSTR	lpTextBuffer;
	DWORD	dwNumData, dwNumBigs, dwNumRegs;
	LPDATA	lpData;

	lpTextBuffer=lpInfo->lpTextBuffer;
	dwNumData	=lpInfo->dwNumData;
	lpData		=lpInfo->lpData;

	wsprintf(lpTextBuffer
				, "回数 %d\r\n"
				"総試行回数 %d\r\n"
				, dwNumData
				, lTry*dwNumData
				);
	lpTextBuffer+=strlen(lpTextBuffer);

	dwNumBigs	=0;
	dwNumRegs	=0;
	strcpy(lpTextBuffer, "----- 各当選数 -----\r\n"
						"BIG=");
	lpTextBuffer+=strlen(lpTextBuffer);
	for(i=0; i<(LONG)dwNumData; i++)
	{
		dwNumBigs	+=lpData[i].big.dwNumBonus;
		if(i)
			wsprintf(lpTextBuffer, ", %d", lpData[i].big.dwNumBonus);
		else
			wsprintf(lpTextBuffer, "%d", lpData[i].big.dwNumBonus);
		lpTextBuffer+=strlen(lpTextBuffer);
	}

	strcpy(lpTextBuffer, "\r\nREG=");
	lpTextBuffer+=strlen(lpTextBuffer);
	for(i=0; i<(LONG)dwNumData; i++) { dwNumRegs +=lpData[i].reg.dwNumBonus; if(i) wsprintf(lpTextBuffer, ", %d", lpData[i].reg.dwNumBonus); else wsprintf(lpTextBuffer, "%d", lpData[i].reg.dwNumBonus); lpTextBuffer+=strlen(lpTextBuffer); } strcpy(lpTextBuffer, "\r\n"); lpTextBuffer+=strlen(lpTextBuffer); DWORD dwBigDenominator, dwRegDenominator; DWORD dwBigMolecules, dwRegMolecules; if(dwNumBigs>0)
	{
		dwBigDenominator	=lTry*dwNumData/dwNumBigs;
		dwBigMolecules		=1;
	}
	else
	{
		dwBigDenominator	=lTry;
		dwBigMolecules		=0;
	}
	if(dwNumRegs>0)
	{
		dwRegDenominator	=lTry*dwNumData/dwNumRegs;
		dwRegMolecules		=1;
	}
	else
	{
		dwRegDenominator	=lTry;
		dwRegMolecules		=0;
	}
	wsprintf(lpTextBuffer
					, "----- 合計 -----\r\n"
					"BIG=%d\r\n"
					"REG=%d\r\n"
					"----- 試行による統計的確率 -----\r\n"
					"BIG=%d/%d\r\n"
					"REG=%d/%d\r\n"
					, dwNumBigs
					, dwNumRegs
					, dwBigMolecules
					, dwBigDenominator
					, dwRegMolecules
					, dwRegDenominator
					);
	lpTextBuffer+=strlen(lpTextBuffer);


	::SetWindowText(lpInfo->hEdit, lpInfo->lpTextBuffer);
	return S_OK;
}


void ClearData(LPSIMPLEWINDOWINFO lpInfo)
{
	lpInfo->dwNumData=0;
	if(lpInfo->hEdit!=NULL)
		::SetWindowText(lpInfo->hEdit,"");
}



//	ウィンドウプロシージャ
LRESULT	CALLBACK LoterryWndProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
	LPSIMPLEWINDOWINFO	lpInfo;
	lpInfo=(LPSIMPLEWINDOWINFO)GetWindowLongPtr(hWnd, 0);
	if(lpInfo==NULL
		|| lpInfo->hWnd==NULL)
	{
		switch(nMessage){
		case WM_CREATE:
			{
				LPCREATESTRUCT	lpcs=(LPCREATESTRUCT)lParam;

				lpInfo=(LPSIMPLEWINDOWINFO)lpcs->lpCreateParams;
				if(lpInfo==NULL)
					return -1;
				SetWindowLongPtr(hWnd, 0, (LONG_PTR)lpInfo);	// こちらの方が将来的に安全
				lpInfo->hWnd=hWnd;
				if(DefWindowProc(hWnd, nMessage, wParam, lParam)!=0)
				{
					DestroyClientWindows(lpInfo);
					return -1;
				}

				RECT	rClient;
				GetClientRect(hWnd, &rClient);

				lpInfo->hAdd=CreateWindowEx(
									0, "BUTTON", "Add"
									, WS_VISIBLE|WS_CHILD| BS_PUSHBUTTON
									, 0, 0, 100, 32, hWnd
									, (HMENU)ID_ADD, s_hInstanceHandle, NULL);
				lpInfo->hCopy=CreateWindowEx(
									0, "BUTTON", "Copy"
									, WS_VISIBLE|WS_CHILD| BS_PUSHBUTTON
									, 100, 0, 100, 32, hWnd
									, (HMENU)ID_COPY, s_hInstanceHandle, NULL);
				lpInfo->hClear=CreateWindowEx(
									0, "BUTTON", "Clear"
									, WS_VISIBLE|WS_CHILD| BS_PUSHBUTTON
									, 200, 0, 100, 32, hWnd
									, (HMENU)ID_CLEAR, s_hInstanceHandle, NULL);

				lpInfo->hBig=CreateWindowEx(
									WS_EX_CLIENTEDGE, "EDIT", s_lpBigDenominator
									, WS_VISIBLE|WS_CHILD| ES_NUMBER
									, 300, 0, 100, 32, hWnd
									, (HMENU)ID_BIG, s_hInstanceHandle, NULL);
				lpInfo->hReg=CreateWindowEx(
									WS_EX_CLIENTEDGE, "EDIT", s_lpRegDenominator
									, WS_VISIBLE|WS_CHILD| ES_NUMBER
									, 400, 0, 100, 32, hWnd
									, (HMENU)ID_REG, s_hInstanceHandle, NULL);
				lpInfo->hTry=CreateWindowEx(
									WS_EX_CLIENTEDGE, "EDIT", s_lpNumTry
									, WS_VISIBLE|WS_CHILD| ES_NUMBER
									, 500, 0, 100, 32, hWnd
									, (HMENU)ID_TRY, s_hInstanceHandle, NULL);


				rClient.top+=32;
				lpInfo->hEdit=CreateWindowEx(
									WS_EX_CLIENTEDGE, "EDIT", NULL
									, WS_VISIBLE|WS_CHILD| ES_MULTILINE| ES_WANTRETURN| ES_AUTOHSCROLL| ES_AUTOVSCROLL| WS_HSCROLL| WS_VSCROLL
									, rClient.left, rClient.top, rClient.right-rClient.left, rClient.bottom-rClient.top, hWnd
									, (HMENU)ID_EDIT, s_hInstanceHandle, NULL);


				RECT	rWindow;
				LONG	cx, cy;
				GetWindowRect(hWnd, &rWindow);
				cx=rWindow.right-rWindow.left;
				cy=rWindow.bottom-rWindow.top;
				::SetWindowPos(hWnd, NULL
								, GetSystemMetrics(SM_CXSCREEN)/2-cx/2
								, GetSystemMetrics(SM_CYSCREEN)/2-cy/2
								, cx, cy
								, 0
								);

				return 0L;
			}
		};
		return DefWindowProc(hWnd, nMessage, wParam, lParam);
	}
	else
	{
		switch(nMessage){
		case WM_DESTROY:
			{
       			LRESULT returncode;
				DestroyClientWindows(lpInfo);
				returncode=DefWindowProc(hWnd, nMessage, wParam, lParam);
       			lpInfo->hWnd=NULL;
				PostQuitMessage(0);
				return returncode;
			}
		case WM_COMMAND:
			switch(LOWORD(wParam)){
			case ID_ADD:
				if(HIWORD(wParam)==BN_CLICKED)
				{
					AddData(hWnd, lpInfo);
				}
				break;
			case ID_COPY:
				::SendMessage(lpInfo->hEdit, EM_SETSEL, 0L, -1);
				::SendMessage(lpInfo->hEdit, WM_COPY, 0L, 0L);
				break;
			case ID_CLEAR:
				if(HIWORD(wParam)==BN_CLICKED)
				{
					ClearData(lpInfo);
				}
				break;
			};
			return DefWindowProc(hWnd, nMessage, wParam, lParam);

		case WM_SIZE:
			switch(wParam){
			case SIZE_MINIMIZED:
				break;
			default:
				{
					RECT	rClient;
					GetClientRect(hWnd, &rClient);

					::SetWindowPos(lpInfo->hAdd, NULL
									, 0, 0, 100, 32, 0);
					::SetWindowPos(lpInfo->hCopy, NULL
									, 100, 0, 100, 32, 0);
					::SetWindowPos(lpInfo->hClear, NULL
									, 200, 0, 100, 32, 0);
					::SetWindowPos(lpInfo->hBig, NULL
									, 300, 0, 100, 32, 0);
					::SetWindowPos(lpInfo->hReg, NULL
									, 400, 0, 100, 32, 0);
					::SetWindowPos(lpInfo->hTry, NULL
									, 500, 0, 100, 32, 0);

					rClient.top+=32;
					::SetWindowPos(lpInfo->hEdit, NULL
									, rClient.left, rClient.top
									, rClient.right-rClient.left
									, rClient.bottom-rClient.top
									, 0);

				}
				break;
			};
			return 0L;

		};
		return DefWindowProc(hWnd, nMessage, wParam, lParam);
	}

}




BOOL RegisterWindowClass(HINSTANCE hInstance)
{
	s_hInstanceHandle=hInstance;
	//	-------- ウィンドウクラスの登録 ---------
	WNDCLASSEX	wc;					// ウィンドウクラス構造体
	ZeroMemory(&wc, sizeof(wc));
	wc.cbSize		=sizeof(wc);
	wc.cbClsExtra	=0;
	wc.cbWndExtra	=sizeof(SIMPLEWINDOWINFO*);	// 補足ウィンドウメモリ
	wc.hInstance	=hInstance;
	wc.hIcon		=NULL;
	wc.hCursor		=NULL;
	wc.lpszMenuName	=NULL;					// メニューリソース名
	wc.hIconSm		=NULL;

	// ------- 通常のウィンドウ(ネズミ色) -------
	wc.style		=CS_HREDRAW|CS_VREDRAW;
	wc.lpszClassName=s_lpWindowClassName;
	wc.lpfnWndProc	=LoterryWndProc;
	wc.hbrBackground=(HBRUSH)GetStockObject(LTGRAY_BRUSH);
	if(!RegisterClassEx(&wc))
		return FALSE;

	return TRUE;
}
void UnregisterWindowClass()
{
	UnregisterClass(s_lpWindowClassName, s_hInstanceHandle);
}


HRESULT	MessageLoop(HINSTANCE hInstance)
{
	SIMPLEWINDOWINFO	s_SimpleWindow;
	ZeroMemory(&s_SimpleWindow, sizeof(s_SimpleWindow));
	AllocAllData(&s_SimpleWindow);


	// ----- initialize
	if(!RegisterWindowClass(hInstance))
	{
		FreeAllData(&s_SimpleWindow);
		return 0;
	}


	if(::CreateWindowEx(0, s_lpWindowClassName, "Simple Window"
						, WS_OVERLAPPEDWINDOW| WS_CLIPCHILDREN| WS_VISIBLE|WS_POPUP,
						0, 0, 600, 400, NULL,
						NULL, s_hInstanceHandle, &s_SimpleWindow)==NULL)
	{
		UnregisterWindowClass();
		FreeAllData(&s_SimpleWindow);
		return E_OUTOFMEMORY;
	}

	MSG	msg;
	while(::GetMessage(&msg, NULL,NULL,NULL))
	{
		::TranslateMessage(&msg);
		::DispatchMessage(&msg);
	}
	::TranslateMessage(&msg);
	::DispatchMessage(&msg);


	// ----- release
	UnregisterWindowClass();

	FreeAllData(&s_SimpleWindow);
	return S_OK;
}



int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
					LPSTR lpszCommandLine, int nCmdShow)
{

	MessageLoop(hInstance);

	return 0;
}




原油価格の大暴落と投資先の価格がマイナスになると、殆どの投資家が損する理由

2020年2月頃、世の中ではおかしなことが起きたので、詳しく話したいと思います。

今回は、次の記事に関係するお話です。
1.FXで為替を取引する為の基礎

2020年、原油の価格がマイナスになったと聞きました。
先物取引は価格がマイナスになることがある様ですので気をつけましょう。(^^;
原油先物は外国で会社が倒産しているという話も聞きますし、私は計算がおかしいと思っています。

今回は簡単な数学の話をしたいと思います。
数学を扱う大人の多くは、次のことを知っています。

数値÷0=計算不能

実は、0で割ることはできません。

去年、原油の価格がマイナス40円ぐらいまで暴落しました。
よく計算をする人間から見て、ありえない事が起きてます。(^^;


25$で買った原油が0$になったとします。

0$÷25$=0倍
0倍、つまり0円になりますよね。


では、売る場合(空売り)を考えてみましょう。
25$で売った原油が0$になったとします。

25$÷0$=計算不能
0$で割れませんので、投資の仕組みを考えるとき、0$にならないような工夫が必要です。

プラス圏からマイナス圏へ移った際、これまでの常識が覆ります。


-25$÷25$=-1.0倍
マイナス圏からは、プラス圏で買った人達はマイナスになります。
これは当然ですよね?


25$÷(ー25$)=-1.0倍
マイナス圏からは、何故かプラス圏で売った人までマイナスになります。(^^;

プラス圏から買った人も売った人であっても損が出るのがマイナス圏であり、この時、失われたお金は何処へ行くのか不思議ですよね。
取引所かな? (?_?)

マイナス圏間での取引は、取引結果が逆転します。


-50$÷(-25$)=2倍

買うと価格が上がる買い取引では、何故か価格が下がるとプラスになります。(^^;
ですので、投資により原油の価格を上げようとすると、損をしながら価格を上げなければなりません。


2021-02-26.png
-25$÷(-50$)=0.5倍

売ると価格が下がる売り取引では、何故か価格が下がるとマイナスになります。(^^;

このようにマイナス圏からは取引の法則が崩れてしまうので、0円以下に価格を下げてはならない。
取引を考える側の人たちは、プラス圏(1円以上)に価格が収まるように考えなければなりません。

原油がマイナス価格になったということは、きちんとしたルールが無い可能性が高く、先物取引は大きなリスクを背負う危険な投資先ということになります。

以上

FXで為替を取引する為の基礎

始めに、90%の投資家が損をするという話を聞きます。
投資により生じた損害について私は一切責任を取りませんので、お薦めはしません。(^^;
投資や投機をする場合は、自己責任で、生活に支障をきたさない資産を運用しましょう。

取引には、買う場合と売る場合があります。
取引手数料を省いて、簡単に説明したいと思います。

1.売買
通常、買うと価格が上がり、売ると価格が下がると言われています。
例えば、日本円を売り、米ドルを買うと、日本円の価格が下がり、米ドルの価格が上がると言われています。


今よりも価格が上がる事を期待して買う場合、投資資金の増減は次のような式で計算出来ます。
売った価格÷買った価格=倍率

25$で買って50$で売ると、価格が倍になっているので得します。
50$÷25$=2倍


25$で買って10$で売ると、価格が安くなっているので損します。
10$÷25$=0.4倍


今よりも価格が下がる事を期待して売る事も出来ます。

25$で売って50$で買うと、価格が高くなっているので損します。
25$÷50$=0.5倍


25$で売って10$で買うと、価格が低くなっているので得します
25$÷10$=2.5倍

通常、銀行での取引では買うことしか出来ませんが、FXでは売ることもできます。

2.スワップ
スワップにより毎日金利を支払ったり/受け取ったりすることが出来ます。

買う場合、金利の高いほうを買えば金利がつき、金利の低いほうを買うと金利を取られます。
売る場合、金利の低いほうを売れば金利がつき、金利の高いほうを売ると金利を取られます。

例えば、日本の金利が0.1で、米国の金利が1.2の場合、日本円を売って米ドルを買うと金利が付きます。
逆に、米ドルを売って日本円を買うと金利を取られます。

例えば、日本の金利が0.1で、スイスの金利が-1.0の場合、日本円を売ってスイスフランを買うと金利を取られます。
逆に、スイスフランを売って日本円を買うと金利が付きます。

3.レバレッジ
レバレッジと言って、皆さんが持っている資金に対して、最大??倍まで投資することが出来ます。

例えば、レバレッジが25倍の場合、皆さんが10万円を預けているとすると、250万円まで投資することが出来ると思います。
ただし、あまりレバレッジを上げて投資すると、少し逆行した場合に含み損が膨らみロスカットにより強制的に決済されます。


例えば、10万円を預けて100万円投資すると、レバレッジ10倍で投資していることになります。
1ドル100円の米ドルを100万円分購入したとします。
すると、1万ドル持っていることになります。

1ドル110円になった場合に換金すると、1万ドル×110円=110万円になります。
100万円を投資して110万円になったのだから、10万円プラスになったということになります。

しかし、90円に下がるとどうなるでしょう?
預けている資金10万円に対して、100万円から90万円まで減っているのですから、預けている資金が無くなってしまいます。

ですので、レバレッジ10倍で取引をする場合、10%上がると預けている資金が倍になり、10%下がると預けている資金が無くなります。


私は図の様に計算しています。

2倍のレバレッジで購入し、購入したときよりも価格が50%下がると総資産を失う。
5倍のレバレッジで購入し、購入したときよりも価格が20%下がると総資産を失う。
10倍のレバレッジで購入し、購入したときよりも価格が10%下がると総資産を失う。
20倍のレバレッジで購入し、購入したときよりも価格が5%下がると総資産を失う。
25倍のレバレッジで購入し、購入したときよりも価格が4%下がると総資産を失う。

実際、このパーセンテージ下がる前に、資産がマイナスにならない様に強制決済(ロスカット)すると思います。
#ただし、「マイナスになることもある」と聞いた事があります。

100万円を預けているとして、各パーセンテージでゼロ円になるか、例を挙げてみましょう。

2倍のレバレッジを使用し、50%下がった場合
  1ドル=100円の時、200万円で2万ドル買う。
  1ドル=50円の時、2万ドルを売ると100万になり総資産を失う。
  200万円ー100万円=-100万円

5倍のレバレッジを使用し、20%下がった場合
  1ドル=100円の時、500万円で5万ドル買う。
  1ドル=80円の時、5万ドルを売ると400万になり総資産を失う。
  500万円ー400万円=-100万円

10倍のレバレッジを使用し、10%下がった場合
  1ドル=100円の時、1000万円で10万ドル買う。
  1ドル=90円の時、10万ドルを売ると900万になり総資産を失う。
  1000万円ー900万円=-100万円

20倍のレバレッジを使用し、5%下がった場合
  1ドル=100円の時、2000万円で20万ドル買う。
  1ドル=95円の時、20万ドルを売ると1900万になり総資産を失う。
  2000万円ー1900万円=-100万円

さて、レバレッジと0円になるパーセンテージを掛けると、100%になることが分かります。
つまり、次の式が成り立ちます。
  レバレッジ×0円になるまでのパーセンテージ=100
  レバレッジ=100÷0円になるまでのパーセンテージ
  0円になるまでのパーセンテージ=100÷レバレッジ


2.5倍のレバレッジから、0円になるまでのパーセンテージを算出したいと思います。
40%=100÷2.5

100万円の元手に対し、レバレッジ2.5倍で250万円を投資し、40%価格が下がったときを試してみましょう。
1ドル=100円の時、250万円で2.5万ドル買う。
1ドル=60円の時、2.5万ドルを売ると150万になる。
250万円ー150万円=-100万円

ただし、手数料があるので多少誤差があります。

極度に倍率を上げる無理な投資は資産を失うことに繋がりますので、お勧めしません。

4.投資と投機の違い

株を買うとして、現在の価格よりも価値があるものだと思って長期的に保有することが投資。
短期的に、現在の価格よりも上がるか下がるかを考えて売買するのが投機。

Youtubeを見ていると、短期的な売買方法を説明している動画が多いと思います。
これらの多くは、スキャルピング、デイトレード、スイングトレード等、これから価格が上がるか、下がるかを考える投機的な売買方法ですね。

以上